【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("派生クラスのスタート");
    }
}

実行結果

派生クラスのスタート

virtualoverrideを使うことで、派生クラスが基本クラスのメソッドをオーバーライドすることができます。派生クラスのオーバーライドしたメソッドは、基本クラスのメソッドの振る舞いを変更することができます。
しかし、Unityの場合、規定でvirtualoverrideを使わない場合でも上記パターンのように同様な振る舞いになります

基本クラスを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
{
}

実行結果

基本クラスのスタート

C#,Unity,学習

Posted by hidepon