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

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

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

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

Q&A

解決済

3回答

30092閲覧

thisとthis.gameObjectの違い

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

1グッド

3クリップ

投稿2017/01/27 08:53

編集2017/02/01 14:34

###前提・実現したいこと

thisとthis.gameObjectの違いは何なのでしょうか?
また、自身にアタッチしているコンポーネントを取得する際は、どちらで書くべきなのでしょうか?

下記のように出力をとったところ、

C#

1 Debug.Log (this); 2 Debug.Log (this.gameObject);
ゲームオブジェクト名 (クラス名) ゲームオブジェクト名 (UnityEngine.GameObject)

と表示されました。

どうやら、

this → クラス。 this.gameObject → そのクラスがアタッチしているゲームオブジェクト。

(↑合っていますか?)

ということらしいのですが、その使い分けがわかりません。

例えば、そのゲームオブジェクトにアタッチしているAnimatorを取得するとき、
GetComponentの呼び出しは、下記においてどちらを使うべきですか?
また、下記2つの書き方で違いはあるのでしょうか?
(どちらもコードは通りました。)

C#

1Animator animeData = this.GetComponent<Animator> (); 2Animator animeData = this.gameObject.GetComponent<Animator> ();

thisとthis.gameObjectの違いや、使い分けのご教授をお願いします。

###追記

ゲーム再生時にNullエラーが起きるのを検証しようとしました。

まず、ゲームオブジェクトにアタッチしているスクリプトを下記のようにしました。

C#

1using UnityEngine; 2using System.Collections; 3 4public class Sample: MonoBehaviour{ 5 6 void Start () { 7 Hoge hoge = new Hoge (); 8 } 9}

次にゲームオブジェクトにアタッチさせないスクリプトも、MonoBehaviourを継承させて、下記のようにしました。

C#

1using UnityEngine; 2using System.Collections; 3 4public class Hoge: MonoBehaviour{ 5 6 void Start () { 7 Debug.Log(this.gameObject); 8 } 9}

ゲーム再生時に発生したエラー(警告文)。
「MonoBehaviourを継承したクラスはnewできない」のでしょうか?

You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all UnityEngine.MonoBehaviour:.ctor() Hoge:.ctor() Sample:Start() (at Assets/Sample.cs:7)
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

既にベストアンサーが付いていますが、正確には
「普通に使う分には同じようなものだけど、本質的には別のもの」なので
特例を記載しておきます。

this → クラス。
this.gameObject → そのクラスがアタッチされているゲームオブジェクト。

これはその通りです。

Animator animeData = this.GetComponent<Animator> ();
Animator animeData = this.gameObject.GetComponent<Animator> ();

これも大体のケースにおいてどちらでも構いません。

但し、以下のスクリプトではどうでしょうか。

C#

1public class Hoge { 2
 GameObject gameObject; 3

 // Use this for initialization
 4 void Start () {5 this.GetComponent<Animator> (); //エラー! 6
 this.gameObject.GetComponent<Animator> (); //問題無い
 7 } 8}


コメントにある通り、this.GetComponentはエラー(ビルドが通らない)になり、this.gameObject.GetComponentは正常に動きます。
何故かというとこのHogeクラスは**「MonoBehaviourを継承していないから」**です。

Unityの基本的なクラスは「MonoBehaviour」というクラスを継承して作られています。
public class Test : MonoBehaviour { }
とクラス宣言をした時、「:」の後ろが継承元のクラスです。
Hogeクラスではこの宣言が無いので、継承元が何も無いクラスということになります。

継承というのはオブジェクト志向のプログラムの考え方で、ざっくり言うと
「そのクラスは勝手に継承元の機能を持つ」という特性があります。
つまりMonoBehaviourで「GetComponent」というメソッドが実装されているので、
MonoBehaviourを継承した自作クラスではGetComponentを実装しなくてもGetComponentを使える、ということになります。

逆に言うと、MonoBehaviourを継承していないクラスではGetComponent(などのMonoBehaviourで実装されているメソッドやプロパティ)が使えません。
なので、
「thisがMonoBehaviourを継承しているのであれば、this.GetComponentでもthis.gameObjectでもどちらでもいい。継承していないならどちらも使えない(※)」
というのが正式な回答となります。

※「this.gameObject」もMonoBehaviourで用意されているプロパティなので継承するか、
上記HogeクラスのようにgameObjectという名前の変数を持つ必要があります。
GameObjectクラスはMonoBehaviourを継承しているので、Hogeクラスの中でもgameObject.GetComponentは正常に動作します。

まぁMonoBehaviourを継承していないとスクリプトをGameObjectにアタッチ出来ないので、滅多に無い事例ではあるのですが……
データを保存しておくだけのクラスやエディタースクリプト、プラグインスクリプトだったらあり得るかもしれないパターンなので記載しました。いつかどなたかの役に立てば幸いです。

投稿2017/01/30 07:01

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2017/01/30 17:48 編集

ご回答ありがとうございます。 実際にコードを書いて、検証してみました。 (ゲームオブジェクトにアタッチしたスクリプトの中で、アセットのHogeクラスをnewするという検証方法ですが、その検証方法で間違っていませんか?) 違いがはっきりわかりました。ありがとうございます。 「MonoBehaviourを継承していないとスクリプトをGameObjectにアタッチ出来ない」、というのも知りませんでした。 ちなみに、データを保存しておくだけのクラスやエディタースクリプト、プラグインスクリプトでも、MonoBehaviourを継承させて問題はないですか? データを保存しておくだけのクラスやエディタースクリプト、プラグインスクリプトは、MonoBehaviourを継承する必要性がないという理由や、継承しない方が処理が軽くなるという理由で、MonoBehaviourを継承させないのでしょうか?
sakura_hana

2017/01/31 01:13

>ゲームオブジェクトにアタッチしたスクリプトの中で、アセットのHogeクラスをnewするという検証方法 こちらで問題無いです。 >MonoBehaviourを継承していないとスクリプトをGameObjectにアタッチ出来ない 実は私も今回調べて初めて知りましたw >データを保存しておくだけのクラスやエディタースクリプト、プラグインスクリプトでも、MonoBehaviourを継承させて問題はないですか? 特に必要性が無いならば継承させない方がいいかと思います。 例えば継承させた状態だと「this.gameObject」はビルド時にはエラーになりませんが、そのスクリプトをシーン上のGameObjectにアタッチしていない場合、ゲーム再生時にNullエラーを吐きます。 一方継承しない状態でgameObject変数を自作した場合、目的のGameObjectを変数に入れる処理も実装している筈なので、この手のエラーが起こりにくいです。 まぁすぐに直せばいい話なのですが、たまに「ぱっと見正常なコードに見えるので原因箇所だと気付きにくい」「MonoBehaviourの仕様の所為でエラーになる」などのパターンもあるので出来るだけ可能性は減らしておいた方がいいかと。 処理負荷の差が出るかは分からないで、気になるなら検証されてみるとよいかもしれません。 (数万単位のクラスをインスタンスしない限り変わらないかなーとは思いますが)
退会済みユーザー

退会済みユーザー

2017/02/01 14:38 編集

ご回答ありがとうございます。 >例えば継承させた状態だと「this.gameObject」はビルド時にはエラーになりませんが、そのスクリプ >トをシーン上のGameObjectにアタッチしていない場合、ゲーム再生時にNullエラーを吐きます。 上記、Nullエラーを検証してみようとコードを書いたのですが、 他のエラーが出てしまい検証できませんでした(質問欄の追記に記述しました)。 そのエラーなんですが、MonoBehaviourを継承したクラスはnewできないと書かれているように見えるのですが、 「MonoBehaviourを継承したクラスはnewできない」のでしょうか? また、上記のNullエラーは、どのようなコードを書けば検証できますか?
sakura_hana

2017/02/02 07:38

>「MonoBehaviourを継承したクラスはnewできない」 その通りです。そしてこの仕様をすっかり忘れていました…… なので下記の現象は発生しないです。わざわざ検証頂いたのに申し訳ありません。 >例えば継承させた状態だと「this.gameObject」はビルド時にはエラーになりませんが、そのスクリプトをシーン上のGameObjectにアタッチしていない場合、ゲーム再生時にNullエラーを吐きます。
退会済みユーザー

退会済みユーザー

2017/02/03 13:15

ご回答ありがとうございます。 MonoBehaviourを継承したクラスはnewできないんですね、ありがとうございます。 thisとthis.gameObjectの違い、そしてMonoBehaviourとクラスの関係などが理解できました。 ご教授くださりありがとうございました。
guest

0

destroy(this); スクリプトのみ消える
destroy(this.gameobject); ゲームオブジェクトごと消える
あたりがわかりやすいんでないかな

子オブジェクトのパーティクルは残すがこのスクリプトは消したいとか

投稿2017/02/01 09:14

編集2017/02/01 09:15
Ans

総合スコア75

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

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

退会済みユーザー

退会済みユーザー

2017/02/01 14:22

ご回答ありがとうございます。検証してみようと思います。
guest

0

特に違いはないと思います。
ショートカットくらいの感じで使ってます。

投稿2017/01/27 10:48

edo_m18

総合スコア2283

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

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

退会済みユーザー

退会済みユーザー

2017/01/27 15:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問