ゲームオブジェクトの動作はアタッチされた Components により制御されます。 Unity ビルトインのコンポーネントは多目的で使用できるものの,カスタムのゲーム機能を実装するには十分でない場合が多いです。Unity により Script を使用してカスタムのコンポーネントを作成し,ゲーム中のイベント開始,時間の経過に伴ったコンポーネント プロパティの修正,ユーザ入力操作への反応が出来ます。
Unity は 3 つのプログラミング言語をサポートしています:
さらに互換 DLL コンパイルが出来る .NET 言語も使用できます。詳細は このページ を参照して下さい。
プログラミング技術および個々の言語の使用法をマスターすることは入門編の範疇を超えます。しかし Unity でプログラミングを学ぶために多くの本,チュートリアル,および他のリソースがあります。詳細は Unity ウェブサイトにある Learning セクション を参照して下さい。
他のアセットと違って,Unity の中ですくrぷとファイルを作成することが出来ます。新規のスクリプトを作成するには,メニューから
(または JavaScript/Boo script) を開きます。新規のスクリプトスクリプトはプロジェクト パネルで選択した任意のフォルダに作成されます。新規のスクリプトのファイル名が選択状態となり,新規の名前を入力するように促されます。
新規スクリプトに名前をつけるのは後まわしにせず,この時点で行なうと良いです。後で説明するように,ここでつけた名前は初回のテキスト作成に使用されます。
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
void Update () {
}
}
スクリプトは Unity 内部処理と連携するため,MonoBehaviour と呼ばれるビルトイン クラスの派生クラスを実装します。クラスはゲームオブジェクトにアタッチできる新たな種類のコンポーネントを作成するための青写真と捉えることが出来ます。青写真にもとづいてオブジェクトの新規インスタンスを作成します。作成ファイル名と一致するようクラス名がつけられます。クラス名とファイル名が一致しないとゲームオブジェクトにアタッチされたスクリプト コンポーネントは無効となります。
クラスで定義された二つの関数に注目して下さい。__Update__ 関数はゲームオブジェクトのフレーム更新をハンドリングするコードを配置する場所です。何か動作させたり,何かを起動させたり,あるいはユーザ入力操作に反応したり,時間の経過とともにハンドリングされるゲーム中のあるゆるものを含みます。Update 関数で必要な処理を行なうためには変数のセットアップ,設定を読み取ったうえでゲーム中のアクションが行なわれる前に他のゲームオブジェクトとの結びつけを行ないます。Start 関数はゲームプレイのt直前に Unity により呼び出しされ,任意の初期化を行なうのに良い場所です。
プログラミング上級者への注意:オブジェクトの初期化がコンストラクタ関数でないことが意外かもしれません。この理由はオブジェクトの作成はエディタによりハンドリングされて意外にもゲーム開始直後に行なわれないためです。スクリプトコンポーネントでコンストラクタを定義しようとすると,Unity の通常処理と干渉するため,プロジェクトで問題を発生させます。
Boo スクリプトは大体において C# スクリプトと同じレイアウトですが,UnityScript はやや異なる動作をします:
#pragma strict
function Start () {
}
function Update () {
}
Start および Update 関数の役割はすでに述べたものどおりですが,クラス名が明示的に宣言されてません。スクリプト自身がクラスを定義する前提となっています。MonoBehaviour から明示的に派生して,スクリプト アセットのファイル名と名称が一致するようになります。
すでに述べたように,スクリプトはコンポーネントの青写真であり,ゲームオブジェクトにスクリプトがアタッチされるまではコード実行されません。階層ビューでスクリプト アセットをゲームオブジェクト上へドラッグするか,現在選択されているゲームオブジェクトのインスペクタ上へドラッグすることで,スクリプトをアタッチできます。コンポーネント メニューのスクリプト サブメニューがあり,プロジェクトで利用可能な全てのスクリプトを含みます。スクリプトのインスタンスは,インスペクタ上の他のコンポーネントと見た目は同じです:
一回アタッチした後,Play ボタンを押してゲームを起動するとスクリプトが動作します。試すには次のコードを Start 関数に足します:
// Use this for initialization
void Start () {
Debug.Log("I am alive!");
}
Debug.Log は Unity コンソール出力にメッセージを書き込みます。もし Play ボタンを押すとメインの Unity エディター ウィンドウおよびコンソールの最下部 (メニュー:
) にメッセージが表示されます。スクリプトは大部分において他のスクリプトと同じ動作ですが,スクリプトのインスペクタは他のコンポーネントと編集可能なプロパティが隣あわせになっています。変数によりスクリプトをインスペクタ上で値の編集をすることが出来ます:
using UnityEngine;
using System.Collections;
public class MainPlayer : MonoBehaviour {
public string myName;
// Use this for initialization
void Start () {
Debug.Log("I am alive and my name is " + myName);
}
// Update is called once per frame
void Update () {
}
}
このコードは “My Name” というラベルのアイテムをインスペクタ上で作成します。
Unity では大文字あるところはスペースを足してインスペクタ上で表示します。これは表示目的だけなので,コード中は必ず変数名を使用するべきです。名称を変更して Play ボタンを押すと,入力したテキストを含むメッセージが表示されます。
C# および Boo ではインスペクタ上で変数を public と宣言する必要があります。UnityScript で変数は明示的に privateと指定しないかぎりデフォルトで public になります。
#pragma strict
private var invisibleVar: int;
function Start () {
}
Unity ではゲームの実行中にスクリプト変数の値を変更出来ます。これは停止,再起動せずにエフェクトをすぐ見れるという意味で便利です。ゲームプレイが終わったとき変数の値は Play を押す前の値にリセットされます。これにより,後への影響を残さずにオブジェクト設定の調整ができます。