Version: 5.5
スクリプティング概要
変数とインスペクター

スクリプトの作成と使用

ゲームオブジェクトの動作はアタッチされた Component により制御されます。Unity ビルトインのコンポーネントは多目的で使用できるものの、カスタムのゲーム機能を実装するには十分でない場合が多いです。Unity により Script を使用してカスタムのコンポーネントを作成し、ゲーム中のイベント開始、時間の経過に伴ったコンポーネントプロパティーの修正、ユーザー入力操作への反応ができます。

Unity は 2 つのプログラミング言語をサポートしています:

  • C# (シーシャープと発音)、Java や C++ に相当する、業界標準の言語
  • UnityScript、JavaScript をもとにモデル化された Unity 独自設計の言語

さらに互換性のある DLL コンパイルができる .NET 言語も使用できます。詳細は マネージド プラグイン を参照してください。

プログラミング技術および個々の言語の使用法をマスターすることは入門編の範疇を超えます。しかし Unity でプログラミングを学ぶための多くの本、チュートリアル、および他のリソースがあります。詳細は Unity Web サイトにある Learn セクション を参照してください。

スクリプトの作成

他のアセットと違って、Unity の中でスクリプトファイルを作成することができます。新規のスクリプトを作成するには、メニューから Assets > Create > C# Script (または JavaScript) を開きます。

新規のスクリプトはプロジェクトパネルで選択した任意のフォルダーに作成されます。新規のスクリプトのファイル名が選択状態となり、新規の名前を入力するように促されます。

新規スクリプトに名前をつけるのは後まわしにせず、この時点で行なうとよいでしょう。後で説明するように、ここでつけた名前は、ファイルの最初のスクリプトテキストの作成に使用されます。

スクリプトファイルの構造

Unity でスクリプトアセットをダブルクリックするとテキストエディターで開かれます。デフォルトで Unity は MonoDevelop を使用するものの、Unity の Preferences の External Tools パネルで変更できます。

新規作成後、ファイルは次のように表示されてます。

using UnityEngine;
using System.Collections;

public class MainPlayer : MonoBehaviour {

    // Use this for initialization (初期化に使用)
    void Start () {
    
    }
    
    // Update is called once per frame (Update はフレームごとに 1 回呼び出されます)
    void Update () {
    
    } 
}

スクリプトは Unity 内部処理と連携するため 、MonoBehaviour と呼ばれるビルトインクラスの派生クラスを実装します。クラスはゲームオブジェクトにアタッチできる新たな種類のコンポーネントを作成するための設計図と捉えることができます。スクリプトコンポーネントをゲームオブジェクトにアタッチするたびに、ブループリントにもとづいてオブジェクトの新規インスタンスが作成されます。作成ファイル名と一致するようクラス名がつけられます。クラス名とファイル名が一致しないとゲームオブジェクトにアタッチされたスクリプトコンポーネントは無効となります。

クラスで定義される 2 つの関数に注目してください。Update 関数はゲームオブジェクトのフレーム更新を処理するコードを配置する場所です。何か動作させたり、何かを起動させたり、あるいはユーザー入力操作に反応したり、時間の経過とともに処理されるゲーム中のあるゆるものを含みます。Update 関数で必要な処理を行なうためには変数のセットアップ、設定を読み取ったうえでゲーム中のアクションが行なわれる前に他のゲームオブジェクトとの結びつけを行ないます。Start 関数はゲームプレイの直前に Unity により呼び出され、任意の初期化を行なうのによい場所です。

プログラミング上級者への注意:オブジェクトの初期化がコンストラクター関数でないことが意外かもしれません。この理由はオブジェクトの作成はエディターによりハンドリングされて意外にもゲーム開始直後に行なわれないためです。スクリプトコンポーネントでコンストラクターを定義しようとすると、Unity の通常処理と干渉するため、プロジェクトで問題を発生させます。

UnityScript は C# と少し動作が異なります:

# pragma strict

function Start () {

}

function Update () {

}

Start および Update 関数の役割はすでに述べたものどおりですが、クラス名が明示的に宣言されてません。スクリプト自身がクラスを定義する前提となっています。MonoBehaviour から明示的に派生して、スクリプトアセットのファイル名と名称が一致するようになります。

ゲームオブジェクトの呼び出し

すでに述べたように、スクリプトはコンポーネントの青写真であり、ゲームオブジェクトにスクリプトがアタッチされるまではコードは実行されません。Hierarchy ウィンドウでスクリプトのアセットをゲームオブジェクト上へドラッグするか、現在選択されているゲームオブジェクトのインスペクター上へドラッグすることで、スクリプトをアタッチできます。コンポーネントメニューにはスクリプトサブメニューがあり、プロジェクトで利用可能なすべてのスクリプトが含まれています。スクリプトのインスタンスは、インスペクター上では見た目は他のコンポーネントと同じです。

一回アタッチした後、Play ボタンを押してゲームを起動するとスクリプトが動作します。試すには次のコードを Start 関数に足します:

// 初期化に使用
void Start () {
    Debug.Log("I am alive!");
}

Debug.Log は Unity コンソール出力にメッセージを表示する単純なコマンドです。もし Play ボタンを押すとメインの Unity エディターウィンドウとコンソールの最下部 (メニュー: Window > Console ) にメッセージが表示されます。

スクリプティング概要
変数とインスペクター