こんにちは
Player.cs上の関数 WhoesTurn() で whoesTurn (小文字)を異なるスクリプトから別の値に変更しても、 変更が反映されないです。
//Player.cs [HideInInspector] public WT whoesTurn = WT.player; private void Update () { Debug.Log (whoesTurn); if (whoesTurn != WT.player) return; } public void WhoesTurn (WT a) { whoesTurn = a; Debug.Log (whoesTurn); }
//GameManager.cs public enum WT {player, pmoving, startEnemy, moveEnemy, enemy, gameover} public class GameManager : MonoBehaviour { [HideInInspector] public WT whoesTurn = WT.player; void ChangeTurn (WT a) { whoesTurn = a; pS.WhoesTurn (a); //pSはPlayer pSです。 } IEnumerator MoveEnemies() { ChangeTurn (WT.moveEnemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.enemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.player); }
MoveEnemies()を実行すると、WhoesTurn()のDebug.LogはmoveEnemy, enemy, playerと変わりますが、Update()のDebug.LogはstartEnemyのまま変わりません。
ちなみに、Player.csから全く同じ仕組みでGameManager.csの変数(こちらもwhoesTurnという名前です)を変更すると、値は他の関数でも適用されます。
よろしくお願いします。
*追記*
ご回答ありがとうございます。
whoesTurnに関係している箇所を挙げていきます。
Player.cs側
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class Player : MovingObject { //MonoBehaviourでないのは関係するでしょうか [HideInInspector] public WT whoesTurn = WT.player; private GameManager gmS; private void Update () { Debug.Log (whoesTurn); //ここは最初playerで、直後のif文が行われると以後startEnemyで変わらなくなります。 if (whoesTurn != WT.player) return; if (!key && transform.eulerAngles == new Vector3 (0f, 0f, rz)) { AttemptMove (x, y, false); } } protected override void AttemptMove (int xDir, int yDir, bool isEnemy) { base.AttemptMove (xDir, yDir, isEnemy); ChangeTurn (WT.startEnemy); } public void WhoesTurn (WT a) //GameManager.csからの変更は全てこの関数で行います。 { whoesTurn = a; Debug.Log (whoesTurn); //ここの時点では変更されています。 } void ChangeTurn (WT a) //Player.csからの変更は全てこの関数で行います。 { whoesTurn = a; gmS.WhoesTurn (a); } }
GameManager.cs側
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public enum WT {player, pmoving, startEnemy, moveEnemy, enemy, gameover} public class GameManager : MonoBehaviour { [HideInInspector] public WT whoesTurn = WT.player; private Player pS; void Update () { if (whoesTurn == WT.startEnemy) { //ここはPlayer.csから変更できています。 StartCoroutine (MoveEnemies ()); } } IEnumerator MoveEnemies() { ChangeTurn (WT.moveEnemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.enemy); yield return new WaitForSeconds(turnDelay); ChangeTurn (WT.player); } public void WhoesTurn (WT a) //Player.csからの変更は全てこの関数で行います。 { whoesTurn = a; } void ChangeTurn (WT a) //GameManager.csからの変更は全てこの関数で行います。 { whoesTurn = a; pS.WhoesTurn (a); } }
このようになっております。
私が見つけたPlayer.csからの変更とGameManager.csとの相違点は、
・継承しているクラスが異なる。
・GameManager.csからはCoroutine中で変更している。
の二点です。
長くなってしまいましたが、どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー