Q&A
前提・実現したいこと
UnityとPhotonを使って、ターンベースのゲームを作っています。
「Unity Photon ターン制」で調べたところ、PunTurnManagerの存在を知りました。
認識している問題の中でこのエラーによって引き起こされているものはありませんが、それ以外のバグと関係しているのではないかと思い質問しました。
そもそもPunTurnManagerを使うのが間違っているのでしょうか。詳しい方がいたら教えていただきたいです。
また、PunTurnManagerに代わるアセットやパッケージがあるのであればそちらも教えていただきたいです。
発生している問題・エラーメッセージ
エラーの内容にはPhotonのパッケージ内の行数しか書いていないので実際にどこに問題があるのか分かりません。
UnityConsole
1Caught exception in OnEvent() for event code 253: System.NullReferenceException: Object reference not set to an instance of an object 2UnityEngine.Debug:LogError (object) 3Photon.Realtime.LoadBalancingClient:DebugReturn (ExitGames.Client.Photon.DebugLevel,string) (at Assets/Photon/PhotonRealtime/Code/LoadBalancingClient.cs:2564) 4ExitGames.Client.Photon.PeerBase/<>c__DisplayClass108_0:<EnqueueDebugReturn>b__0 () (at D:/Dev/Work/photon-dotnet-sdk/PhotonDotNet/PeerBase.cs:1212) 5ExitGames.Client.Photon.EnetPeer:DispatchIncomingCommands () (at D:/Dev/Work/photon-dotnet-sdk/PhotonDotNet/EnetPeer.cs:440) 6ExitGames.Client.Photon.PhotonPeer:DispatchIncomingCommands () (at D:/Dev/Work/photon-dotnet-sdk/PhotonDotNet/PhotonPeer.cs:1771) 7Photon.Pun.PhotonHandler:Dispatch () (at Assets/Photon/PhotonUnityNetworking/Code/PhotonHandler.cs:221) 8Photon.Pun.PhotonHandler:FixedUpdate () (at Assets/Photon/PhotonUnityNetworking/Code/PhotonHandler.cs:147)
該当のソースコード
実際にPunTurnManagerを使用しているコードです。
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using Photon.Pun; 6using Photon.Pun.UtilityScripts; 7using Photon.Realtime; 8 9public class ClientObj : SingletonMonoBehaviourPun<ClientObj> , IPunTurnManagerCallbacks 10{ 11 public PunTurnManager TurnManager; 12 13 14 private int MovePos_Cash; 15 // Start is called before the first frame update 16 void Start() 17 { 18 //ゲームスタート 19 TurnManager.TurnManagerListener = this; 20 if (PhotonNetwork.IsMasterClient) 21 { 22 photonView.RPC("SetCurrentState", RpcTarget.All, Enum_GameState.Setup); 23 } 24 } 25 26 // Update is called once per frame 27 void Update() 28 { 29 ForReference.Instance.Text_Scene.GetComponent<Text>().text = GameManager.Instance.game.gameState.CurrentGameState.ToString() + ":" + TurnManager.RemainingSecondsInTurn.ToString(); 30 if (PhotonNetwork.IsMasterClient) 31 { 32 //そのシーンの時にすること 33 switch (GameManager.Instance.game.gameState.CurrentGameState) 34 { 35 case Enum_GameState.Setup: 36 break; 37 case Enum_GameState.DaytimeA: 38 break; 39 case Enum_GameState.Move: 40 break; 41 case Enum_GameState.DaytimeB: 42 break; 43 case Enum_GameState.Night: 44 break; 45 } 46 //シーンがGameではない場合、オブジェクトを破壊する 47 if (GameManager.Instance.scene.GetScene() != Scenes.Game) Destroy(gameObject); 48 //GameDataの共有 49 _Sync(GameManager.Instance.game); 50 } 51 } 52 public void _SetPlayerPos(int PlusPos, int PlayerIndex) 53 { 54 photonView.RPC("SetPlayerPos", RpcTarget.MasterClient, PlusPos, PlayerIndex); 55 } 56 public void _Sync(Game game) 57 { 58 Dictionary<int, object> Data = new Dictionary<int, object>(); 59 60 61 62 photonView.RPC("Sync", RpcTarget.All, Utility.Serialize(Data)); 63 } 64 65 [PunRPC] 66 public void Sync(string str) 67 { 68 Dictionary<int, object> Data = Utility.Deserialize<Dictionary<int,object>>(str); 69 } 70 71 //Stateの変更をするときはこいつを使う PunRPCで呼ばないとバグる 72 [PunRPC] 73 public void SetCurrentState(Enum_GameState state) 74 { 75 Debug.Log(state); 76 GameManager.Instance.game.gameState.CurrentGameState = state; 77 GameManager.Instance.game.gameState.OnGameStateChanged(state); 78 } 79 80 [PunRPC] 81 public void SetPlayerPos(int PlusPos,int PlayerIndex) 82 { 83 GameManager.Instance.game.Players[PlayerIndex].Pos += PlusPos; 84 } 85 86 public int GetDiceNum() 87 { 88 return Random.Range(1, 7); 89 } 90 public void TurnStart(int Duration) 91 { 92 if (PhotonNetwork.IsMasterClient) 93 { 94 int b = (Utility.TypeToNo(GameManager.Instance.game.gameState.CurrentGameState) + 1) % Utility.GetTypeNum<Enum_GameState>(); 95 photonView.RPC("SetCurrentState", RpcTarget.All, Utility.NoToType<Enum_GameState>(b + (b == 0 ? 1 : 0))); 96 photonView.RPC("SetDuration", RpcTarget.All, Duration); 97 TurnManager.BeginTurn(); 98 } 99 } 100 101 [PunRPC] 102 public void SetDuration(int Duration) 103 { 104 TurnManager.TurnDuration = Duration; 105 } 106 107 108 109 public void OnTurnBegins(int turn) 110 { 111 112 } 113 114 //時間制限が来てもターンが終わるわけではない。 115 //ターンが終わったら実行される 116 public void OnTurnCompleted(int turn) 117 { 118 119 } 120 121 public void OnPlayerMove(Player player, int turn, object move) 122 { 123 124 } 125 126 public void OnPlayerFinished(Player player, int turn, object move) 127 { 128 129 } 130 131 public void OnTurnTimeEnds(int turn) 132 { 133 Debug.Log("OnTurnTimeEnds"); 134 if (PhotonNetwork.IsMasterClient) 135 { 136 TurnStart(5); 137 } 138 } 139 public void ButtonDown(ButtonType value) 140 { 141 if (!TurnManager.IsOver) 142 { 143 switch (value) 144 { 145 case ButtonType.Saikoro: 146 MovePos_Cash = Random.Range(1, 7); 147 break; 148 case ButtonType.Card: 149 //カードの選択画面 150 break; 151 case ButtonType.Right: 152 _SetPlayerPos(MovePos_Cash,GameManager.Instance.game.GetPlayerIndex()); 153 break; 154 case ButtonType.Left: 155 _SetPlayerPos(-MovePos_Cash, GameManager.Instance.game.GetPlayerIndex()); 156 break; 157 case ButtonType.Plus: 158 break; 159 case ButtonType.Minus: 160 break; 161 default: 162 Debug.LogError("そんなタイプない"); 163 break; 164 } 165 } 166 else 167 { 168 Debug.Log("時間切れ"); 169 } 170 } 171} 172public enum ButtonType 173{ 174 Saikoro, 175 Card, 176 Right, 177 Left, 178 Plus, 179 Minus, 180} 181
試したこと
・もうひとつプロジェクトを作り、エラーの再現をしようとしましたがうまくいきませんでした。
・Googleで253エラーについて調べてみましたが、納得のいくような結果は得られませんでした。
補足情報(FW/ツールのバージョンなど)
Unity2020.3.21f1
Pun2 ver2.40
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。