【Unity】継承されたスクリプトのStartメソッドの挙動
サンプルシーン
1つのCubeと2つのスクリプトがあり、SlimeスクリプトがCubeにアタッチされています
Slimeスクリプトは、EnemyBaseスクリプトを継承しています

基本クラス、派生クラスともにStartメソッドが存在する場合
コード
using UnityEngine;
public class EnemyBase : MonoBehaviour
{
    void Start()
    {
        Debug.Log("基本クラスのスタート");
    }
}
public class Slime : EnemyBase
{
    void Start()
    {
        Debug.Log("派生クラスのスタート");
    }
}
実行結果
派生クラスのスタート
Unityでは、基本クラスと派生クラスの両方にStartメソッドが存在する場合、派生クラスのStartメソッドが優先的に実行されます。これは、Unityのコンポーネントベースのアーキテクチャによるもので、派生クラスのStartメソッドが基本クラスのStartメソッドをオーバーライドするためです。
基本クラスをvirtualに、派生クラスをoverrideとしたStartメソッドが存在する場合
コード
using UnityEngine;
public class EnemyBase : MonoBehaviour
{
    protected virtual void Start()
    {
        Debug.Log("基本クラスのスタート");
    }
}
public class Slime : EnemyBase
{
    protected override void Start()
    {
        Debug.Log("派生クラスのスタート");
    }
}
実行結果
派生クラスのスタート
virtualとoverrideを使うことで、派生クラスが基本クラスのメソッドをオーバーライドすることができます。派生クラスのオーバーライドしたメソッドは、基本クラスのメソッドの振る舞いを変更することができます。
しかし、Unityの場合、規定でvirtualとoverrideを使わない場合でも上記パターンのように同様な振る舞いになります
基本クラスをvirtualに、派生クラスをoverrideとしたStartメソッドが存在する場合で、基本クラスのStartメソッドも呼び出したい場合
コード
using UnityEngine;
public class EnemyBase : MonoBehaviour
{
    protected virtual void Start()
    {
        Debug.Log("基本クラスのスタート");
    }
}
public class Slime : EnemyBase
{
    protected override void Start()
    {
        Debug.Log("派生クラスのスタート");
        base.Start();
    }
}
実行結果
派生クラスのスタート
基本クラスのスタート
派生クラスのStartメソッドが実行されると、"派生クラスのスタート"というデバッグログが表示されます。そして、派生クラスのStartメソッド内でbase.Start()が呼び出されるため、基本クラスのStartメソッドも実行され、"基本クラスのスタート"というデバッグログが表示されます。
基本クラスのみStartメソッドがある場合
コード
using UnityEngine;
public class EnemyBase : MonoBehaviour
{
    void Start()
    {
        Debug.Log("基本クラスのスタート");
    }
}
public class Slime : EnemyBase
{
}
実行結果
基本クラスのスタート
派生クラスにStartメソッドが存在しない場合、基本クラスのStartメソッドが実行されます。派生クラスは基本クラスのメンバーを継承するため、基本クラスのStartメソッドが呼び出されることになります。
基本クラスと派生クラスの両方にStartメソッドがあるが、派生クラスのStartメソッドがからメソッドの場合
コード
using UnityEngine;
public class EnemyBase : MonoBehaviour
{
    void Start()
    {
        Debug.Log("基本クラスのスタート");
    }
}
public class Slime : EnemyBase
{
}
実行結果
基本クラスのスタート






ディスカッション
コメント一覧
まだ、コメントがありません