実現したいこと
ゲーム終了後に勝利パネルをアクティブにして表示したい
ゲームは戦車で弾をうって対戦するオンラインゲームです
ルームに入りゲームが開始するとPlayerID.csによりキャラクターがそれぞれの位置に生成されます
キャラクターがうった弾にぶつかるとキャラクターが非アクティブするようにしています
実現したいことはゲームキャラクター(生き残っているキャラ)が残り一人になったらWinPanelをアクティブにして表示させることです
残り一人になったらWinPanelを表示するのはSyouhai.csで制御しています
(Playerの誰かが非アクティブになった時、かつプレイヤーの人数が残り一人になったならWinPanelを表示するというものです。ここに貼ったコードにはまだ書かれてませんが)
解決法として考えているプランは、
①参加者のキャラクターを同時に生成できるようにする
②Playerの検索方法、タイミングを変える
などでしょうか
原因
Player1とPlayer2の生成タイミングにラグが生じていることで、Player1側でSyouhai.csのvoid Update()が動く時にまだPlayer2が生成されておらず、値が入れられないため中身が空なのでエラーが起きる
(一つ謎なのが、この前までは同時に生成されていた気がすることです)
発生している問題・エラーメッセージ
NullReferenceException: Object reference not set to an instance of an object Syouhai.Update () (at Assets/C#script/Syouhai.cs:36)
該当のソースコード(Syouhai.cs)
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Photon.Pun; 5using Photon.Realtime; 6 7public class Syouhai : MonoBehaviourPun 8{ 9 public GameObject WinPanel; 10 public GameObject[] tankObjects; 11 GameObject player1; 12 GameObject player2; 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 18 } 19 20 // Update is called once per frame 21 void Update() 22 { 23 player1 = GameObject.Find("GamePlayer(Clone)"); 24 player2 = GameObject.Find("GamePlayer2(Clone)"); 25 26 Debug.Log("player1は" + player1); 27 Debug.Log("player2は" + player2); 28 29 30 31 32 if(!player1.activeSelf) 33 { 34 Debug.Log("プレイヤー1はactive?" + !player1.activeSelf); 35 } 36 if (!player2.activeSelf) 37 { 38 Debug.Log("プレイヤー2はactive?" + !player2.activeSelf); 39 } 40 41 tankObjects = GameObject.FindGameObjectsWithTag("tank"); 42 Debug.Log("tankObjects配列 = " + tankObjects.Length); 43 44 } 45 46} 47
該当のソースコード(PlayerID.cs)
C#
1using System; 2using System.Collections; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using Photon.Pun; 6using Photon.Realtime; 7 8public class PlayerID : MonoBehaviourPunCallbacks 9{ 10 public FixedJoystick joystick; 11 12 public GameObject gameplayer1; 13 public GameObject gameplayer2; 14 15 int id; 16 17 void Awake() 18 { 19 PhotonNetwork.AutomaticallySyncScene = false; 20 21 id = PhotonNetwork.LocalPlayer.ActorNumber; 22 var v = new Vector3(-5.5f, 0.5f, -3.5f); 23 var v2 = new Vector3(5.5f, 0.5f, 3.5f); 24 25 if (!PhotonNetwork.IsConnected) //Phootnに接続されていなければ 26 { 27 SceneManager.LoadScene("MultiMode"); //ログイン画面に戻る 28 return; 29 } 30 if (id == 1) 31 { 32 Debug.Log("ID = " + id); 33 34 GameObject Player1 = PhotonNetwork.Instantiate(this.gameplayer1.name, v, Quaternion.identity); 35 } 36 else if (id == 2) 37 { 38 Debug.Log("ID = " + id); 39 40 GameObject Player2 = PhotonNetwork.Instantiate(this.gameplayer2.name, v2, Quaternion.identity); 41 42 } 43 44 45 } 46 47 void Update() 48 { 49 50 51 } 52}
試したこと
void Update()内でキャラクターオブジェクトを検索すればよいと考えたが変わらなかった
補足情報(FW/ツールのバージョンなど)
Unity 2019.4.11f1
あなたの回答
tips
プレビュー