.NET Framework C#とUnity C#Scriptの違い

Unity

Objectクラス

C#のclassの暗黙の基底クラスはSystem.Objectです。

Unityが提供するclassの基底クラスをたどっていくとUnityEngine.Objectになります。MonoBehaviourもGameObjectもScriptableObjectも基底クラスをたどっていくとUnityEngine.Objectになります。UnityのクラスもC#なので、UnityEngine.Objectの暗黙の基底クラスもSystem.Objectです。

C#のクラスはSystem.Objectクラスから派生しているのでクラスのインスタンスはSystem.Objectの変数に代入できたり、System.ObjectのCollectionに登録できたりします。

using System.Collections.Generic;
using UnityEngine;

class A
{
}

public class MyScript : MonoBehaviour
{
    void Start()
    {
        System.Object so = new A();
        System.Object so2 = new UnityEngine.Object();
        UnityEngine.Object uo = this;
        UnityEngine.Object uo2 = gameObject;
        List<System.Object> list = new List<object>();
        list.Add(new A());
        list.Add(new UnityEngine.Object());
        list.Add(this);
        list.Add(gameObject);
    }
}

シリアライズ

UnityEngine.Objectの派生クラスはシリアライズによりInspectorで操作できるようになります。同じC#Scriptでも違うGameObjectにアタッチすれば、フィールドの値を別々の値にできます。C#Scriptから作成されたPrefabはC#Scriptのフィールドの初期値とは別の値を持てます。ScriptableObjectから派生したクラスを使ってAssetから生成すると、シーンをまたがったクラスインスタンスを作れます。アタッチによりC#Scriptに書かれていない接続を行ったり、コンポーネントの値を変えたりできます。

初期化

C#のクラスの初期化は通常、フィールド初期化子かコンストラクタで行います。MonoBehaviourの派生クラスのC#ScriptはコンストラクタではなくAwake、OnEnable、Startという初期化メソッドが用意されています。フィールド初期化子やコンストラクタ本体が処理された後にInspectorで設定した値が反映されAwake、OnEnable、Startが呼ばれます。

イベント関数/メッセージ

MonoBehaviourのStartやUpdateはマニュアルではイベント関数とよばれ、スクリプトリファレンスではメッセージと呼ばれています。これらは仮想関数でもなく、eventに登録するようなこともなく、定義するだけで自動的に呼ばれます。定義しなければ呼ばれないため高速化のための仕組みのようです。

イベント

C#なのでeventが使えますが、UnityにはInspectorでListenerを設定できるUnityEventがあります。ScriptableObjectを使用したGameEventも公式サイトで紹介されています。

|
ScriptableObject を使用して構築することで、コードを柔軟で管理しやすく、デバッグしやすい状態に保ちます。

シーン

C#のエントリーポイントはMainという名前の静的メソッドですが、UnityではHierarchyに追加したGameObjectがシーン上で自動的にインスタンス生成されます。

Unity Editor

UnityのC#Scriptは、コードで完成されるのではなく、Unity Editorと連携して完成させます。アタッチでコンポーネントの追加やオブジェクトへの接続を行ないます。Inspectorでプロパティ(言語的にはフィールド)設定を行います。AnimatorでAnimationの状態遷移がVisualに設計できます。Scene ViewやGame Viewでプロジェクト作成時からすぐに動きが見れます。UnityEngine.Objectから継承したクラスでなければ.NET Frameworkと同じようにC#(.NET standard)として使えます。

Unity Editorはシーンが開始されるまであるはずのないインスタンスが見えるかのようです。プロパティの値が変更できます。Playボタンを押せば、生成されたインスタンスのプロパティの値も見れます。シーンがカメラから見れるだけでなく、カメラを含めてシーンが見れます。AnimatorではAnimationの状態が確認できます。

Visual Studioを使えば、C#視点の情報も見れます。

コメント