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

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

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

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

Unity

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

Q&A

解決済

2回答

2740閲覧

UnassignedReferenceException: The variable XXXX of YYYY has not been assigned.について

sena14

総合スコア109

C#

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

Unity

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

0グッド

0クリップ

投稿2018/05/01 11:37

棒を積み上げていくというゲームを作っているのですが、棒を動かすというところでうまくいかずに困っています。
StickGeneratorで作った棒をMoveButtonの入力によってStickControllerで動かしているのですが、ClickLeft()だけUnassignedReferenceException: The variable now of StickGenerator has not been assigned.と出てしまって左方向にだけ動きません。

調べてみた結果初期化していない変数を使っているなどで出るみたいですが、左方向だけ動かないという点で何が原因なのかわかりません。

よろしくお願いします。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class StickGenerator : MonoBehaviour { public GameObject Stick; public GameObject now; GameObject director; // Use this for initialization void Start () { now = Instantiate(Stick) as GameObject; this.director = GameObject.Find("GameDirector"); } // Update is called once per frame void Update () { } public void CreateStick() { now = Instantiate(Stick,new Vector3(0,5.0f + director.GetComponent<GameDirector>().score),Quaternion.identity) as GameObject; } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class StickController : MonoBehaviour { float speedX = 0; float speedZ = 0; GameObject Generator; // Use this for initialization void Start () { this.Generator = GameObject.Find("StickGenerator"); } // Update is called once per frame void Update () { Generator.GetComponent<StickGenerator>().now.transform.Translate(this.speedX, 0,this.speedZ); this.speedX *= 0.96f; this.speedZ *= 0.96f; } //右へ動かす public void MoveRight() { this.speedX = 0.01f; } //左へ動かす public void MoveLeft() { this.speedX = -0.01f; } //手前へ動かす public void MoveFront() { this.speedZ = -0.01f; } //奥へ動かす public void MoveBack() { this.speedZ = 0.01f; } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveButton : MonoBehaviour { GameObject stick; GameObject Generator; // Use this for initialization void Start () { this.Generator = GameObject.Find("StickGenerator"); this.stick = Generator.GetComponent<StickGenerator>().now; } // Update is called once per frame void Update () { } public void ClickRight() { stick.GetComponent<StickController>().MoveRight(); } public void ClickLeft() { stick.GetComponent<StickController>().MoveLeft(); } public void ClickFront() { stick.GetComponent<StickController>().MoveFront(); } public void ClickBack() { stick.GetComponent<StickController>().MoveBack(); } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

ちょっと今はUnityが手元にないので私の方では未確認ですが、Startの実行順がどうなっているか確認してみてはいかがでしょうか?

もし、移動用ボタンが上下左右4つあり、それぞれがMoveButtonコンポーネントを持っている...という造りだった場合、たとえばたまたま

  • 左移動用ボタンのMoveButtonのStartが実行される
  • GeneratorのStickGeneratorのStartが実行される
  • 上移動用ボタンのMoveButtonのStartが実行される
  • 右移動用ボタンのMoveButtonのStartが実行される
  • 下移動用ボタンのMoveButtonのStartが実行される

なんて実行順になってしまっていると、左移動用ボタンだけがGeneratorの初期化が不完全なままnowを取得してしまい、あとで左移動しようとした時におかしくなるなんてことがあるかも...と思ったのですが、どうでしょう(実際に意図的にそのような状況にして確認したわけではないので不確かです)?

もしそういう造りではなく、MoveButtonがシーン中に一つしか存在しておらず、上下左右ボタンはその唯一のMoveButtonの移動メソッドを使っているのであれば、多分これが原因ではないように思いますので、私の意見は除外してしまってください...

投稿2018/05/01 23:02

Bongo

総合スコア10807

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

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

sena14

2018/05/02 03:15 編集

Startの順番を確認してみたところおっしゃるような順番に呼ばれていました。 調べてみて必ずGeneratorが先に呼ばれるようにとAwake()を使って左のみ動かない問題は解決できました。 ちなみにAwakeを使わずにStartの順番を変更して解決するといったことはできるのでしょうか?
Bongo

2018/05/02 03:28

Startがどの順番で実行されても構わないような相互関係に改良できれば望ましいとは思いますが、場合によっては悩みどころかもしれませんね。 「イベント関数の実行順 - Unity マニュアル」(https://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html )や「実行の順番:OnEnable, Awake, OnLevelWasLoaded, Start - Unityな日々(Unity Geek)」(http://unitygeek.hatenablog.com/entry/2013/09/25/110513 )などが順番検討のご参考になるかと思います。 後者のサイトでも言及されていますが、「スクリプト実行順設定 - Unity マニュアル」(https://docs.unity3d.com/ja/current/Manual/class-MonoManager.html )のやり方で優先度の調整もできるようです。 ただ、複雑に優先度設定して実行順に強く依存するような造りにしてしまうのは、混乱の原因になるような気がします。必要な部分だけに限定して使い、適宜コード中に依存関係についてコメントを記入しておくのがいいのではないでしょうか。
sena14

2018/05/02 03:42

なるほど。 最終的に方法があるということが分かってよかったです。 親切にありがとうございます!
guest

0

StickGenerator が now というメンバーを実装していないからです。

投稿2018/05/01 12:22

Zuishin

総合スコア28656

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

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

sena14

2018/05/01 13:02

すみません。 メンバーを実装していないとは具体的にどこが間違ってるのでしょうか? 同じようにnowを使っているClickRight()ClickFront()ClickBack()が動くのはなぜなのでしょうか?
Zuishin

2018/05/01 13:06

逆に聞きますが、now はどこから出てきました?
sena14

2018/05/01 13:12

StickGeneratorで棒を生成しそれを落として積み上げていくというゲームで、 落とす場所を決めて落としたら次の棒が生成されるということを想定しています。 落とした後の棒は動いてもらっては困るので 今現在落とそうとしている棒という意味でnowという変数を使ってそれだけが動くようにしたいと考えています。
Zuishin

2018/05/01 23:19

すいません。 自分で自分の回答読んで「何言ってんだ」と思いました。 必ず左のみということなら Bongo さんの回答が当たっていそうです。
sena14

2018/05/02 04:25

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問