C#
Unity
備忘録

[備忘録]Unity で始める C# その3

Unityの仕組み

シーン
ゲームの1つ1つの画面を表すもの。キャラやゲームオブジェクトをここに配置する。
コンポーネント
ゲームオブジェクトに関連付けるもの。機能を追加する。スクリプトもコンポーネントの1種。
「ボタン機能」「物理演算機能」「衝突判定機能」「エフェクト機能」「サウンド機能」などが
コンポーネントにある。つまりコンポーネントにない足りない部分をスクリプトで書いて対応する。
イベント関数
StartメソッドやUpdateメソッドのこと。Unityのシステムから自動的に呼び出されるもので、
イベント関数と呼ばれる。関数はメソッドとほぼ同じ意味。他にも衝突時に呼び出される
OnCollisionEnterやOncollisionExit、マウス操作で呼び出されるOnMouseDragなどがある。

Unityシステム内部では1秒間に何度も繰り返されるループがあり、その中ですべてのゲームオブジェクトをチェックして、必要に応じてイベント関数を呼び出している。

2Dゲームの場合、ゲームキャラに使う画像をインポートした場合、[Texture Type]が[Sprite(2D and UI)]になっている必要がある。

画像選択したときのInspectorにあるGenerate Mip Mapsは3Dゲームテクスチャ向けの設定で、有効にするとスマホでは画像がぼやける可能性があるので注意。

コンポーネント
Transform(トランスフォーム)コンポーネント
→ゲームオブジェクト(以下GO)の位置、角度、サイズを決める。すべてのGOに追加されている。

SpriteRenderer(スプライトレンダラー)コンポーネント
→Sprite(2D and UI)タイプの画像を表示するコンポーネント。[Sprite]に指定した画像がGOの外観として表示される。Flip操作はX軸Y軸を反転させることができた。

Unity基本操作
・右クリックで表示範囲を動かせる。
・Rectツール(一番右のツール)でGOを枠で表示し、枠をドラッグ移動、四隅をクリックして拡大縮小、枠の外側をクリックで回転などが可能。2Dゲームではよく使う。

Add Componentで既存のスクリプトを取り付けるとき(=アタッチ)はScriptsを選択する。


実際にアタッチしてみた

ImageMove.cs[フレームごとにGOの位置をランダムな位置に移動]
// Update is called once per frame
    void Update () {
        Transform tr = this.GetComponent<Transform> ();
        Vector3 pos = tr.position;
        pos.x = Random.Range (-2.0f, 2.0f);
        pos.y = Random.Range (-2.0f, 2.0f);
        tr.position = pos;

    }

インスペクターのTransformコンポーネント(右クリック)での移動をGOにも付与した。
GOが持っているコンポーネントを取得するのがGetComponentメソッド
メソッド名の後の<>は型パラメーターで、そこに取得したいコンポーネントの型を指定する。

GetComponent構文
Componentの派生クラス.GetComponent<コンポーネントの型>()

上ではthis.GetComponentと書いた。つまりGCメソッドはImageMoveクラスのメンバーだということ。正確には、ImageMoveクラスの親クラスである、MonoBehaviourクラスから継承したもの。さらにMBクラスもその親から継承しており、最終的にはComponentクラスにたどり着く。


ワールド空間とローカル空間
GOには親子関係をもたせることができるが、親Oを基準に子Oを動かしたいときにローカル空間の変数やメソッドを利用する。親Oもしくは子を持たないOの場合は、絶対的な原点を基準としたワールド空間の変数やメソッドを利用する。ワールド空間の位置はpositionというメンバー変数によって記録されている

pos.x = Random.Range (-2.0f, 2.0f);

よってこれは、Random.Rangeメソッドを使用して、引数の範囲内のランダムな値を取り出して、x座標のpositionというメンバー変数に記録している。


Vector3型と座標系
positionはVector型。Vector3は物体の位置や向きを記録するための構造体。x,y,zのメンバー変数を持っていて、それぞれがワールド空間(0.0.0)原点からの距離を表す。
2Dゲームの場合、xは横、yは縦方向の位置を表し、zは意味を持たない

構造体
Vextor3はクラスではなく構造体というもの。classキーワードではなくstructキーワードで定義する。MonoDevelopで入力するときに出てくる候補のアイコンがクラスが「C」、構造体が「S」となっている。構造体とクラスの大きな違いは、構造体は「参照」ではなくintやfloatと同じように「値」として扱われる点。
そのため変数から変数に代入した場合は、同じインスタンスを参照するのではなく、別のものにメンバーヘンスをコピーした状態になる。


プレハブ(Prefab)
プレハブは作成したGOをアセットとして登録し、複製を簡単に作れるようにしたもの。主にゲームキャラを複数ださせるときに使う。GOをProjectウィンドウに突っ込めばよい。
プレハブアセットは背景が黒色になり、シーンに放り込めば勝手にヒエラルキーに追加されていく。プロジェクトウィンドウでプレハブアセットを選択してインスペクターで操作すると、すべての複製に反映される