コンポーネント周りのコードを知りたい人
コードなんて覚えてないから、コピペでサクっと作業を終わらせたい!
コピペをしたはいいけれど、仕組みが分からなくて書き換えられない…。
こういったご要望に答えます。
本記事の内容
●書き換えに役立つサンプルコードの詳細
この記事を書いている私は12才からフルスクラッチでゲームを作っています。
またコンパイラを専門として情報理工学の博士まで進学、中退をしており、プログラミング言語の文法にも関わる論文を書いていました。
本記事はサクっと使える実行済みのコードを紹介しつつ、応用のための知識にも触れていきたいと思います。
※実行環境:Unity2021.3.1f1
そのまま使える、Component周りのサンプルコード
お急ぎの方は以下からどうぞ。
必要な名前を埋めるだけで使えます。
//GetComponent:名前でコンポーネントを取得する
コンポーネントインスタンス名 = GetComponent<コンポーネントクラス名>();
//RquireComponent:名前でコンポーネントを自動的に追加する
RequireComponent(typeof(コンポーネントクラス名))
//AddComponent:名前で指定したコンポーネントを追加する
ゲームオブジェクトインスタンス名.AddComponent<コンポーネントクラス名>();
//Destroy:コンポーネントインスタンスを削除する
Destroy(コンポーネントインスタンス名);
●コンポーネントインスタンス名
「private Transform _transform」などの変数名
●コンポーネントクラス名
「public class TestCube : MonoBehaviour」などのクラス名、ファイル名と同じハズ
●ゲームオブジェクトインスタンス名
「gameObject」などの変数名
書き換えに役立つサンプルコードの詳細
GetComponent
コンポーネントはC#ファイルのクラス名だと思って構いません。
おそらくTransformやRigidbodyなど、Unity標準のコンポーネントも同じような仕組みで、Transform.csなどがあるものと考えていいと思います。
返り値にはインスタンスが入るので、Unityのインスペクタで入力したフィールドの値やメソッドを活用できるワケです。
<>内にクラス名を指定するのはジェネリックっていう文法ですね。
仮にジェネリックじゃないとすると「GetRigidBodyComponent」など、わざわざコンポーネントを作るごとに取得用の関数を用意する必要が出てきそうです。
RequireComponent
角カッコでくくられてるのは、C#の「属性」という文法です。
属性は引数も取れるので、コンポーネントクラスのtypeofを引数に与えています。
Unityはコンパイル時点でRequireComponent属性を確認し、
対応するコンポーネントを自動で追加するようです。
AddComponent
こちらも同様にジェネリックですね。
GetComponentと発想はほとんど変わらないと思います。
強いていうならばコンポーネントを付けるタイミングは考えておくべきで、
例えばUpdate関数とかに書いてしまうと毎ループコンポーネントが増え続けます。
そういう狙いであればいいのですが、気を付けてください。
Destroy
C#の予約語に見えて実はUnityで定義されている関数だったりします。
最近のコンピューターはメモリがもの凄くデカいので、
趣味とかでメモリの管理を意識しない限りはテキトーでもいいっちゃいい気がします。
UnityというかC#でこういうコードを書いた際に、
メモリのどこががどういう順番で使用され、解放されるべきなのか。
みたいなことをザックリ分かっておくと真価を発揮すると思います。
今回は以上です。
Unityはいいぞ。
コメント