Unityスクリプトリファレンスの見方【C#用語解説】

question thumbnail

Unityでスクリプトを書こうとした時にUnityのスクリプトリファレンスを見ることはよくあると思います。

しかしながら、まだプログラミングについて詳しくない状態だとスクリプトリファレンスに書いてある用語がわからない事はよくあると思います。

日本語訳自体がよくわからない時もありますが

そんな時困らないように各種プログラミング用語についてまとめてみました。

プログラミングそのものが全くわかっていないよという方は↓の記事から参考にしてください。

また、Unityのスクリプトリファレンスに書いてあるのはUnityが用意した既存のものですが、自分で書いたクラスに同じような意味合いを持つものも実装できますので参考にしてみてください。

<変数とは>

変数が何かという事については↓の記事でまとめているのでこちらを参考にしてください。

<Protected変数とは>

そのクラスを継承した先のスクリプトのみが使用できる変数です。

<Static変数とは>

static変数というのはプログラムの開始から終了まで値が保持され続ける変数です。

staticというのは「静的な」という意味で、プログラム開始時にメモリを確保したら終了までその領域を保持し続けます。

通常の変数は生成時にインスタンス化されてメモリを確保されますが、static変数は最初から存在してメモリの位置が固定されています。

確保したメモリ位置が固定されている為、static変数がアクセス修飾子で公開範囲を広げている場合、公開範囲内であればどこからでもアクセスする事ができるようになります。

つまりpublicな変数であればどこからでもアクセスが可能となっています。

Unityのスクリプトリファレンスに書いてあるstatic変数はpublicなものである為、どこからでもアクセスする事が可能です。

また、メモリ領域が固定になる事からこの変数は「ゲーム中唯一のデータ」として扱う事ができます。

このように「公開範囲内のどこからでもアクセスできる」「ゲーム中唯一のデータ」である事から様々な便利な使い方ができますが、同時にずっとメモリを占有するというデメリットも存在します。

自分でstatic変数を定義する場合は気をつけて定義しましょう。

その為、主にゲームプレイ開始時から終了時までずっと保持していて欲しいデータに使用される事が多いです。

注意していただきたいのは領域が固定なだけであって中身が固定なわけではないので、データの中身を入れ替える事は可能です。

使い方は 型名.static変数名 でアクセスする事ができます。

例 transform.position += Vector3.back;

この場合、「back」がVector3のstatic変数です。最初から中身が定義されているので特に指定する事なく使う事ができています。

<メソッドとは>

メソッドが何かという事については↓の記事でまとめているのでこちらを参考にしてください。

<関数とは>

メソッドとほとんど変わらない物です。

概念が違うらしいです。やってること自体は大差ありません。

関数は、定められた通りの処理を実行して結果を返す一連の命令群です。

メソッドはオブジェクト指向で登場する用語で、オブジェクトの動作を定義したものです。

こう見ると全然違うように見えますが、基本的な書き方もやっている事も変わらないので、メソッドとは考え方が違うだけと覚えておけばいいかなと思います。

その為、オブジェクト指向型のプログラムではメソッド、それ以外のプログラムは関数と呼ぶ事がほとんどのようです。

UnityはC#ですので本来はメソッドというのが正しいようですが、公式のスクリプトリファレンスは「関数」としているみたいです。

使い方は変わらないので正直どっちでもいいですが

<Protected関数とは>

そのクラスを継承した先のスクリプトのみが使用できる関数です。

<Static関数とは>

static変数の関数版と考えていただいて大丈夫です。詳しくはstatic変数の項目を参照してください。

この関数内では静的ではない変数や関数は使用する事はできません。

使い方は 型名.static関数名 でその関数を実行する事ができます。

//原点から見た自分自身の方向を受け取る
Vector3 v = Vector3.Normalize(transform.position);

↑の場合Vector3.Normalizeがstatic関数になります。クラスをインスタンス化しなくても使えるので便利です。

<コンストラクタとは>

コンストラクタというは、クラスのインスタンス生成時に実行されるメソッドです。

主にそのクラスのメンバ変数を初期化するときに使用します。

使い時はnewしてインスタンスを生成する時です。

例 Vector3 v = new Vector3(1,2,3);

↑の場合ただ作成するだけでなく初期値を渡してインスタンス化された時に予めX,Y,Zの値を入れるようにしています。

<メッセージとは>

対象のクラスが指定したメソッドを持っていた場合、そのメソッドを実行します。

例えば、CameraにはOnWillRenderObjectというメッセージがあります。これはカメラに映ったものへ送るメッセージです。

その為、「対象のクラス」は映ったゲームオブジェクトにくっついているコンポーネント全てになります。


void OnWillRenderObject()
{
  Debug.Log(“このオブジェクトがカメラに映っている”);
}

↑このようなメソッドが書かれたスクリプトが映ったゲームオブジェクトにくっついていた場合、映っている間このメソッドが呼ばれます。

<デリゲートとは>

デリゲートはメソッドを参照するための型です。

アクセス修飾子 delegate 返り値 デリゲート名( 引数 );

で定義する事ができます。

ここで定義した返り値と引数が同じ形で定義されているメソッドを参照する事ができます。

例えば

private delegate bool AAA( int a);

で定義したとします。

private delegate bool AAA( int a);  //←デリゲート定義
private AAA aaa; //←デリゲートの変数を作る

void Start()
{
     aaa = BBB;//定義されたデリゲートと、引数と返り値が同じメソッドを入れる事ができます。
   Debug.Log(aaa(2)); //定義した引数を入れてあげると入れたメソッドを実行します(falseと表示されます)
}

public bool BBB(int b)
{
     return (b == 0);
}

このようにデリゲートの形を定義して、定義したデリゲート型の変数を作る事でメソッドを変数に入れて実行する事ができるようになります。

aaa(2)の部分がメソッドを実行している部分です。変数(引数)とする事で変数の中に入っているメソッドを実行する事ができます。

ちなみにこれは参照を変数に入れているので参照の数を足したり引いたりする事ができます。引けるのは既に変数が入っているもののみです。

private delegate bool AAA(int a);
private AAA aaa;

void Start()
{
    aaa = BBB;
    aaa -= BBB; //既に変数の中に入っている参照を消せます。
    aaa += BBB; //参照を足すこともできます。
    aaa += CCC;
    aaa += CCC; //同じものを何回も足すこともできます。
    Debug.Log(aaa(2));
}

public bool BBB(int b)
{
   Debug.Log("BBBが呼ばれた");
     return (b == 0);
}
public bool CCC(int c)
{
   Debug.Log("CCCが呼ばれた");
     return (c == 2);
}

↑のようにデリゲートの変数に足し引きができます。

複数の参照が足された場合、1回の実行で全て実行されます。

↑だと「BBBが呼ばれた」「CCCが呼ばれた」「CCCが呼ばれた」と表示されます。

そして最後に「true」と表示されます。

デリゲートの返り値で返ってくるのは最後に足したメソッドの返り値になります。

Unityの実際の例でいうとCameraのonPostRenderは引数にCamera,返り値なしのデリゲート型のstatic変数です。

これはカメラのレンダリングが終わったらUnity側が呼び出します。

void Start()
{
  Camera.onPostRender += EndRendering; //デリゲート型の変数にメソッドを入れる
}

public void EndRendering(Camera came)
{
  Debug.Log(came.name + “のレンダリングが終わりました”);
}

<イベントとは>

例えば「プレイヤーがボタンを押した、タップした」とか、「画面にグラフィックが表示された」とかコンピュータ上で発生する事象の事をイベントと言います。

イベントが発生した時に行う処理が発生した時に行う処理の事をイベントハンドラーと言います。

使い方としてはイベントハンドラーで定義されたデリゲートに合うような処理を渡してあげれば、イベントが起こった時にその処理を行ってくれます。

private void Start()
{
 Canvas.willRenderCanvases += aaa;
}
private void aaa()
{
 Debug.Log("レンダリング前");
}




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