Example #1
0
    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);
    }