public void PlayBlend(string clipName, BlendDirection direction = BlendDirection.Down, int fadeFrame = 0)
    {
        if (animationClips == null)
        {
            return;
        }
        if (string.IsNullOrEmpty(clipName))
        {
            mBlendAnimationClip = null;

            return;
        }
        if (mBlendAnimationClip != null && mBlendAnimationClip.Name == clipName)
        {
            return;
        }
        blendDirection = direction;

        mBlendAnimationClip = animationClips.Find(x => x.Name == clipName);
        if (mBlendAnimationClip != null)
        {
            mBlendAnimationClip.Reset(this, 0);
            mBlendBeginAt   = mBlendAnimationClip.CurrentFrame;
            mBlendFadeFrame = Mathf.Clamp(fadeFrame, 0, mBlendAnimationClip.FrameCount / 2);
            mBlendEnd       = false;
            mBlendBegin     = true;
        }
    }
Esempio n. 2
0
    public GpuInstancedAnimationClip Clone()
    {
        GpuInstancedAnimationClip clip = new GpuInstancedAnimationClip(Name, StartFrame, EndFrame, FrameCount, wrapMode);

        clip.Reset(null, 0);
        return(clip);
    }
    public void Play(string clipName, int offsetFrame = 0, int fadeFrame = 0)
    {
        if (animationClips == null)
        {
            return;
        }
        if (mCurrentAnimationClip != null && mCurrentAnimationClip.Name == clipName)
        {
            if (mCurrentAnimationClip.CurrentFrame == 0 && mCurrentAnimationClip.wrapMode == GpuInstancedAnimationClip.WrapMode.Once)
            {
                mCurrentAnimationClip.Reset(this, offsetFrame);
                mFadeFrame   = Mathf.Clamp(fadeFrame, 0, mCurrentAnimationClip.FrameCount);
                mFadeEnd     = false;
                mFadeBeginAt = mCurrentAnimationClip.CurrentFrame;
            }
            return;
        }

        mPreviousAnimationClip = mCurrentAnimationClip;

        mCurrentAnimationClip = animationClips.Find((x) => x.Name == clipName);

        PlayBlend(null);

        if (mCurrentAnimationClip != null)
        {
            mCurrentAnimationClip.Reset(this, offsetFrame);

            mFadeFrame   = Mathf.Clamp(fadeFrame, 0, mCurrentAnimationClip.FrameCount / 2);
            mFadeBeginAt = mCurrentAnimationClip.CurrentFrame;
            mFadeBegin   = true;
            mFadeEnd     = false;
        }
    }
Esempio n. 4
0
 void OnAnimationClipBegin(GpuInstancedAnimationClip clip)
 {
     if (clip != null && clip.Name == "attack01")
     {
         if (mEffect == null)
         {
             mEffect = Instantiate(Prefab) as GameObject;
             mEffect.SetActive(true);
         }
         if (mEffect.activeSelf == false)
         {
             mEffect.SetActive(true);
         }
     }
 }
    // Update is called once per frame
    public void OnUpdate()
    {
        if (mCurrentAnimationClip != null)
        {
            if (mCurrentAnimationClip.wrapMode == GpuInstancedAnimationClip.WrapMode.Once)
            {
                if (mCurrentAnimationClip.CurrentFrame >= mCurrentAnimationClip.FrameCount)
                {
                    if (mBlendAnimationClip == null)
                    {
                        Play(defaultAnimationClip, 0, mFadeFrame);
                    }
                }
            }

            mCurrentAnimationClip.Update();
            int currentFrame  = mCurrentAnimationClip.RealFrame;
            int previousFrame = 0;
            if (mPreviousAnimationClip != null)
            {
                mPreviousAnimationClip.Update();

                previousFrame = mPreviousAnimationClip.RealFrame;
            }


            mFadeStrength = 1;
            if (mCurrentAnimationClip != null && mFadeFrame > 0)
            {
                if (mCurrentAnimationClip.wrapMode == GpuInstancedAnimationClip.WrapMode.Once)
                {
                    if (mBlendAnimationClip != null && mFadeEnd == false && mCurrentAnimationClip.CurrentFrame + mFadeFrame >= mCurrentAnimationClip.FrameCount - 1)
                    {
                        mFadeEnd               = true;
                        mFadeBeginAt           = mCurrentAnimationClip.CurrentFrame;
                        mPreviousAnimationClip = mBlendAnimationClip;
                    }
                }

                int offsetFrame = mCurrentAnimationClip.CurrentFrame - mFadeBeginAt;
                if (mFadeFrame > 0 && (mFadeBegin || mFadeEnd) && offsetFrame <= mFadeFrame)
                {
                    mFadeStrength = offsetFrame * 1f / mFadeFrame;
                    if (mFadeBegin)
                    {
                        if (offsetFrame >= mFadeFrame)
                        {
                            mFadeBegin = false;
                        }
                    }
                    if (mFadeEnd)
                    {
                        mFadeStrength = 1 - mFadeStrength;
                    }
                }

                if (mCurrentAnimationClip.wrapMode == GpuInstancedAnimationClip.WrapMode.Once)
                {
                    if (mCurrentAnimationClip.CurrentFrame >= mCurrentAnimationClip.FrameCount - 1)
                    {
                        if (mBlendAnimationClip != null)
                        {
                            mCurrentAnimationClip = mBlendAnimationClip;
                            mBlendAnimationClip   = null;
                        }

                        mPreviousAnimationClip = null;

                        mFadeEnd = false;
                    }
                }
            }
            else
            {
                mFadeEnd     = false;
                mFadeBeginAt = 0;
            }

            int blendFrame = 0;

            mBlendFadeStrength = 1;
            if (mBlendAnimationClip != null)
            {
                if (mBlendAnimationClip != mCurrentAnimationClip &&
                    mBlendAnimationClip != mPreviousAnimationClip)
                {
                    mBlendAnimationClip.Update();
                }
                blendFrame = mBlendAnimationClip.RealFrame;

                if (mBlendAnimationClip.wrapMode == GpuInstancedAnimationClip.WrapMode.Once)
                {
                    if (mBlendEnd == false && mBlendAnimationClip.CurrentFrame + mBlendFadeFrame >= mBlendAnimationClip.FrameCount - 1)
                    {
                        mBlendEnd     = true;
                        mBlendBeginAt = mBlendAnimationClip.CurrentFrame;
                    }
                }

                int offsetFrame = mBlendAnimationClip.CurrentFrame - mBlendBeginAt;
                if (mBlendFadeFrame > 0 && (mBlendBegin || mBlendEnd) && offsetFrame <= mBlendFadeFrame)
                {
                    mBlendFadeStrength = offsetFrame * 1f / mBlendFadeFrame;
                    if (mBlendBegin)
                    {
                        if (offsetFrame >= mBlendFadeFrame)
                        {
                            mBlendBegin = false;
                        }
                    }
                    if (mBlendEnd)
                    {
                        mBlendFadeStrength = 1 - mBlendFadeStrength;
                    }
                }

                if (mBlendAnimationClip.wrapMode == GpuInstancedAnimationClip.WrapMode.Once)
                {
                    if (mBlendAnimationClip.CurrentFrame >= mBlendAnimationClip.FrameCount - 1)
                    {
                        mBlendAnimationClip = null;
                        mBlendEnd           = false;
                    }
                }
            }

            materialPropertyBlock.SetInt("_CurrentFrame", currentFrame);
            materialPropertyBlock.SetInt("_PreviousFrame", previousFrame);
            materialPropertyBlock.SetFloat("_FadeStrength", mFadeStrength);
            materialPropertyBlock.SetInt("_BlendFrame", blendFrame);
            materialPropertyBlock.SetFloat("_BlendFadeStrength", mBlendFadeStrength);
            materialPropertyBlock.SetFloat("_BlendDirection", (int)blendDirection);
        }

        if (isCulling == false)
        {
            Graphics.DrawMesh(mesh, transform.localToWorldMatrix, material, mLayer, null, 0, materialPropertyBlock);
        }
    }
 public void OnAnimationClipEnd(GpuInstancedAnimationClip clip)
 {
     onAnimationClipEnd?.Invoke(clip);
 }
 public void OnAnimationClipUpdate(GpuInstancedAnimationClip clip)
 {
     onAnimationClipUpdate?.Invoke(clip);
 }
 public void OnAnimationClipBegin(GpuInstancedAnimationClip clip)
 {
     onAnimationClipBegin?.Invoke(clip);
 }