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

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

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

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

Unity

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

受付中

Unity このコードで使用されているthisの意味がわからないです。

kiriyama
kiriyama

総合スコア12

C#

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

Unity

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

5回答

0評価

1クリップ

490閲覧

投稿2022/04/26 08:25

編集2022/04/28 10:18

まずは以下の2つのコードを見ていただきたいです。

GameManager.cs

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { public static GameManager instance; public void Awake() { instance = this; //←この行の意味がわからない } public void Test() { Debug.Log("コンソールに表示"); }

Sample.cs

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { void Start() { GameManager.instance.Test(); } }

※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#

int a; public void Add(int a) { this.a = a; }

で使用されているthis.aの意味はちゃんとわかっているつもりです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C#

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

Unity

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