Exemplo n.º 1
0
    private IEnumerator Transition(SimpleAnimatorState state)
    {
        var time     = state.clip.length;
        var exitTime = state.exitTime;

        while (exitTime > 1)
        {
            yield return(new WaitForSeconds(time));

            exitTime -= 1;
            animation.Play(state.clip.name);
        }

        exitTime *= time;
        yield return(new WaitForSeconds(exitTime));

        transitionCoroutine = null;

        var duration = state.duration;

        if (!state.hasFixedDuration)
        {
            duration *= time;
        }

        CrossFade(state.destinationState, duration);
    }
Exemplo n.º 2
0
    private void ChangeState(SimpleAnimatorState state)
    {
        if (transitionCoroutine != null)
        {
            StopCoroutine(transitionCoroutine);
            transitionCoroutine = null;
        }

        transitionCoroutine = StartCoroutine(Transition(state));
        currentState        = state.name;
    }
Exemplo n.º 3
0
    private static bool BuildSimpleAnimatorState(Animator animator, out SimpleAnimatorState[] stateArray, out string defaultState)
    {
        stateArray   = null;
        defaultState = null;

        var states = new List <SimpleAnimatorState>();
        var runtimeAnimatorController = animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController;

        if (runtimeAnimatorController == null)
        {
            if (animator.runtimeAnimatorController != null)
            {
                Debug.LogFormat("Not support. {0} runtimeAnimatorController type:{1}", animator.runtimeAnimatorController.name, animator.runtimeAnimatorController.GetType());
            }
            return(false);
        }

        var layers = runtimeAnimatorController.layers;

        if (layers.Length != 1)
        {
            Debug.LogFormat("Not support. {0} layer count:{1}", runtimeAnimatorController.name, layers.Length);
            return(false);
        }

        foreach (var layer in layers)
        {
            defaultState = layer.stateMachine.defaultState.name;

            foreach (var state in layer.stateMachine.states)
            {
                if (Mathf.Abs(state.state.speed - 1) > float.Epsilon)
                {
                    Debug.LogFormat("Not support. {0}:{1} state speed:{2}", runtimeAnimatorController.name, state.state.name, state.state.speed);
                    return(false);
                }

                if (state.state.transitions.Length > 1)
                {
                    Debug.LogFormat("Not support. {0}:{1} transitions count:{2}", runtimeAnimatorController.name, state.state.name, state.state.transitions.Length);
                    return(false);
                }

                var simpleState = new SimpleAnimatorState();
                states.Add(simpleState);

                simpleState.name = state.state.name;
                simpleState.clip = state.state.motion as AnimationClip;

                if (simpleState.clip == null)
                {
                    if (state.state.motion != null)
                    {
                        Debug.LogFormat("Not support. {0}:{1} motion type:{2}", runtimeAnimatorController.name, state.state.name, state.state.motion.GetType());
                    }
                    return(false);
                }

                simpleState.hasTransition = state.state.transitions.Length == 1;
                if (simpleState.hasTransition)
                {
                    var transition = state.state.transitions[0];
                    if (transition.offset > float.Epsilon)
                    {
                        Debug.LogFormat("Not support. {0}:{1} transitions offset:{2}", runtimeAnimatorController.name, state.state.name, transition.offset);
                        return(false);
                    }

                    simpleState.destinationState = transition.destinationState.name;

                    simpleState.hasExitTime = transition.hasExitTime;
                    simpleState.exitTime    = transition.exitTime;

                    simpleState.hasFixedDuration = transition.hasFixedDuration;
                    simpleState.duration         = transition.duration;

                    simpleState.offset = transition.offset;
                }
            }
        }

        stateArray = states.ToArray();
        return(true);
    }
Exemplo n.º 4
0
    private IEnumerator StopPlay(SimpleAnimatorState state)
    {
        yield return(new WaitForSeconds(state.clip.length));

        animation.Stop(state.clip.name);
    }