UnityのStart()の継承、オーバーライドのメモ

2021/5/1追記

目次

1, overrideをつけなくても、Start()は自動的にオーバーライドされる
2, 子クラスでStart()が定義されてなければ、親のStart()が呼ばれる
3, base.Start()で親のStart()を呼べる。ただしprotectedかpublicをつけなければならない

Case1

1, overrideをつけなくても、Start()は自動的にオーバーライドされる

public class Base : MonoBehaviour {
  void Start() {
    Debug.Log("Base");
  }
}
public class Sub : Base {
  void Start() {
    Debug.Log("Sub");
  }
}

SubをGameObjectに張り付ける

結果
"Sub"

Case 2

2, 子クラスでStart()が定義されてなければ、親のStart()が呼ばれる

public class Base : MonoBehaviour {
  void Start() {
    Debug.Log("Base");
  }
}
public class Sub : Base {
}

SubをGameObjectに張り付ける

結果
"Base"

Case 3

3, base.Start()で親のStart()を呼べる。ただしprotectedかpublicをつけなければならない。

public class Base : MonoBehaviour {
  public void Start() { // To be public or protected
    Debug.Log("Base");
  }
}
public class Sub : Base {
  void Start() {
    base.Start();
    Debug.Log("Sub");
  }
}

SubをGameObjectに張り付ける

結果
"Base"
"Sub"

その他

C#のデフォルト言語機能とは挙動が違うので注意すること

C#では継承すると、親のコンストラクタは必ず呼ばれる - siunのメモ

追記

何もつけないと警告が出るようになった(Unity2021.1.4f1にて確認)

warning CS0108: 'Hammer.Awake()' hides inherited member 'Weapon.Awake()'. Use the new keyword if hiding was intended.

newをつけると警告を消せる

public class Sub : Base {
  new void Start() {
    Debug.Log("Sub");
  }
}

自動でoverrideされるというよりは自動でnewされているっぽい