質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1519閲覧

[Unity]SpawnWithClientAuthorityのエラーの原因を教えてください

TKM2977

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/09/24 12:33

編集2018/09/24 23:29

前提・実現したいこと

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/ツールのバージョンなど)

Unity 2018.2.8f1を使用しています。
インスペクターの画像です。インスペクター

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2018/09/24 12:57

私はあまり詳しくはないですが、そもそもボタンのオブジェクトをネットワークで共有する理由がよく分かりませんでした。ネットワークで同期すべきなのは「ボタンが押されているかどうか」であって、ボタンのオブジェクトそのものはネットワークで同期する必要はないと思いますが、どうでしょう?
TKM2977

2018/09/24 22:33

ありがとうございます。今回ネットワークが初めてなのでほかに良い方法があればご教授いただいたいのですが、ボタン側のスクリプトで[Command]からサーバー側にあるゲームオブジェクトの変数を書き換える処理を行いたいと考えています。そこでAssignClientAuthorityを使おうとしたところうまくいかず…無理やりSpawnWithClientAuthorityを使おうとしている感じです。やりたいことはボタンが押されたらサーバーにあるゲームオブジェクトの変数を書き換えることなのでその他の方法があればお教えいただけるとありがたいです。
TKM2977

2018/09/24 22:43

追記:そもそもクライアント権限がなく[Command]以下が動作しなかったのでクライアント権限を付与しようとしています。
guest

回答2

0

ベストアンサー

スタートボタンのプレハブStBが正常にインスタンスに設定されていないのではないかと考えられます。

エラーが出ているスクリプトをアタッチしているオブジェクトのインスタンスにStBは設定されていますでしょうか?

投稿2018/09/24 23:11

YHiromichi

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TKM2977

2018/09/24 23:26

回答ありがとうございます!確認してみますね。ほかの原因を探るためにインスペクターなどのスクリーンショットも追加しておきます。
guest

0

結局知人に相談したところだったらNetworkManagerからPlayerを別に生成してそこから処理すれば?と言われました。その方法でできるめどが立ったので解決とさせていただきます。ご助力いただいた皆さんありがとうございました!

投稿2018/09/25 08:55

TKM2977

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問