static public void CastEvent(GameObject sender, string msg, EventContext context) { EventCaster ec = sender.GetComponent <EventCaster>(); if (ec) { if (context != null) { context = new EventContext(); } context.sender = sender; ec.CastEvent(msg, context); } }
public StateMachine ChangeSubState(string stateName, EventContext context) { if (currentSubState && currentSubState.name == stateName) { return(null); } if (GetActiveState() != null) { lastStateName = GetActiveState().name; } StateMachine newState; if (subStates == null) { subStates = new Hashtable(); foreach (Transform child in transform) { StateMachine sm = child.GetComponent <StateMachine>(); if (sm) { sm.isRoot = false; subStates[child.name] = sm; child.gameObject.SetActive(false); } } } if (!subStates.Contains(stateName)) { newState = CreateSubState(stateName, gameObject.transform); subStates[stateName] = newState; } else { newState = subStates[stateName] as StateMachine; } StateMachine tail = currentSubState; if (tail) { // Recursively exits nested states // - Invoke EvStateExit event on tails and deactivate it // - Cut currentSubStates off from the parents of tails while (tail.currentSubState) { tail = tail.currentSubState; } while (tail && tail != this) { tail.SendMessage("EvStateExit", null, SendMessageOptions.DontRequireReceiver); tail.gameObject.SetActive(false); tail = tail.GetParentStateMachine(); if (tail) { tail.currentSubState = null; } } } currentSubState = newState; if (currentSubState != null) { currentSubState.gameObject.SetActive(true); currentSubState.gameObject.SendMessage("EvStateEnter", context, SendMessageOptions.DontRequireReceiver); } if (GetRootStateMachine().isStateChangeNotificationRequired) { EvStateDidChangeContext changedContext = new EvStateDidChangeContext(); changedContext.statePath = GetStatePath(); EventCaster.CastEvent(GetRootStateMachine().gameObject, "EvStateDidChange", changedContext); } return(currentSubState); }