前提・実現したいこと
Unityでタイムの計測システムを作っています。クライアント権限をボタンに持たせるためにSpawnWithClientAuthorityをつかうのですが、エラーが出てしまいボタンが生成されません。
ネットワークを使用していますが、接続する機器により違う役割を持たせるためにシーンはそれぞれ違うものを利用しています。
発生している問題・エラーメッセージ
クライアント側で実行するとき、Warningが出てしまい、ボタンが生成されません。
エラーメッセージ
NullReferenceException: Object reference not set to an instance of an object
UnityEngine.Networking.NetworkServer.SpawnWithClientAuthority (UnityEngine.GameObject obj, UnityEngine.Networking.NetworkConnection conn) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1565)
Adjuster.Start () (at Assets/Scripts/Adjuster.cs:23)
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Networking; 5 6public class Adjuster : NetworkBehaviour { 7 //public GameObject TimeMuster; 8 public GameObject StB; //スタートボタンのプレハブを格納します 9 public GameObject ReB; //リセットボタンのプレハブを格納します 10 11 // Use this for initialization 12 13 [ClientCallback] 14 void Start () { 15 StB = (GameObject)Resources.Load("Prefubs/Start"); 16 ReB = (GameObject)Resources.Load("Prefubs/Reset"); 17 if(StB == null || ReB == null) 18 { 19 Debug.Log("Object is null."); //実行したところ出てきませんでした。 20 } 21 NetworkConnection Conn = connectionToClient; 22 /*StB = Instantiate(StB,GameObject.Find("Canvas/ControlPanel").transform);*/ 23 NetworkServer.SpawnWithClientAuthority(StB, Conn);//この行でエラーが生じます。 24 /*if (TimeMuster != null) { TimeMuster.SetActive(true); }*/ 25 if (StB != null) { StB.SetActive(true); } 26 if (ReB != null) { ReB.SetActive(true); } 27 } 28 29 // Update is called once per frame 30 void Update () { 31 32 /*if(StB == null) 33 { 34 Debug.Log("X"); 35 }*/ 36 //Destroy(this.gameObject); 37 38 } 39} 40
さらに変更したい変数があるスクリプトも載せておきます。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Networking; 5using UnityEngine.UI; 6using System; 7 8public class TimeMuster : NetworkBehaviour { 9 //このクラスが付いたゲームオブジェクトは変更したい変数があるものです。 10 public float ElTime; 11 public Text TimeDisp; 12 13 [SyncVar] 14 public bool started = false; //変更したい変数 15 16 public void Start() 17 { 18 //OnStarted(); 19 TimeDisp = GameObject.Find("NowTime").GetComponent<Text>(); 20 } 21 public void Update() 22 { //この下は時間の表示に関するものなのでそこまで意味はないです。 23 if (started) 24 { 25 ElTime += Time.deltaTime; 26 int M = (int)Math.Floor(ElTime / 60d); 27 float S = ElTime - 60f * M; 28 string SSt = S.ToString("F2"); 29 if(M == 0) 30 { 31 TimeDisp.text = SSt; 32 } 33 else 34 { 35 TimeDisp.text = M + ":" + SSt; 36 } 37 38 } 39 } 40 public void OnStarted() 41 { //使う予定はありません 42 started = true; 43 } 44 45}
試したこと
いったんInstantiateで生成してから、ボタン側でAssignClientAuthorityを実行しようとも考えたのですが、Warningが出てしまい、うまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー