private void MoveStateMachine(PalmStateCommand command) { PalmState beforeState = _palmState.CurrentState; _palmState.MoveNext(command); PalmState afterState = _palmState.CurrentState; GameObject nearestGameObject = null; if ((beforeState == PalmState.Grabbing || beforeState == PalmState.Hovering) && afterState == PalmState.Idle) { nearestGameObject = _cachedNearestGameObject; } else { _cachedNearestGameObject = Hand.Palm.NearObjects[0].gameObject; nearestGameObject = _cachedNearestGameObject; } if (!nearestGameObject) { Debug.LogError("Could not reference the nearest gameobject"); return; } _handObjectReferences.AcceptStateTransitionForObject(nearestGameObject, beforeState, afterState); }
private KeyValuePair <PalmState, Action> GetNext(PalmStateCommand palmStateCommand) { PalmStateTransition transition = new PalmStateTransition(_currentState, palmStateCommand); KeyValuePair <PalmState, Action> nextState; if (!_transitions.TryGetValue(transition, out nextState)) { throw new Exception("Invalid transition: " + _currentState + " -> " + palmStateCommand); } return(nextState); }
/// <summary> /// Event to notify state machine to move onto next state. /// </summary> /// <param name="palmStateCommand">Command to exicute.</param> /// <returns>New palm state.</returns> public PalmState MoveNext(PalmStateCommand palmStateCommand) { var nextState = GetNext(palmStateCommand); _currentState = nextState.Key; if (nextState.Value != null) { nextState.Value.Invoke(); } else { UnityEngine.Debug.Log("Nest state event is null"); } return(_currentState); }
public PalmStateTransition(PalmState currentState, PalmStateCommand palmStateCommand) { _currentState = currentState; _palmStateCommand = palmStateCommand; }