【Unity入門】UnityのC#基礎【インスタンス】

この記事は本のように順を追って解説しています。この記事は途中のページになります。この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<インスタンスとは>

このサイトではオブジェクト指向を「設計図」と「実体」という風に例えています。

インスタンスというのはこの「実体」に当たるものです。

設計図を元にして作られた実体によってゲームは構成されます。実体になるという事はメモリに乗るという事です。

ところで、実体になっただけでは「そこにあるだけ」ですので、プログラムから制御したり、操作したい時には実体にアクセスしなければいけません。

インスタンスにアクセスするために、インスタンスを”捕まえる”必要があります。

以前はUnityが自動で実体を捕まえてくれていましたが、今回は手動で設計図の実体を作ったり、捕まえたりしたいと思います。

<GetComponent>

さて、以前スクリプトをインスペクターウィンドウにドラッグ&ドロップでインスタンス化させていました。

attach script

↑のようにゲームオブジェクトに貼っつけるとすでにインスタンス化した状態になります。

さて、transformの時はUnity側が勝手に変数の中にインスタンス(実体)を入れていてくれました。今回はtransformのようなコンポーネントを自分で取得しようと思います。

まずは以前のようにCubeを作成してください。よくわからない方はこちらから

game-object-cube

さて、今現在、同じゲームオブジェクト内にくっついているコンポーネントでBox Colliderというものがあると思いますが、これを捕まえてみようと思います。

GetComponent

↑のように書いてみてください。そして、Cubeにこのスクリプトをくっつけてください。

BoxCollider box = null;

でBoxCollider型の変数boxを定義しています。そして nullというものを代入しています。これは何かというと「何もない」という意味です。

以前変数を箱と例えていましたから、この場合空(カラ)とも言えます。

そして、Debug.Logでboxの中身を表示させています。

box = GetComponent<BoxCollider>();

これは同じゲームオブジェクトについているコンポーネントを取得する命令です

MonoBehaviourを継承しているため使えます。< >の中に取得したいコンポーネントの型を指定します。

同じコンポーネントがいくつもついているとどれを取ってくるのかわからないので同じコンポーネントを同じゲームオブジェクトにいくつもつけるのはやめておいたほうがいいかもしれません。どれを取ってくるかは端末次第になるので自分はうまく動いていていても違うPCとかだと動かなくなる危険性があります。

さて、これを実行してみると

get instance

最初Nullで何も入っていなかったのが、GetComponentで中身が入っていることがわかります。

これでboxの中にインスタンスを入れることができたのでboxからBoxColliderのコンポーネントにアクセスすることができます。

Point

・GetComponentはコンポーネントのインスタンスを捕まえる事ができるよ!
・< > の中で指定した型のコンポーネントを捕まえられるよ!

<GameObject.Find>

さて、↑の例ではスクリプトを貼っつけたゲームオブジェクトと同じゲームオブジェクトからしか取ってこれませんでした。

では他のゲームオブジェクトを捕まえるにはどうすればいいかというと

GameObject Find

↑のように書いてみてください。

削除していなければシーン上にDirectional Lightというゲームオブジェクトがいると思うのでそれを捕まえてみます。

GetComponentの時と同じように空の変数を用意します。そして

g = GameObject.Find(ゲームオブジェクトの名前);

とします。

log Game Object Find

これで実行すると↑のようにちゃんと変数の中に入っているのがわかります。

さて、別のゲームオブジェクトを捕まえられたということは、そのゲームオブジェクトについているコンポーネントも捕まえることができます。

Game Object Find And GetComponent

Directional LightにはLightというコンポーネントがついていると思いますが、これを捕まえてみます。

すでにDirectional Lightを捕まえて変数gの中に突っ込んでいるので

g.GetComponent<Light>();

これでDirectional LightについているLightを捕まえることができます。

GetComponentは自身についているコンポーネントを捕まえる命令なのですが、「g.(ドット)」とすることによって、変数gにあるインスタンス(実体)にアクセスし、その中のGetComponentを呼んでいます。

これにより「自身」にあたるのはCubeではなくDirectional Lightということになります。C#では「インスタンス.(ドット)」とすることでその実体の中身にアクセスすることができます。

例外とか色々ありますが、今は↑の認識でいいかなと思います。

さて、これによりシーン上に存在するどのゲームオブジェクトのコンポーネントでもアクセス可能になりました。色々なことができるようになりそうです。

Point

・GameObject.Findでゲームオブジェクトのインスタンスを捕まえられるよ!
・インスタンス.(ドット)でその実体の中身にアクセスする事ができるよ!

<new>

さて、↑ではゲームオブジェクトとかコンポーネントとかUnityの機能で既に実体化しているインスタンスを捕まえていましたが、インスタンスを作ることもできます。

new instance

さて↑のように書いてみてください。

Vector3にもnullを代入したいところなんですが、Vector3はnull非許容型といって、nullが入れることができないので、いきなりインスタンスをぶち込みます。

Vector3 v = new Vector3();

この部分ですね。

new 型名(); 

とすることでその型のインスタンスを作成することができます。

Vector3というのはコンポーネントではないので、ゲームオブジェクトにくっつけてインスタンス化することができません。このようにコンポーネントではないclassはnewしてあげることによって実体を得るわけです。

ちなみに、インスタンスを持っていない状態でアクセスしようとするとエラーになります。当たり前ですけど。

<値型と参照型>

さて、ここで疑問に思った方もいるかもしれません。GetComponentとかGameObject.Findとか、シーン上で既にインスタンス化(実体化)しているにも関わらず、それが入る変数(箱)を用意しています。

箱を用意するということはその分だけのメモリを確保するということになります。シーン上でもメモリを使い、スクリプト上でもメモリを使い、食いすぎじゃないのか?ということですね。安心してください。

変数の型によって値型と参照型というのに分かれます。

値型というのは呼んで字のごとく値をもつ型の事です。intとかfloatとかですね。絶対に箱の中に実体そのものが入っています。まぁ、今までのイメージ通りのものだと思ってもらって大丈夫です。

参照型というのはちょっと特殊なのですが、インスタンスの場所を示したものが入っています。要は箱の中に入っているのはインスタンスではなくインスタンスがある場所のメモと言えるかもしれません。先程から「インスタンスを捕まえる」と言っていましたが、これは「インスタンスを見つけてその場所をメモする」ということになります。

ちなみにclassは参照型になります。コンポーネントは全てclassであり、GameObjectもclassなので、GetComponentもGameObject.Findも実体そのものを捕らえてきたわけではなく、メモリの場所を特定してその場所を伝えてきたという感じになります。

そのため、実体が複数存在するわけではなく、メモリも食いまくっていたわけではないことがわかります。

この値型と参照型というのはわりと厄介です。今回のUnity入門編ではプログラムメインのお話は今回で終わりますが、入門から先のステップに踏み出した時に色々注意しないといけないので覚えておくと良いでしょう。

<まとめ>

さて、今回はインスタンスを捕まえたり、作ったりする方法について解説しました。色々なものを操作する上でインスタンスを理解しておくのは重要なので覚えておいてください。

Point

・nullは何もないという意味だよ!
・インスタンスは実体化しているものだよ!
・newでインスタンスを作る事ができるよ!
・型には値型と参照型があるよ!
・値型は実体そのものが入っているよ!
・参照型は「実体がある場所」を記したメモが入っているよ!

覚えておきたい

・GetComponent<型名>();
・GameObject.Find(“ゲームオブジェクト名”);

<わからない事があったら>

このサイトの説明ではよくわからなかったとか、もっと知りたい事などがあれば、また別の勉強方法があるので違った切り口を使ってみるのもいいと思います。

<オススメの本>

本で詳しい解説がされているので書籍を買ってみるというのも手の一つです。最近はKindle版があるので届くまで待つ事もなく場所も取らないのでとても良いです。

<オンラインスクール>

オンラインスクールでは人に質問する事ができるので、行き詰まってしまった方にオススメです。 無料体験もあるので試しに見てみるのも手ですよ



タイトルとURLをコピーしました