Beispiel #1
0
    private void LoadAnimation(string animationName)
    {
        AnimationConfig.Animation animationCfg = ConfigDatabase.DefaultCfg.AnimationConfig.GetAnimation(animationName);
        if (animationCfg == null)
        {
            return;
        }

        if (Avatar.LogAnim)
        {
            avatar.Log(System.String.Format("Load missing animation:{0}", animationName));
        }

        // Check if loaded
        if (avatarAnimCmp[animationCfg.name] != null)
        {
            return;
        }

        // Load the animation
        GameObject animGO = ResourceManager.Instance.LoadAsset <GameObject>(PathUtility.Combine(GameDefines.chrPath, animationCfg.assetName));

        if (animGO == null)
        {
            return;
        }

        // Add all animation clips
        Animation anim = animGO.GetComponent <UnityEngine.Animation>();

        if (anim == null)
        {
            return;
        }

        foreach (AnimationState _animStat in anim)
        {
            avatarAnimCmp.AddClip(_animStat.clip, _animStat.name);

            AnimationState animStat = avatarAnimCmp[_animStat.name];
            animStat.blendMode       = _animStat.blendMode;
            animStat.layer           = _animStat.layer;
            animStat.normalizedSpeed = _animStat.normalizedSpeed;
            animStat.normalizedTime  = _animStat.normalizedTime;
            animStat.speed           = _animStat.speed;
            //animStat.time = _animStat.time;
            animStat.weight   = _animStat.weight;
            animStat.wrapMode = animStat.wrapMode;
        }
    }
Beispiel #2
0
    public bool PlayAnim(string animationName)
    {
        // Get animation config.
        AnimationConfig.Animation animationCfg = ConfigDatabase.DefaultCfg.AnimationConfig.GetAnimation(animationName);
        if (animationCfg == null)
        {
            Debug.LogWarning("Miss animation in config : " + animationName);
            return(false);
        }

        // If current animation is playing, return directly.
        if (playingAnimation != null && playingAnimation.animationName == animationCfg.name && avatarAnimCmp.IsPlaying(animationCfg.name))
        {
            return(true);
        }

        // Stop current animation.
        StopAnim();

        // Load animation
        LoadAnimation(animationName);

        // If has no this animation state, return.
        if (avatarAnimCmp[animationCfg.name] == null)
        {
            Debug.LogWarning("Miss animation  : " + animationCfg.name);
            return(false);
        }

        // New animation data.
        playingAnimation = new PlayingAnim();
        playingAnimation.animationName  = animationCfg.name;
        playingAnimation.animationState = avatarAnimCmp[animationCfg.name];
        playingAnimation.startFrame     = animationCfg.startFrame;
        playingAnimation.endFrame       = animationCfg.endFrame;

        // Set animation speed.
        playingAnimation.Speed = animationCfg.speed;

        // Adjust animation play direction.
        playingAnimation.Speed = Mathf.Abs(playingAnimation.Speed) * (animationCfg.endFrame < animationCfg.startFrame ? -1 : 1);

        // Restart animation.
        playingAnimation.Time = playingAnimation.IsReverse ? playingAnimation.Length : 0;

        if (playingAnimation.IsLoop)
        {
            // Loop animation not set extra fade time.
            playingAnimation.fadeTime          = 0;
            playingAnimation.movementStartTime = playingAnimation.IsReverse ? playingAnimation.Length : 0;
            playingAnimation.movementDuration  = playingAnimation.Length;
        }
        else
        {
            // Calculate cross fade time.
            playingAnimation.fadeTime = playingAnimation.Length * 0.1f;

            // Set max cross time.
            if (playingAnimation.fadeTime > GameDefines.animCrossFadeTime)
            {
                playingAnimation.fadeTime = GameDefines.animCrossFadeTime;
            }

            // Calculate movement start time
            playingAnimation.movementStartTime = (animationCfg.moveStartFrame - Mathf.Min(animationCfg.moveEndFrame, animationCfg.moveStartFrame)) / playingAnimation.animationState.clip.frameRate;
            if (playingAnimation.movementStartTime < 0)
            {
                playingAnimation.movementStartTime = playingAnimation.IsReverse ? playingAnimation.Length : 0;
            }

            // Calculate movement duration
            playingAnimation.movementDuration = Mathf.Abs(animationCfg.moveStartFrame - animationCfg.moveEndFrame) / playingAnimation.animationState.clip.frameRate;

            if (playingAnimation.movementDuration <= 0)
            {
                playingAnimation.movementDuration = playingAnimation.Length;
            }

            // Force non-loop animation to WrapMode.ClampForever, to ensure AnimationState.time works correctly
            if (playingAnimation.animationState.wrapMode == WrapMode.Default || playingAnimation.animationState.wrapMode == WrapMode.Once)
            {
                playingAnimation.animationState.wrapMode = WrapMode.ClampForever;
            }
        }

        // Switch to this animation state.
        if (avatarAnimCmp.isPlaying)
        {
            avatarAnimCmp.CrossFade(playingAnimation.animationName, playingAnimation.fadeTime <= 0 ? GameDefines.animCrossFadeTime : playingAnimation.fadeTime);
        }
        else
        {
            avatarAnimCmp.Play(playingAnimation.animationName);
        }

        if (Avatar.LogAnim)
        {
            avatar.Log(System.String.Format("PlayAnim Anim:{0}", playingAnimation.animationName));
        }

        return(true);
    }