Overview: Writing Scripts in C# Manual     Reference     Scripting  
Scripting
Overview: C#でスクリプトを記述(Writing Scripts in C#)

文法の違いを覗いて、C#やBooで記述する場合は幾つかの異なる部分があります。最も大きな違いは:

1. MonoBehaviourを継承(Inherit from MonoBehaviour)

全てのスクリプトはMonoBehaviourを継承しなければなりません(直接、間接は問いません)。これは、Javascriptでは自動的に行われますが、C#やBooでは明示的に行う必要があります。Unity内部で Asset -> Create -> C Sharp/Boo Script メニューを用いてスクリプトを作成すると、テンプレートは必要な定義を含んだ状態で生成されます。

public class NewBehaviourScript : MonoBehaviour {...} // C#

class NewBehaviourScript (MonoBehaviour): ... # Boo

2. AwakeかStart関数を用いた初期化(Use the Awake or Start function to do initialisation)

Javascriptで関数の外で行っていた処理はAwakeStart関数で行ないます。

AwakeとStartの違いは、Awakeはシーンがロードされたときに実行され、StartはUpdateかFixedUpdateの最初の呼出の直前に実行されることです。全てのAwake関数はStart関数の前に呼び出されます。

3. クラス名とファイル名の一致(The class name must match the file name)

Javascriptでは、クラス名はファイル名から自動的に設定されました(ファイル拡張子を除く)。C#やBooでは手動で行う必要があります。

4. コルーチンの文法が異なる(Coroutines have a different syntax in C#)

コルーチンはIEnumerator型の戻り値を持っていなければなりません。呼出は yield return ... ; のように行ないます(Javascriptでは yield ... ;)

using System.Collections;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// C# coroutine
IEnumerator SomeCoroutine () {
// Wait for one frame
yield return 0;

// Wait for two seconds
yield return new WaitForSeconds (2);
}
}

5. ネームスペースを使わないでください(Don't use namespaces)

Unityは現在ネームスペース内にスクリプトを格納することをサポートしていません。将来的にはサポートされる予定です。

6. メンバ変数のみがシリアライズされインスペクタに表示される(Only member variables are serialized and are shown in the Inspector)

privateやprotectedなメンバ変数はExpert Modeでのみ表示されます。属性はシリアライズされず、インスペクタにも表示されません。

7. コンストラクタは使用しないでください(Avoid using the constructor)

値をコンストラクタで初期化しないでください。AwakeかStartを代わりに使用してください。 UnityはEditモードに入ると自動的にコンストラクタを呼び出します。これは、スクリプトのコンパ入り直後に発生します。コンストラクタはスクリプ トのデフォルト値を設定する必要があるからです。コンストラクタは、気がつかないうちに呼ばれるばかりでなく、プレハブや無効なゲームオブジェクトでも呼 ばれる場合があるでしょう。

シングルトンパターンででコンストラクタを使用すると、様々な状況により、ランダムなnull参照エラーが発生することが有ります。

シングルトンパターンを実装したい場合はコンストラクタを使わずにAwakeを利用してください。実際、MonoBehaviourを継承したクラスにおいて、コンストラクタを使用しなければいけない理由は全くありません。