IEnumerator WaitingState() { // ---------------------- // On state event code // ---------------------- onStateEvent = (BaseEvent evt) => { ElevatorInputEvent e = evt as ElevatorInputEvent; if (e != null) { switch (e.name) { case ElevatorInputEvent.EName.OnPushDownButton: Go(ElevatorStates.MovingState, evt); break; case ElevatorInputEvent.EName.OnPushUpButton: Go(ElevatorStates.MovingState, evt); break; } } }; yield break; }
void SendOnStateEvent(ElevatorInputEvent evt) { if (elevator == null) { return; } elevator.OnStateEvent(evt); }
IEnumerator MovingState() { // ---------------------- // On state exit code // ---------------------- onStateExit = () => { isMoving = false; // Just to demonstrate onExit method }; // ---------------------- // On state enter code // ---------------------- // Get state argument. Just to demonstrate the feature ElevatorInputEvent e = stateValue as ElevatorInputEvent; if (e == null) { Go(ElevatorStates.WaitingState); // No - argument this is wrong } // Check if elevator can move int oldLevel = curentLevel; switch (e.name) { case ElevatorInputEvent.EName.OnPushDownButton: curentLevel = GetAvailableLevel(curentLevel - 1); break; case ElevatorInputEvent.EName.OnPushUpButton: curentLevel = GetAvailableLevel(curentLevel + 1); break; } if (oldLevel == curentLevel) { Go(ElevatorStates.WaitingState); // No - can't move } // Yes - can move isMoving = true; float animTime = 0; float animDur = 1f / template.speed; float smothTime = animDur * 0.3f; Vector3 curentVelocity = Vector3.zero; Vector3 targetPosition = GetLevelPosition(curentLevel); substate = "while: animTime < animDur"; //< Just to demonstrate sub-state feature while (animTime < animDur) { // ---------------------- // The state's arc code // ---------------------- yield return(null); animTime += Time.deltaTime; transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref curentVelocity, smothTime); } Go(ElevatorStates.WaitingState); }
void SendOnStateEvent(ElevatorInputEvent evt) { if (elevator == null) return; elevator.OnStateEvent(evt); }