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

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

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

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

Q&A

解決済

2回答

7734閲覧

FindObjectOfTypeについて教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

1グッド

2クリップ

投稿2018/05/16 15:18

前提・実現したいこと

FindObjectOfTypeはどういう関数かわからないので、教えていただけませんか?
Object.FindObjectOfTypeとありますが、
このObjectには、どういうものを指定すればよいのでしょうか?
できれば簡単なサンプルソースで説明していただけるとありがたいです。

試したこと

なんとなくわかっていること。
・ヒエラルキー上のオブジェクトを全部走査するので重たい。

わかってないこと。
・Object.FindObjectOfTypeのObjectは何なのか。
・FindObjectOfType (Type type) 引数のtypeに何を指定するものなのか?
・何かしら見つけたものが戻り値として返ってくる。

すみません、書いてて気づきましたが、かなり理解できてません。
こちらのサイトを見ましたが、

スクリプトを参照して、スクリプトにアクセスするのがFindObjectOfTypeです。

スクリプト名.FindObjectOfType<スクリプト名>();

上記、左側のスクリプト名と、右側のスクリプト名、それぞれどういう風に指定すればよいかとかもわかりません。
「スクリプトを参照して、スクリプトにアクセスする」という意味もわかりません。

zeta1978👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

Objectとは「Unity が参照できるすべてのオブジェクトの基本クラス」です。
Object - Unity スクリプトリファレンス

例えば人間も猫も雑草もコップも全て「物」であるように、
GameObjectもテクスチャも自作クラスも全部「Object」です。

(これは「そういう仕様になっているから」です。C#の「継承」を調べるとより深く分かるかと思います)


Object.FindObjectOfType<Object>の1つ目のObjectと2つ目のObjectは意味が違います。
1つ目(.の前)は「Objectクラスに実装されているよ」ということを意味します。

transformGetComponentが頭に何も付けなくても使えるように、
FindObjectOfTypeも前に何も付けなくても動作します。

但し前に何も付けない場合は返り値がObject型になります。
FindObjectOfType<GameObject>→GameObjectを探してObject型で返す。(見つけたオブジェクトをGameObject型として取り扱いたい場合は型変換が必要)
GameObject.FindObjectOfType<GameObject>→GameObjectを探してGameObject型で返す。

→前に何も付けなくても<>内の型として返って来ます。

 
2つ目のObjectは探してくるクラスを指定します。

FindObjectOfType<GameObject>ならGameObjectを探す、
FindObjectOfType<SampleScript>ならSampleScriptを探す、
FindObjectOfType<Object>ならObjectを探します。
(シーン上にある該当する物の中からUnityが適当に選んだ1つが返ります。1つも存在していなかったらnullが返ります)


ゲームオブジェクトを参照して、スクリプトにアクセスするのがGetCompornetで、
スクリプトを参照して、スクリプトにアクセスするのがFindObjectOfTypeです。

参照=探し出す、そのオブジェクトを対象とする、というイメージです。

「田中さんを参照して、田中さんの個人情報にアクセスする」のがGetCompornet。
「その場に居る誰かの個人情報を参照して(誰の物かは指定出来ない)、その個人情報にアクセスする」のがFindObjectOfTypeです。

投稿2018/05/17 02:04

編集2018/05/17 02:10
sakura_hana

総合スコア11427

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

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

sakura_hana

2018/05/17 02:12

回答書いてる間にfiveHundredさんが回答されてますが 言ってることは同じです。被り申し訳無い。
退会済みユーザー

退会済みユーザー

2018/05/17 15:06

ご回答ありがとうございます。 まず、Object.FindObjectOfType<Object>の1つ目のObjectに関して理解できました。 そして、なんとなく使い方がわかったのでいろいろコードを書いて試してみました。 確認させていただきたいのですが、 Object.FindObjectOfType<Object>の2つ目のObjectは、クラスを指定するとのことですが、これは言い換えると、コンポーネントを指定するということでしょうか? FindObjectOfType<T>()のTは、GetComponent<T>()のTと同じようにクラス(コンポーネント)を指定するということでしょうか? GetComponent<T>()が、その1つのゲームオブジェクトを対象にアタッチしているTのクラス(コンポーネント)を取得しようとするのに対し、FindObjectOfType<T>()は、シーン上の全てのゲームオブジェクトを対象に、最初に見つかったアタッチしているTのクラス(コンポーネント)を取得しようとするということでしょうか?
sakura_hana

2018/05/18 02:43

>コンポーネントを指定するということでしょうか? その通りです。 >最初に見つかったアタッチしているTのクラス(コンポーネント)を取得しようとする 未検証ですが、確か"最初"とは言い切れなかったように記憶しています(バージョンにより異なるかも。うろ覚えです)。 少なくとも「ヒエラルキー上で一番上」のような意味での最初ではないですし、毎回違うコンポーネントを取って来るかもしれません。確実に特定のコンポーネントを取得したいならGameObject.Findを使用した方がいいです。
退会済みユーザー

退会済みユーザー

2018/05/18 15:34

ご回答ありがとうございます。 自分の解釈が間違ってないか確認させていただきたいのですが、 「確実に特定のコンポーネントを取得したいならGameObject.Findを使用した方がいい」→「GameObject.Findで確実に目的のゲームオブジェクトを取得して、それをGetComponentした方がいい」という意味で合っていますか?
sakura_hana

2018/05/21 02:31

その通りです。 但しGameObject.Findも「同名のオブジェクトが複数ある」場合はどれを取得するかはUnity次第です。 必ず単一な名前を付けるとか、そもそもFind系メソッドを使わないとかの対応を行ってください。 (ご存知の通りFind系メソッドは重い処理なので(GameObject.Findも)、別の方法で参照が取れるならその方がいいです。動作させたい内容や「細ぇこたぁいいんだよ」かどうかによるので一概には言えませんが……)
退会済みユーザー

退会済みユーザー

2018/05/21 07:13

ご回答ありがとうございます。 理解できました。 ありがとうございます。 「その場に居る誰かの個人情報を参照して(誰の物かは指定出来ない)、その個人情報にアクセスする」という表現がとてもわかりやすかったので、ベストアンサーにさせていただきました。
guest

0

・Object.FindObjectOfTypeのObjectは何なのか。

Objectという名前のクラスです。
FindObjectOfType()はstaticな関数なので、Object.FindObjectOfType(typeof(T));Object.FindObjectOfType<T>();という形で呼び出せます。
ただし、MonoBehaviourはObjectの拡張版(子クラス)なので、Object.の部分は省略することが出来ます。

・FindObjectOfType (Type type) 引数のtypeに何を指定するものなのか?

検索したいインスタンスのクラスをtypeof(〜)で指定します。

・何かしら見つけたものが戻り値として返ってくる。

FindObjectOfType(typeof(T))FindObjectOfType<T>()ではT型で返ってきます。
FindObjectOfType(typeof(T))では、Object型で返ってきます。
このObjectはTで指定した型のものなので、FindObjectOfType(typeof(T)) as Tのようにキャストすると、FindObjectOfType<T>()と同じになります。

スクリプトを参照して、スクリプトにアクセスするのがFindObjectOfTypeです。
スクリプト名.FindObjectOfType<スクリプト名>();

これについては、おそらくそのサイトの内容が正しくないと思われます。
FindObjectOfType()はObjectのクラスにあるstaticな関数なので、Object.FindObjectOfType<T>();(あるいは、前述の通り省略できるので、FindObjectOfType<T>();)で呼び出せます。
そのサイトではGameEventControllerScript.〜としてますが、これはGameEventControllerScriptはObjectの拡張版(子クラス)だから呼び出せているだけで、わざわざそのように書く必要はないでしょう。

「スクリプトを参照して、スクリプトにアクセスする」という意味もわかりません。

前述の通り、Object型ではなく、指定した型で返ってくることを指しているのだろうと思います。

ソースについては、ググればいくつか出てくると思うので省略します。

投稿2018/05/17 01:42

編集2018/05/17 02:25
fiveHundred

総合スコア9801

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

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

退会済みユーザー

退会済みユーザー

2018/05/17 15:06

ご回答ありがとうございます。 まず、Object.FindObjectOfType<Object>の1つ目のObjectに関して理解できました。 そして、なんとなく使い方がわかったのでいろいろコードを書いて試してみました。 確認させていただきたいのですが、 Object.FindObjectOfType<Object>の2つ目のObjectは、クラスを指定するとのことですが、これは言い換えると、コンポーネントを指定するということでしょうか? FindObjectOfType<T>()のTは、GetComponent<T>()のTと同じようにクラス(コンポーネント)を指定するということでしょうか? GetComponent<T>()が、その1つのゲームオブジェクトを対象にアタッチしているTのクラス(コンポーネント)を取得しようとするのに対し、FindObjectOfType<T>()は、シーン上の全てのゲームオブジェクトを対象に、最初に見つかったアタッチしているTのクラス(コンポーネント)を取得しようとするということでしょうか?
fiveHundred

2018/05/18 00:34

その解釈で特に問題ありません。 一応、TにコンポーネントではないGameObjectを指定することも出来ますが、その場合でも同じ挙動になります。
退会済みユーザー

退会済みユーザー

2018/05/18 15:21

ご回答ありがとうございます。 最後に1点、質問させていただきたいのですが、 コンポーネントだけでなく、GameObjectも指定できるとのことなのですが、例えば、ヒエラルキーにあるCubeのゲームオブジェクトなども指定できるのでしょうか? var obj = FindObjectOfType<Cube>(); とすると、 Assets/Scenes/Sample.cs(9,37): error CS0246: The type or namespace name `Cube' could not be found. Are you missing an assembly reference? とエラーが出てしまいます。
fiveHundred

2018/05/19 01:06

Cubeは、GameObjectにBoxColliderやMeshRendererなどがアタッチされたものなので、型(クラス)ではありません。 従って、「FindObjectOfType<Cube>();」では取得出来ません。 私が言いたかったのは「FindObjectOfType<GameObject>();」ということが出来るというだけです。 (あまり実用性は無いような気もしますが…)
退会済みユーザー

退会済みユーザー

2018/05/21 07:12

ご回答ありがとうございます。 勉強になりました。 ありがとうございました。 ベストアンサー非常に迷いましたが、sakura様にさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問