예제 #1
0
 private void EvtGamePostSwitchState(EStateType newState, EStateType curState)
 {
     if (postSwitchStateFunc != null)
     {
         postSwitchStateFunc.call(newState, curState);
     }
 }
예제 #2
0
    public void Init(Character OwnerToSet)
    {
        OwnerCharacter = OwnerToSet;

        StateInstances = new Dictionary <EStateType, BaseState>();
        foreach (GameObject StateTemplate in StatePrefabs)
        {
            BaseState InstanciatedState = Instantiate <GameObject>(StateTemplate).GetComponent <BaseState>();
            InstanciatedState.transform.SetParent(transform);
            InstanciatedState.name = "state_" + InstanciatedState.GetStateType().ToString();
            InstanciatedState.gameObject.SetActive(false);
            InstanciatedState.Init(this, OwnerToSet);

            if (!StateInstances.ContainsKey(InstanciatedState.GetStateType()))
            {
                StateInstances.Add(InstanciatedState.GetStateType(), InstanciatedState);
            }
            else
            {
                Debug.LogError("State Type already instantiated.");
            }
        }

        m_currState = EStateType.None;
        ChangeState(EStateType.Idle);
    }
예제 #3
0
 public BaseState GetStateInstance(EStateType StateType)
 {
     if (StateInstances.ContainsKey(StateType))
     {
         return(StateInstances[StateType]);
     }
     return(null);
 }
예제 #4
0
 static public void SwitchToState(EStateType stateType)
 {
     if (stateType == EStateType.None)
     {
         return;
     }
     Instance._SwitchToState(stateType);
 }
예제 #5
0
 private void _SwitchToState(EStateType stateType)
 {
     switchQueue.Enqueue(stateType);
     if (running == false)
     {
         StartCoroutine(HandleSwitchQueue());
     }
 }
예제 #6
0
 private void _SwitchToState(EStateType newState)
 {
     switchQueue.Enqueue(newState);
     if (!runing)
     {
         StartCoroutine(HandleSwitchQueue());
     }
 }
예제 #7
0
    public IEnumerator LoadGameRes()
    {
        if (EnableInState != curResGameType)
        {
            curResGameType = EnableInState;
        }

        yield break;
    }
예제 #8
0
        public bool GetState(EStateType type, ref bool _state) // return is success
        {
            if (stateDic.TryGetValue(type, out bool s))
            {
                _state = s;
                return(true);
            }

            return(false);
        }
예제 #9
0
    // public void OnCommand()

    public BaseState()
    {
        m_type  = EStateType.EStateType_Default;
        percent = 0;
        //默认循环
        timeOutState = this;
        m_curFsm     = null;
        m_links      = new Dictionary <int, StateLink>();
        m_propSys    = new PropertySystem();
        m_propSys.NewPropertySet("root", "");
    }
예제 #10
0
파일: CGameRoot.cs 프로젝트: yh821/Zombie
 private void _SwitchToState(EStateType newState)
 {
     switchQueue.Enqueue(newState);
     //if (newState == EStateType.FightSelectMode)
     //{
     //    Debug.LogError(newState);
     //}
     if (runing == false)
     {
         StartCoroutine(HandleSwitchQueue());
     }
 }
예제 #11
0
    public bool RequestChangeState(EStateType StateType)
    {
        if (StateType != m_currState && StateInstances.ContainsKey(StateType))
        {
            if (GetStateInstance(StateType).CanEnter(m_prevState))
            {
                ChangeState(StateType);
                return(true);
            }
        }

        return(false);
    }
        public void SetComputerState(EStateType state)
        {
            switch (state)
            {
            case EStateType.Free:
                this.computerState = new FreeState(this);
                return;

            case EStateType.Occupied:
                this.computerState = new OccupiedState(this);
                return;
            }
        }
예제 #13
0
    private ICameraState CreateStateByType(EStateType in_state)
    {
        switch (in_state)
        {
        case EStateType.Idle: return(new CCameraState_Idle(this));

        case EStateType.Accelerate: return(new CCameraState_Accelerate(this));

        case EStateType.GetSlow: return(new CCameraState_GetSlow(this));
        }

        return(null);
    }
예제 #14
0
파일: S4JState.cs 프로젝트: b-y-t-e/sql4js
        private bool IsAllowed(EStateType StateType)
        {
            if (allowedStatesNames.Contains(StateType))
            {
                return(true);
            }

            if (allowedStatesNames.Contains(EStateType.ANY))
            {
                return(true);
            }

            return(false);
        }
예제 #15
0
파일: CGameRoot.cs 프로젝트: yh821/Zombie
    static public void SwitchToState(EStateType stateType)
    {
        if (stateType == EStateType.None)
        {
            return;
        }

        //if (stateType == EStateType.FightSelectMode)
        //{
        //    Debug.LogError("不是错误,打的日志: Enter FightSelectMode");
        //}

        Instance._SwitchToState(stateType);
    }
예제 #16
0
 public void SetState(EStateType type, bool _state)
 {
     if (stateDic.ContainsKey(type))
     {
         if (stateDic[type] != _state)
         {
             stateDic[type] = _state;
             UpdateState();
         }
     }
     else
     {
         stateDic.Add(type, _state);
         UpdateState();
     }
 }
예제 #17
0
    public void ChangeState(EStateType StateType)
    {
        if (StateType != m_currState && StateInstances.ContainsKey(StateType))
        {
            if (m_currState != EStateType.None)
            {
                StateInstances[m_currState].OnExit(StateType);
                StateInstances[m_currState].gameObject.SetActive(false);
            }

            m_prevState = m_currState;
            m_currState = StateType;

            StateInstances[m_currState].OnEnter();
            StateInstances[m_currState].gameObject.SetActive(true);
        }
    }
예제 #18
0
    //void Update() { }


    public void CameraHandler(float in_time)
    {
        if (_player == null)
        {
            return;
        }

        _desired_camera_point.SetCurrentPosition(DesiredCameraPos(), in_time);
        UpdateCameraVelocityAndPosition(in_time);

        EStateType new_state = _current_state.Update(in_time);

        if (new_state != _current_state.GetStateType())
        {
            ICameraState old_state = _current_state;
            _current_state = CreateStateByType(new_state);
            _current_state.Update(0f);
        }
    }
 public CGameState(EStateType stateType, Type[] systems, CGameState[] childState)
 {
     mStateType  = stateType;
     mSystems    = systems;
     mChildState = childState;
 }
예제 #20
0
 public void setState(EStateType index)
 {
     this.CurrentState = (IStates)this.arrayList[(int)index];
 }
예제 #21
0
파일: S4JState.cs 프로젝트: b-y-t-e/sql4js
        ////////////////////////////////

        public S4JState()
        {
            ID = Guid.NewGuid();
            AllowedStateTypes = new EStateType[0];
            Gates             = new List <S4JStateGate>();
        }
예제 #22
0
파일: CGameRoot.cs 프로젝트: yh821/Zombie
    private IEnumerator _SwitchToStateCo(EStateType newState)
    {
        mWillStateType = newState;
        if (mOldState == newState)
        {
            //Debug.LogWarning("SwitchState oldState == newState: " + newState);
            yield break;
        }

        CUility.Log("Begin: SwitchToStateCo " + newState);

        try
        {
            if (OnPreStateChange != null)
            {
                OnPreStateChange(newState, mOldState);
            }
        }
        catch (Exception ex)
        {
            CUility.LogError("Exception in OnPreStateChange: {0}", ex.ToString());
        }

        CGameState[] oldStates = mConfig.mStateMap[mOldState];
        CGameState[] newStates = mConfig.mStateMap[newState];

        int sameDepth = -1;

        while (sameDepth + 1 < newStates.Length && sameDepth + 1 < oldStates.Length &&
               newStates[sameDepth + 1] == oldStates[sameDepth + 1])
        {
            ++sameDepth;
        }
        //Debug.Log(sameDepth);

        //Debug.Log("Leave old system");
        List <CGameSystem> leaveSystems = new List <CGameSystem>();

        for (int i = oldStates.Length - 1; i > sameDepth; --i)
        {
            foreach (Type sysType in oldStates[i].mSystems)
            {
                leaveSystems.Add(mSystemMap[sysType]);
            }
        }

        foreach (CGameSystem leaveSystem in leaveSystems)
        {
            CUility.Log("Leave System {0}", leaveSystem.Name);
            try
            {
                leaveSystem._SysLeave();
            }
            catch (Exception ex)
            {
                Debug.LogError(string.Format("Exception in {1}'s SysLeave: {0}", ex.ToString(), leaveSystem.Name));
            }
        }

        CUility.Log("Leave System Finish");

        try
        {
            if (OnStateChange != null)
            {
                OnStateChange(newState, mOldState);
            }
        }
        catch (Exception ex)
        {
            Debug.LogError(string.Format("Exception in OnStateChange: {0}", ex.ToString()));
        }

        CUility.Log("Start EnterSystem");

        //Debug.Log("Enter new system");
        List <CGameSystem> enterSystems = new List <CGameSystem>();

        for (int i = sameDepth + 1; i < newStates.Length; ++i)
        {
            foreach (Type sysType in newStates[i].mSystems)
            {
                if (!mSystemMap.ContainsKey(sysType))
                {
                    throw new Exception(string.Format("SystemMap.ContainsKey({0}) == false", sysType.Name));
                }

                mSystemMap[sysType].EnableInState = newStates[i].mStateType;
                enterSystems.Add(mSystemMap[sysType]);
            }
        }


        for (int i = 0; i < enterSystems.Count; ++i)
        //foreach (CGameSystem enterSystem in enterSystems)
        {
            CGameSystem enterSystem = enterSystems[i];

            CUility.Log("{0} SysEnter Start", enterSystem.Name);

            bool haveEnterCo = false;
            try
            {
                haveEnterCo = enterSystem._SysEnter();
            }
            catch (Exception ex)
            {
                Debug.LogError(string.Format("Exception in {1}'s SysEnter: {0}", ex.ToString(), enterSystem.Name));
            }

            if (haveEnterCo)
            {
                yield return(StartCoroutine(enterSystem.SysEnterCo()));
            }

            enterSystem._EnterFinish();

            //CLogSys.Log(ELogLevel.Verbose, ELogTag.GameRoot, string.Format("{0} SysEnter Finish", enterSystem.Name));
        }

        //Debug.Log("Add new system...............Finish");


        //Debug.Log("Remove old system once more");

        //加入了新系统之后,再给旧系统一次清理的机会。
        foreach (CGameSystem leaveSystem in leaveSystems)
        {
            leaveSystem.SysLastLeave();
        }

        //Debug.Log("Remove old system once more...............Finish");

        foreach (CGameSystem enterSystem in enterSystems)
        {
            try
            {
                enterSystem.OnStateChangeFinish();
            }
            catch (Exception ex)
            {
                Debug.LogError("Exception in OnStateChangeFinish: +" + ex.ToString());
            }
        }

        //Debug.Log(string.Format("Enter State {0} from {1}", newState, mOldState));

        mPreState = mOldState;
        mOldState = newState;

        try
        {
            if (OnPostStateChange != null)
            {
                OnPostStateChange(newState, mPreState);
            }
        }
        catch (Exception ex)
        {
            Debug.Log(string.Format("Exception in OnPostStateChange: " + ex.ToString()));
        }

        CUility.Log("End: SwitchToStateCo " + newState);
    }
예제 #23
0
    private IEnumerator _SwitchToStateCo(EStateType newState)
    {
        if (mOldState == newState)
        {
            Debug.Log("SwitchState oldState == newState: " + newState);
            yield break;
        }

        if (OnPreStateChange != null)
        {
            OnPreStateChange(newState, mOldState);
        }

        CGameState[] oldStates = mConfig.mStateMap[mOldState];
        CGameState[] newStates = mConfig.mStateMap[newState];

        int sameDepth = -1;

        while (sameDepth + 1 < newStates.Length && sameDepth + 1 < oldStates.Length &&
               newStates[sameDepth + 1] == oldStates[sameDepth + 1])
        {
            ++sameDepth;
        }

        List <CGameSystem> leaveSystems = new List <CGameSystem>();

        for (int i = oldStates.Length - 1; i > sameDepth; --i)
        {
            foreach (Type sysType in oldStates[i].mSystems)
            {
                leaveSystems.Add(mSystemMap[sysType]);
            }
        }

        foreach (CGameSystem leaveSystem in leaveSystems)
        {
            leaveSystem._SysLeave();
        }

        if (OnStateChange != null)
        {
            OnStateChange(newState, mOldState);
        }

        List <CGameSystem> enterSystems = new List <CGameSystem>();

        for (int i = sameDepth + 1; i < newStates.Length; ++i)
        {
            foreach (Type sysType in newStates[i].mSystems)
            {
                if (!mSystemMap.ContainsKey(sysType))
                {
                    throw new Exception(string.Format("SystemMap.ContainsKey({0}) == false", sysType.Name));
                }

                mSystemMap[sysType].EnableInState = newStates[i].mStateType;
                enterSystems.Add(mSystemMap[sysType]);
            }
        }


        //Debug.Log("555555555555555555555555....." + enterSystems.Count);
        for (int i = 0; i < enterSystems.Count; ++i)
        {
            CGameSystem enterSystem = enterSystems[i];
            bool        haveEnterCo = enterSystem._SysEnter();
            if (haveEnterCo)
            {
                yield return(StartCoroutine(enterSystem.SysEnterCo()));
            }

            enterSystem._EnterFinish();
        }

        //加入了新系统之后,再给旧系统一次清理的机会。
        foreach (CGameSystem leaveSystem in leaveSystems)
        {
            leaveSystem.SysLastLeave();
        }

        foreach (CGameSystem enterSystem in enterSystems)
        {
            enterSystem.OnStateChangeFinish();
        }

        mPreState = mOldState;
        mOldState = newState;

        if (OnPostStateChange != null)
        {
            OnPostStateChange(newState, mPreState);
        }
    }
예제 #24
0
 public bool RequestState(EStateType NewState)
 {
     return(_CharacterStateMachine.RequestChangeState(NewState));
 }
예제 #25
0
 public virtual void OnExit(EStateType NewState)
 {
 }
예제 #26
0
 public void ChangeState(EStateType stateTypeToChange)
 {
     CurrentState.Exit();
     CurrentState = states[stateTypeToChange];
     CurrentState.Enter();
 }
예제 #27
0
 public void AddState(EStateType stateType, BaseState state)
 {
     states.Add(stateType, state);
 }
예제 #28
0
    private IEnumerator _SwitchToStateCo(EStateType newState)
    {
        mNewState = newState;
        if (mCurState == newState)
        {
            yield break;
        }

        if (OnPreStateChange != null)
        {
            OnPreStateChange(newState, mCurState);
        }

        CGameState[] oldStates = mConfig.mStateMap[mCurState];
        CGameState[] newStates = mConfig.mStateMap[newState];

        int sameDepth = 0;

        while (sameDepth < newStates.Length && sameDepth < oldStates.Length &&
               newStates[sameDepth] == oldStates[sameDepth])
        {
            ++sameDepth;
        }

        mLeaveSystems.Clear();
        mEnterSystems.Clear();

        for (int i = oldStates.Length - 1; i >= sameDepth; --i)
        {
            for (int j = 0; j < oldStates[i].mSystems.Length; ++j)
            {
                mLeaveSystems.Add(mSystemMap[oldStates[i].mSystems[j]]);
            }
        }

        for (int i = 0; i < mLeaveSystems.Count; ++i)
        {
            mLeaveSystems[i]._SysLeave();
        }

        if (OnStateChange != null)
        {
            OnStateChange(newState, mCurState);
        }

        for (int i = sameDepth; i < newStates.Length; ++i)
        {
            for (int j = 0; j < newStates[i].mSystems.Length; ++j)
            {
                if (!mSystemMap.ContainsKey(newStates[i].mSystems[j]))
                {
                    throw new Exception(string.Format("SystemMap.ContainKey({0})==false", newStates[i].mSystems[j].Name));
                }

                mSystemMap[newStates[i].mSystems[j]].EnableInState = newStates[i].mStateType;
                mEnterSystems.Add(mSystemMap[newStates[i].mSystems[j]]);
            }
        }

        for (int i = 0; i < mEnterSystems.Count; ++i)
        {
            bool haveEnterCo = mEnterSystems[i]._SysEnter();
            if (haveEnterCo)
            {
                yield return(StartCoroutine(mEnterSystems[i].SysEnterCo()));
            }
            mEnterSystems[i]._EnterFinish();
        }

        //加入了新系统之后,再给旧系统一次清理的机会
        for (int i = 0; i < mLeaveSystems.Count; ++i)
        {
            mLeaveSystems[i].SysLastLeave();
        }

        for (int i = 0; i < mEnterSystems.Count; ++i)
        {
            mEnterSystems[i].OnStateChangeFinish();
        }

        mPreState = mCurState;
        mCurState = newState;

        if (OnPostStateChange != null)
        {
            OnPostStateChange(newState, mPreState);
        }
    }
예제 #29
0
 public virtual bool CanEnter(EStateType PreviousState)
 {
     return(true);
 }