void Start() { //this.mocha_parameter.m_State = MochaState.BREAK; this.MochaOldState = this.mocha_parameter.m_State; this.OldMoveDirection = 0; MyMochaSpriteRenderer = gameObject.GetComponent <SpriteRenderer>(); mocha_manager_object = GameObject.Find("MochasManager"); mocha_manager = mocha_manager_object.GetComponent <MochasManager>(); prefab_generator_object = GameObject.Find("PrefabGenerator"); prefab_generator = prefab_generator_object.GetComponent <PrefabGenerator>(); // 自分自身の情報で初期化 this.my_object = GameObject.Find(this.transform.name); my_animator = GetComponent <Animator>(); // このモチャをMochasManagerのMochaListの一番最後に追加する mocha_manager.AddMochaList(this.my_object); mocha_behavior_info.StateMaxTime = 30.0f; mocha_behavior_info.StateNowTime = 0.0f; }
private void StartState() { if (this.MochaOldState != this.mocha_parameter.m_State) { my_animator.SetBool("IsWalkMove", false); switch (this.mocha_parameter.m_State) { case MochaState.BREAK: StartBreak(); break; case MochaState.BREED: StartBreed(); break; case MochaState.CONSTRUCT: StartConstruct(); break; case MochaState.REORGANIZE: StartReorganize(); break; case MochaState.EMIGRATE: StartEmigrate(); break; case MochaState.MEAL: StartMeal(); break; } this.MochaOldState = this.mocha_parameter.m_State; } }
public MochaState MochaNextState(GameObject mocha_name_) { // 次のステートを聞きに来たモチャのリストの要素番号を記憶する int MyMochaNumber = MochaList.IndexOf(mocha_name_); // -1が返ってきたら失敗 if (MyMochaNumber == -1) { Debug.Log("リストから自分を見つけ出すのに失敗"); return(MochaState.BREAK); } // 変数Mochaで全Mochaの情報に参照できる GameObject[] mocha_object = new GameObject[MochaList.Count]; MochaControl[] mocha = new MochaControl[MochaList.Count]; for (int i = 0; i < MochaList.Count; i++) { mocha_object[i] = GameObject.Find(MochaList[i].name); mocha[i] = mocha_object[i].GetComponent <MochaControl>(); } // 各ステートのモチャが何人いるのか調べる float[] EachStateRatio = new float[(int)MochaState.MAX_STATE]; for (int i = 0; i < (int)MochaState.MAX_STATE; i++) { EachStateRatio[i] = 0.0f; } for (int i = 0; i < MochaList.Count; i++) { EachStateRatio[(int)mocha[i].mocha_parameter.m_State]++; } // 現在のモチャ全体のステート比率を調べる float EntireStateRatio = MochaList.Count; float[] RealStateRatio = new float[(int)MochaState.MAX_STATE]; for (int i = 0; i < (int)MochaState.MAX_STATE; i++) { RealStateRatio[i] = EachStateRatio[i] / EntireStateRatio; } // 行動可能なステートを選別していくためのList List <MochaState> MyPossibleHighStateList = new List <MochaState>(); List <MochaState> MyPossibleLowStateList = new List <MochaState>(); // ステートの設定した割合と実際の割合を比較し、合ったListに入れる void SortingStateList(MochaState mocha_state_) { if (RealStateRatio[(int)mocha_state_] < GuideStateRatio[(int)mocha_state_]) { MyPossibleHighStateList.Add(mocha_state_); } else { MyPossibleLowStateList.Add(mocha_state_); } } // 聞いてきたモチャのMAXになっているパラメーターを調べる // もしMAXになっているパラメーターがあったら該当のステートをListに追加する { SortingStateList(MochaState.BREAK); int BreedMochaNum = 0; for (int i = 0; i < MochaList.Count; i++) { if (mocha[i].mocha_parameter.m_State == MochaState.BREED) { BreedMochaNum++; } } if ( //もし今いる土地の潤い度が一定値以上なら && MochaList.Count + BreedMochaNum < mocha_data.PopulationLimit) { SortingStateList(MochaState.BREED); } if (mocha[MyMochaNumber].mocha_parameter.m_Stamina >= 60) { SortingStateList(MochaState.CONSTRUCT); } /* if(暇しているモチャを探して、そのモチャのステートもして) * { * SortingStateList(MochaState.REORGANIZE); * } */ SortingStateList(MochaState.EMIGRATE); if (mocha[MyMochaNumber].mocha_parameter.m_Stamina < 60) { SortingStateList(MochaState.MEAL); } } void SortMyList(List <MochaState> mocha_state_) { // 各ステートリストの要素をステート優先度が高い順に並び替える for (int i = 0; i < mocha_state_.Count; i++) { MochaState MinPriority = mocha_state_[i]; for (int j = i + 1; j < mocha_state_.Count; j++) { if (mocha_data.mocha_state_info[(int)mocha_state_[j]].Priority > mocha_data.mocha_state_info[(int)MinPriority].Priority) { MinPriority = mocha_state_[j]; } } mocha_state_.Remove(MinPriority); mocha_state_.Insert(0, MinPriority); } } SortMyList(MyPossibleHighStateList); SortMyList(MyPossibleLowStateList); List <MochaState> MyPossibleStateList = new List <MochaState>(); MyPossibleStateList.AddRange(MyPossibleHighStateList); MyPossibleStateList.AddRange(MyPossibleLowStateList); // もし改装ステートに移行するなら、まず一緒に改装ステートに入れるモチャを探す if (MyPossibleStateList[0] == MochaState.REORGANIZE) { for (int i = 0; i < MochaList.Count; i++) { if (i == MyMochaNumber) { continue; } if (mocha_data.mocha_state_info[(int)MochaState.REORGANIZE].Priority < mocha_data.mocha_state_info[(int)mocha[i].mocha_parameter.m_State].Priority) { } } } return(MyPossibleStateList[0]); }