見出し画像

【unity】unityにおけるインスタンス化とコンポーネントについての解釈【c#】

c#を学びunityに触れた頃から「…インスタンス化してなくない?」とか「コンポーネントって何よ」という疑問がずっとあって放置していたが、その辺色々何となく分かってきた気がするので備忘録がてらまとめ。

■クラスのインスタンス化

どうやらunityでは、基本的にc#のスクリプトを作成しそれをゲームオブジェクトにアタッチすると自動でインスタンス化するらしい。(MonoBehaviourがないとアタッチ不可なので必須)
じゃあabstractクラスはどうなのかと試してみたら、そもそもアタッチできなかったので確かに合ってそう。
通常のc#同様newでインスタンスを生成することもできるが、どういう使い分けをするのかはイマイチ分からない。MonoBehaviourの有無?
地のコード力が高い人ほどunityの機能に頼らずに必要に応じてnewしてそう(ソースなし)

abstractだから無理だよと書いてある気がする


■コンポーネントとインスタンスの違いとは

違いはない。コンポーネントとインスタンスは実質同じっぽい。 
厳密に言うとコンポーネントはインスタンスだが、インスタンスにはコンポーネントでないものもあるという感じ?(MonoBehaviourがなくnewで生成したものはコンポーネントにはなれない)
基本的にc#においてクラスは設計図で実際に動くものは全てインスタンスなので、ゲームオブジェクトだろうとコンポーネントだろうとインスタンスという話。

なのでGetComponentとは既に生成されたインスタンスを取得して、その中身をいじいじする為のものだったというわけだ。はーなっとく。

ちなみにゲームオブジェクトにくっついてるコンポーネントやスクリプト(これもコンポーネントだが)を取得するには
gameObject.GetComponent<コンポーネント名>().スクリプトであれば変数等
でよいと。
自分のRigidbody2D等を取得する時はgameObjectを省略しているというわけだ。なるほどー。


■まとめ

・ゲームオブジェクトにアタッチされたスクリプトのクラスは、自動でインスタンス化されるのでnewで生成する必要はない
・コンポーネントとはインスタンス
・GetComponentはインスタンスをいじいじするやつ
・細かな所は違うかもしれないがとりあえずすっきりした気がする


■参考資料




この記事が気に入ったらサポートをしてみませんか?