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

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

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

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

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

TKM2977
TKM2977

総合スコア18

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

2回答

0リアクション

0クリップ

1282閲覧

投稿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#

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class Adjuster : NetworkBehaviour { //public GameObject TimeMuster; public GameObject StB; //スタートボタンのプレハブを格納します public GameObject ReB; //リセットボタンのプレハブを格納します // Use this for initialization [ClientCallback] void Start () { StB = (GameObject)Resources.Load("Prefubs/Start"); ReB = (GameObject)Resources.Load("Prefubs/Reset"); if(StB == null || ReB == null) { Debug.Log("Object is null."); //実行したところ出てきませんでした。 } NetworkConnection Conn = connectionToClient; /*StB = Instantiate(StB,GameObject.Find("Canvas/ControlPanel").transform);*/ NetworkServer.SpawnWithClientAuthority(StB, Conn);//この行でエラーが生じます。 /*if (TimeMuster != null) { TimeMuster.SetActive(true); }*/ if (StB != null) { StB.SetActive(true); } if (ReB != null) { ReB.SetActive(true); } } // Update is called once per frame void Update () { /*if(StB == null) { Debug.Log("X"); }*/ //Destroy(this.gameObject); } }

さらに変更したい変数があるスクリプトも載せておきます。

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; using System; public class TimeMuster : NetworkBehaviour { //このクラスが付いたゲームオブジェクトは変更したい変数があるものです。 public float ElTime; public Text TimeDisp; [SyncVar] public bool started = false; //変更したい変数 public void Start() { //OnStarted(); TimeDisp = GameObject.Find("NowTime").GetComponent<Text>(); } public void Update() { //この下は時間の表示に関するものなのでそこまで意味はないです。 if (started) { ElTime += Time.deltaTime; int M = (int)Math.Floor(ElTime / 60d); float S = ElTime - 60f * M; string SSt = S.ToString("F2"); if(M == 0) { TimeDisp.text = SSt; } else { TimeDisp.text = M + ":" + SSt; } } } public void OnStarted() { //使う予定はありません started = true; } }

試したこと

いったんInstantiateで生成してから、ボタン側でAssignClientAuthorityを実行しようとも考えたのですが、Warningが出てしまい、うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

fiveHundred

2018/09/24 12:57

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

2018/09/24 22:33

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

2018/09/24 22:43

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

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。