// FixedUpdate() 함수는 고정된 프레임 수(1초에 60번)에 따라 매 프레임마다 호출됩니다. // 여기서의 FixedUpdate() 함수는 턴의 각 단계를 진행시키는 함수입니다. void FixedUpdate() { if (turn == 1) { // 턴이 시작되면 //Debug.Log("Turn starts."); foreach (PlayerController p in Players) { // 모든 생존자 마나 2씩 회복 p.ManaRecovery(); } // 행동 결정 단계로 넘어감 turn = 2; } else if (turn == 2) { // 행동 결정 단계에서 //Debug.Log("Decide your behavior."); if (Players[0].GetTargetDecide()) // 대상 결정 중이면 { if (!decideButton.activeInHierarchy) { decideButton.SetActive(true); // 결정 버튼이 나타나게 한다. } if (Input.GetMouseButtonDown(0)) { PlayerToSelectTarget(); // 플레이어1이 선택한 대상들을 저장하여 기억한다. } } else { if (decideButton.activeInHierarchy) { decideButton.SetActive(false); // 결정 버튼이 보이지 않게 한다. } } bool isCompleted = true; foreach (PlayerController p in Players) { // 사망한 플레이어는 행동을 결정하지 않음 if (p.GetDead()) { continue; } else if (!p.GetHasDecided()) { isCompleted = false; break; } } // TODO 각 플레이어가 결정한 행동을 저장해 놓아야 한다. // 행동은 PlayerController.cs에서 만들도록 한다. // 만약 모든 생존자가 행동 결정을 완료하면 행동 수행 단계로 넘어감 if (isCompleted) { turn = 3; } } else if (turn == 3) { foreach (Behavior behavior in Behaviors) { if (behavior.GetObjectPlayers().Count == 2) { Debug.Log(behavior.GetSubjectPlayer().GetPlayerName() + " -> " + behavior.GetObjectPlayers()[0].GetPlayerName() + ", " + behavior.GetObjectPlayers()[1].GetPlayerName() + " (" + behavior.GetBehavior().Name + ")"); } else if (behavior.GetObjectPlayers().Count == 1) { Debug.Log(behavior.GetSubjectPlayer().GetPlayerName() + " -> " + behavior.GetObjectPlayers()[0].GetPlayerName() + " (" + behavior.GetBehavior().Name + ")"); } } //Debug.Log("Performming behaviors..."); // 모든 플레이어의 상태이상을 해제하고 행동을 결정하지 않은 상태로 초기화함 foreach (PlayerController p in Players) { p.Purify(); p.SetNotDecided(); } // 전 단계에서 결정된 행동들을 수행함 foreach (Behavior b in Behaviors) { // TODO 피해 무시, 상대 행동 무효화 등의 행동은 가장 먼저 이루어져야 함 //StartCoroutine("PerformBehavior", b); BehaviorManager.Perform(b); } Behaviors = new List <Behavior>(); turn = 4; } else if (turn == 4) { //Debug.Log("Processing the dead..."); foreach (PlayerController p in Players) { p.Death(); } turn = 5; } else if (turn == 5) { bool isEnd = false; bool allDead = true; for (int i = 0; i < 5; i++) { //Debug.Log(PlayerPermutation[i].player.GetPlayerName() + "'s target is " + PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[0]].player.GetPlayerName() + " and "+ PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[1]].player.GetPlayerName() + "."); if (!PlayerPermutation[i].player.GetDead()) { allDead = false; if (PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[0]].player.GetDead() && PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[1]].player.GetDead()) { isWin[i] = true; isEnd = true; Debug.Log(PlayerPermutation[i].player.GetPlayerName() + " wins!"); } } } if (allDead) { Debug.Log("No one wins."); isEnd = true; } if (isEnd) { Debug.Log("Battle ends."); turn = 6; } else { Debug.Log("Turn ends."); turn = 1; // 7로 놓으면 수동으로(버튼을 눌러서) 턴 진행, 1로 놓으면 자동으로 턴 진행 } } }