もふふのはてな

メインのブログに書くほどではない雑多な記事を置く場所

はじめてのUnityプログラミング

初めてのUnityゲーム制作がそろそろ一段落。良い機会なので備忘録をまとめました。

f:id:remin:20171104185044p:plain

Unityの基本要素

Unityに登場する基本要素としてシーン、ゲームオブジェクト、コンポーネントの3つがあります。

シーン(Scene)はゲーム中のある一場面あるいは一画面となる要素です。3DモデルやGUIなどゲームを構成するあらゆる物を配置する空間を提供します。シーンはゲームを実行するときの最小単位になるので、使いたい物は全てシーンに追加しなければなりません。シーンは.unityファイルとして保存されています。

シーンに追加した3DモデルやGUIなど個々の要素をゲームオブジェクト(GameObject)と呼びます。その名の通りシーン内であたかも「物」のように振舞いますが、ゲームオブジェクト自体はただの「容器」で、各ゲームオブジェクトの機能は後述のコンポーネントが定めます。容器なので、ゲームオブジェクトが他のゲームオブジェクトを子として持つなど、フォルダのような階層構造をなすことができます。

コンポーネント(Component)は特定の機能を持つ「部品」の最小単位です。これをゲームオブジェクトに付ける(アタッチする)ことで、ゲームオブジェクトに機能を付加できます。例えばColliderコンポーネントを追加すると、ゲームオブジェクトが当たり判定を持ちます。Lightコンポーネントを追加すると光源として振舞います。

このように、シーンとゲームオブジェクト、ゲームオブジェクトとコンポーネントは従属関係にあります。シーンに追加していないゲームオブジェクトは処理されませんし、ゲームオブジェクトにアタッチしていないコンポーネントは何も作用しません。

スクリプトコンポーネント

Unityのスクリプト(Script)とはC#JavaScriptで記述されたプログラムのコンポーネントです。Unityでの「プログラミング」は大抵、このスクリプトを書く作業を指します。

スクリプトコンポーネントの役割は、アタッチされたゲームオブジェクトをプログラムで制御することです。後で詳しく説明しますが、スクリプトをアタッチすると、アタッチ先のゲームオブジェクトへの参照が自動的にスクリプトに渡されるようになっています。この参照を通してゲームオブジェクトを操作することで、入力に応じてキャラクターを動かしたり、敵に複雑な動きをさせたりできるのです。

MonoBehaviourクラス

Unityで新しいC#スクリプトを作成すると、以下のようなコードを含む.csファイルがデフォルトで生成されます。("MyScript"は作成時に付けたスクリプト名になります。)

using UnityEngine;
using System.Collections;

public class MyScript : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

見ての通りスクリプトのクラスがMonoBehaviourクラスを継承しています。MonoBehaviourクラスのサブクラスはコンポーネントとしてゲームオブジェクトにアタッチできます。(厳密にはMonoBehaviourクラスより上にComponentクラスがありますが簡単のために端折ります。)

コンポーネントにアタッチされると実行時にインスタンスが生成され、様々なメソッドが呼び出されるようになります。

  • Start()
    Updateメソッドが初めて呼び出される一つ前のフレームで呼び出されます。初期化などを記述します。
  • Update()
    毎フレーム呼び出されます。フレームレートは不定です。一つ前のフレームからの経過時間はTime.deltaTimeから取得できます。

また、MonoBehaviourクラスは例えば次のような変数を持ちます。

  • public GameObject gameObject
    このスクリプトがアタッチされたゲームオブジェクトへの参照。
  • public Transform transform
    gameObjectにアタッチされたTransformへの参照。Transformとはゲームオブジェクトに座標や大きさなどを与えているコンポーネントです。

スクリプトはgameObjectやtransformを通してアタッチされたゲームオブジェクトを操作することができます。例として、ゲームオブジェクトをx軸方向に等速直線運動させるスクリプトはこのようになります。

using UnityEngine;
public class SampleScript : MonoBehaviour {
    void Update () {
        // public void Translate(float x, float y, float z);
        transform.Translate(Time.deltaTime, 0, 0);
    }
}

その他のメソッドや変数についてはUnityの{スクリプトリファレンス}(http://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.html)を参照。

なお、スクリプトの全てのクラスがMonoBehaviourを継承しなければならないわけではありません。コンポーネントとしてアタッチするクラス以外はMonoBehaviourを継承する必要がなく、通常のC#プログラミングと同様にクラスを記述できます。

まとめ

このようにUnityではスクリプトコンポーネントとしてプログラムを書くことになります。初めてUnity上で「プログラミング」をしようとしたときには、この独特な構造に戸惑いました。