まずは以下の2つのコードを見ていただきたいです。
GameManager.cs
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class GameManager : MonoBehaviour 6{ 7 public static GameManager instance; 8 9 public void Awake() 10 { 11 instance = this; //←この行の意味がわからない 12 } 13 14 public void Test() 15 { 16 Debug.Log("コンソールに表示"); 17 }
Sample.cs
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Sample : MonoBehaviour 6{ 7 void Start() 8 { 9 GameManager.instance.Test(); 10 } 11}
※Udemyの『【Unity 入門】2DアクションRPGを作って、Unityゲーム開発を始めよう!!』という講座で使用された関数を、質問内容に影響が出ないように改変したものです。※
GameManager.csを空のオブジェクトに、Sample.csを特定のオブジェクトにそれぞれ付け加えると、コンソール画面上にはきちんと「コンソールに表示」と記載されます。
結果は上手く行きましたが、GameManager.cs 11行目のinstance = this;
が必要な理由がわかりません。
7行目でGameManager型にinstanceを宣言しているのに、11行目でinstanceにthisを代入する意味がわかりません。
上記Udemy講座内にて、「thisはGameManagerのこと」と先生がおっしゃってました。クラス型変数としてインスタンスを宣言しているのに、インスタンスにクラスを代入するのが一番謎です。 ←これが個人的に一番わけがわからない原因です。
実際9〜12行目を消去したところ、NullReferenceException Sample.cs 9行目 になってしまいます。
そもそもこのエラーの意味も曖昧なのが、instance = this;
の存在意義がわからない原因なのかもしれません。
※※※私の理解しているところを以下に記載します。※※※
1〜3行目省略
GameManager.cs
7行目:GameManagerというクラス型に、インスタンスであるinstanceという変数を宣言した。
9行目:Awake()はStart()より先に行われる関数。
11行目:わからないです。教えてください。
14行目:Test()という関数を自分で設定した。
16行目:Test()という関数が使用されたら、コンソール上に「コンソールに表示」と表示される。
Sample.cs
7行目:Awake()の次に行われる関数。Unityでスタートボタンが押されたら一度だけ発動する。
9行目:GameManagerというスクリプト内で宣言された、instanceという変数名のインスタンスの中で使われているTest()という関数を使え。
これは質問とは関係ありませんが、
例えば
C#
1int a; 2 3public void Add(int a) 4 { 5 this.a = a; 6 }
で使用されているthis.a
の意味はちゃんとわかっているつもりです。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。