protected UpdateMode DetermineUpdateMode()
        {
            _motor          = this.GetComponent <MovementMotor>();
            _controller     = this.entityRoot.GetComponent <MovementController>();
            _charController = this.entityRoot.GetComponent <CharacterController>();
            _rigidbody      = this.entityRoot.GetComponent <Rigidbody>();

            if (_motor != null)
            {
                _mode = UpdateMode.Motor;
            }
            else if (_controller != null)
            {
                _mode = UpdateMode.MovementControllerOnly;
            }
            else if (_charController != null)
            {
                _mode = UpdateMode.CharacterController;
            }
            else if (_rigidbody != null)
            {
                _mode = UpdateMode.DumbRigidbody;
            }
            else
            {
                _mode = UpdateMode.DumbTransformOnly;
            }

            return(_mode);
        }
 internal MovementStyleStateMachine(MovementMotor owner)
 {
     _owner                        = owner;
     _stateSupplier                = new ComponentStateSupplier <IMovementStyle>(_owner.gameObject);
     _changeStyleDelayed           = null;
     _changeStyleDelayedPrecedence = float.NegativeInfinity;
     _stackStyleDelayed.Clear();
     _styleStack = new Deque <IMovementStyle>();
 }
        protected override void Awake()
        {
            base.Awake();

            if (_motor == null)
            {
                _motor = this.GetComponent <MovementMotor>();
            }
        }
        public static InjectedMovementStyle InjectMovement(MovementMotor motor, System.Func <System.Collections.IEnumerator> routine, float precedence = 0)
        {
            if (motor == null)
            {
                throw new System.ArgumentNullException("motor");
            }
            if (routine == null)
            {
                throw new System.ArgumentNullException("routine");
            }

            var style = motor.AddComponent <InjectedMovementStyle>();

            style.Purge();
            style._routine = new RadicalCoroutine(routine());
            motor.States.ChangeState(style, precedence);
            return(style);
        }
        public static InjectedMovementStyle InjectMovement(MovementMotor motor, System.Action updateCallback, float precedence = 0)
        {
            if (motor == null)
            {
                throw new System.ArgumentNullException("motor");
            }
            if (updateCallback == null)
            {
                throw new System.ArgumentNullException("updateCallback");
            }

            var style = motor.AddComponent <InjectedMovementStyle>();

            style.Purge();
            style._updateMovementCallback = updateCallback;
            motor.States.ChangeState(style, precedence);
            return(style);
        }