表示テーマ
C# Scriptの書き方
ゲームの処理はNEMEngine.MonoBehaviourを継承して記述します。ScriptはGameObjectへ追加して初めて実行されます。
コールバック
| 名前 | 主な用途 |
|---|---|
| Awake | 参照・状態の初期化 |
| OnEnable | 有効になった時の処理 |
| Start | 初回のゲーム処理開始 |
| FixedUpdate | 固定刻みの物理制御 |
| Update | 入力・通常のゲーム更新 |
| LateUpdate | 通常更新後の追従など |
| OnDisable | 無効になった時の解除 |
| OnDestroy | 所有者の破棄に伴う解除 |
| OnCollisionEnter / Stay / Exit | 接触の開始・継続・終了 |
| OnAnimationEvent | Animation Eventの受信 |
コールバックは指定名と引数で認識します。overrideを付けて基底の仮想関数を上書きする方式ではありません。通常は引数なしのvoid、接触はCollision、Animation EventはAnimationEventを引数にします。StartにはIEnumeratorを返す方式もあります。
同じframe内でもScene生成・Component追加・破棄の要求は安全地点で適用されます。呼出し直後に、別ScriptのStartまで完了していると仮定しないでください。
InspectorへFieldを出す
publicな保存Field、または[SerializeField]を付けたFieldを使います。Range、Min、Label、Tooltipなどで編集方法を補助できます。
Scene Asset、Prefab、Textureなどは対応型のFieldを用意し、Projectから設定します。参照が未設定・未解決の場合も想定して判定します。
名前変更で旧保存値を引き継ぐ場合は[FormerlySerializedAs("旧名")]を使用します。型や構造を大きく変える場合まで、自動的な互換変換があると考えないでください。
保存・表示・実行順・識別用の属性は、SerializeFieldなどの属性一覧に対象と記述例をまとめています。
GameObjectとComponent
gameObjectは所有GameObject、transformはそのTransformです。GetComponent<T>でComponentを取得し、ない場合のnullを処理します。
GameObjectの操作で、Inspectorからの参照設定、生成、検索、親子付け、破棄を確認してください。
NEMEngine.Objectの== nullは、C#参照が残っている破棄済み対象も考慮します。ReferenceEqualsやis nullと同じ判定ではありません。Scene切替後に古い参照を保持する場合は特に注意してください。
Coroutine・Timer・Event
Scriptから開始したCoroutineやTimerは所有者の寿命と結び付きます。Scriptが無効、またはGameObjectが非アクティブな間の進行と、Play自体のPauseを区別します。
WaitForSecondsはゲーム時間、WaitForSecondsRealtimeはTimeScaleの影響を受けない時間に使います。Timerには単発・繰り返し・Unscaledがあります。停止するためのHandleを保持してください。
イベント購読は、不要になった時点で解除します。受信中の例外で残りの購読先へ届かない場合があるため、ゲームの状態変更を中途半端に残さないようにします。
例外と再コンパイル
ConsoleのGame側で例外を確認します。「パネル → Script Errorで一時停止」が有効な場合、状態を保って安全地点で停止し、Inspectorで実行値を調べます。
「Play中のC#再読み込み」には再コンパイルして継続、Stop後に反映、自動Stopして再コンパイルの選択があります。初めはStop後に反映する方式で確認すると、実行状態とコード変更を区別しやすくなります。
Unityとの関係
基本の名前や操作をUnityに寄せていますが、Unity API一式を持つわけではありません。Shader、Scene、入力、Physics、Coroutineの詳細や対応型はこのマニュアルを正にしてください。