Beispiel #1
0
    void ConstructStateMachine()
    {
        _fsm.AddState(States.Idle, new State()
        {
            enter = () => {
                // get some offset in the animation.
                _animator.Play("Idle", -1, Random.value);
            },
            update = () => {
                DoMovementStuff();
            },
        });

        _fsm.AddState(States.Walking, new State()
        {
            enter  = () => _animator.Play("Walking"),
            update = () => {
                UpdateAnimatorSpeed();
                DoMovementStuff();
            },
            exit = () => _animator.speed = 1f,
        });

        _fsm.AddState(States.Flying, new State()
        {
            enter  = () => _animator.Play("FlyingWalking"),
            update = () => {
                UpdateAnimatorSpeed();
                DoMovementStuff();
            },
            exit = () => _animator.speed = 1f,
        });

        _fsm.AddState(States.FollowingIdle, new State()
        {
            enter = () => {
                // Tell the bird set that we've been got!
                _birdSet.Add(_channel);

                // Disable the offset driver!
                _driveChannelByOffset.enabled = false;

                // Tell the fader to fade in all the way.
                StartCoroutine(_channel.FadeIn(_fadeInTime));

                _animator.Play("Idle");
            },
            update = () => DoFollowStuff(),
        });

        _fsm.AddState(States.FollowingWalking, new State()
        {
            enter  = () => _animator.Play("Walking"),
            update = () => {
                UpdateAnimatorSpeed();
                DoFollowStuff();
            },
            exit = () => _animator.speed = 1f,
        });

        _fsm.AddState(States.FollowingFlying, new State()
        {
            enter  = () => _animator.Play("FlyingWalking"),
            update = () => {
                UpdateAnimatorSpeed();
                DoFollowStuff();
            },
            exit = () => _animator.speed = 1f,
        });

        _fsm.AddState(States.Disabled, new State());

        _fsm.AddTransition(States.Idle, States.Walking, Triggers.Moving);
        _fsm.AddTransition(States.Idle, States.Flying, Triggers.Airborne);
        _fsm.AddTransition(States.Idle, States.FollowingIdle, Triggers.FollowingTarget);

        _fsm.AddTransition(States.Walking, States.Idle, Triggers.NotMoving);
        _fsm.AddTransition(States.Walking, States.Flying, Triggers.Airborne);
        _fsm.AddTransition(States.Walking, States.FollowingIdle, Triggers.FollowingTarget);

        _fsm.AddTransition(States.Flying, States.Idle, Triggers.Grounded);
        _fsm.AddTransition(States.Flying, States.FollowingIdle, Triggers.FollowingTarget);

        _fsm.AddTransition(States.FollowingIdle, States.FollowingWalking, Triggers.Moving);
        _fsm.AddTransition(States.FollowingIdle, States.FollowingFlying, Triggers.Airborne);

        _fsm.AddTransition(States.FollowingWalking, States.FollowingIdle, Triggers.NotMoving);
        _fsm.AddTransition(States.FollowingWalking, States.FollowingFlying, Triggers.Airborne);

        _fsm.AddTransition(States.FollowingFlying, States.FollowingIdle, Triggers.Grounded);

        _fsm.AddTransitionAll(States.Disabled, Triggers.Disable, false);
    }
    void ConstructStateMachine()
    {
        // States.
        _fsm.AddState(States.Idle, new State()
        {
            enter  = () => _animator.Play("Idle"),
            update = DoMovementStuff,
        });

        _fsm.AddState(States.Walking, new State()
        {
            enter  = () => _animator.Play("Walking"),
            update = () => {
                DoMovementStuff();
                var speed       = NonVerticalMovement.magnitude / _speed;
                _animator.speed = speed;
            },
            exit = () => _animator.speed = 1f,
        });

        _fsm.AddState(States.MaybeFlying, new TimerState(0.2f)
        {
            update  = () => DoMovementStuff(),
            timeout = () => _fsm.SetTrigger(Triggers.ForceExit),
        });

        _fsm.AddState(States.Flying, new State()
        {
            enter  = () => _animator.Play("FlyingWalking"),
            update = () => {
                DoMovementStuff();
                var speed       = NonVerticalMovement.magnitude / _speed;
                _animator.speed = speed;
            },
            exit = () => {
                // Add camera trauma
                // var normalizedVelocity = Mathf.Lerp(_minFallVel, _maxFallVel, Mathf.Abs(_moveDirection.y));
                // _trauma.AddTrauma(normalizedVelocity * _cameraTrauma);
                _trauma.AddTrauma(_cameraTrauma);

                // Set animator speed back.
                _animator.speed = 1f;
            },
        });

        _fsm.AddState(States.Disabled, new State()
        {
        });

        // Transitions.
        _fsm.AddTransition(States.Idle, States.Walking, Triggers.Moving);
        _fsm.AddTransition(States.Idle, States.MaybeFlying, Triggers.Airborne);

        _fsm.AddTransition(States.Walking, States.Idle, Triggers.NotMoving);
        _fsm.AddTransition(States.Walking, States.MaybeFlying, Triggers.Airborne);

        _fsm.AddTransition(States.MaybeFlying, States.Idle, Triggers.Grounded, Triggers.NotMoving);
        _fsm.AddTransition(States.MaybeFlying, States.Walking, Triggers.Grounded);
        _fsm.AddTransition(States.MaybeFlying, States.Flying, Triggers.ForceExit);

        _fsm.AddTransition(States.Flying, States.Idle, Triggers.Grounded);

        _fsm.AddTransitionAll(States.Disabled, Triggers.Disable, false);
    }