こんにちは!
子供向けプログラミング教室kobakoスタッフです。
Unityを学習していくと陥る、「GameObject.Find()とtransform.Find()って何が違うんだ?」という疑問にお答えします。
ところで・・・
この記事を書いている人はだれ?
子供向けプログラミング教室です!
JavaScriptを使ったゲームプログラミング、ゲーム企画が得意な教室です。
プログラミング教室で実際に使用している、学習成果のある教材をYouTube無料配信しています。
GameObject.Find()
GameObject.Findは、シーン上からゲームオブジェクトを検索して取得します。
ただ、気をつけないといけないのが、アクティブなゲームオブジェクトを検索することです。
SetActive(false)されてしまったゲームオブジェクトはGameObject.Findでは検索することはできません。
これが結構、初心者〜中級者でハマる部分かと思います。
「ちゃんとゲームオブジェクトがあるはずなのに取れない!」なんて経験、Unity経験者であればあるあるかと思います。
FindObjectOfTypeもそうですね。非アクティブな状態なゲームオブジェクトは取得できません。
ただ、そもそもですが、GameObjectのSetActiveを編集しないように気をつけるというのもあるかと思います。
例えば、Canvasなどでは、WrapperといったPanelを配置しておき、Wrapper自体を非アクティブにすることで表示を非表示にするなど、
コンポーネントスクリプトを持っている親はアクティブ、非アクティブを操作しないというのが混乱しない方法かと思います。
transform.Find()
一方、transform.Findは自分自身から見たパスでゲームオブジェクトを取得します(型はTransformです)。
さらに、GameObject.Findと違い、非アクティブでも取得できます。
これは、例えば、Canvasなどで、表示したり非表示したりを頻繁に行う子オブジェクトを取得するときには有効な手段です。
GameObject.Findよりも、transform.Findを使う場面が、実際には多いかなぁという印象があります。
(GameObject.Findはそもそもちょっとヘヴィな処理なので、あまりおすすめはされていません。)
Unityのノウハウがあるプログラミング教室
プログラミング教室kobakoは、現役のUnityエンジニアが在籍するプログラミング教室です。
実際に現場で使っているノウハウが学べるため、効率的にUnityを学ぶ環境がkobakoにはあります。
Unityを極めたい生徒さん、ぜひ遊びに来てみてくださいね。
無料体験へのお申し込みはこちらから!
kobakoのゲームプログラミング教材もYouTubeで無料配信中です!
初回の授業料(体験)は無料です。
※現在はオンライン授業でのみ対応しています。通学型ではありません。