【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
{
}
実行結果
基本クラスのスタート
ディスカッション
コメント一覧
まだ、コメントがありません