久々にUnityのアプリを開発しようと思ったら、Visual Studioの無償化なので、javascriptからC#へ乗り換え中
C#に乗り換えるので、まじめに独自基底クラスなどを作ろうと思ったら、はまったのでその備忘録
(ただC#の書き方を知らないだけ気も知れないけれど。。。)
MonoBehaviourを多重継承する場合には、publicなどのアクセス修飾子をつける
MonoBehaviourの独自基底クラスを作って、その中に判定処理をまとめ、 そこから呼び出される処理をオーバーライドしようと思ってた。
最初はダメな例のようにしていたけど、SubClassから"void Update()"が呼ばれていなかった。。。
よい例のように、"public void Update()"としてやるといい感じになる!!
ダメな例
親クラス
using UnityEngine; public class SuperClass : MonoBehaviour { void Update() { //何かの判定をして、 if(....) { //trueならAの処理を実行 ExecuteA(); } else { //falseならAの処理を実行 ExecuteB(); } } //Aの時の処理 protected virtual void ExecuteA() { } //Bの時の処理 protected virtual void ExecuteB() { } }
子クラス
using UnityEngine; public class SubClass : SuperClass { //Aの時の処理 protected override void ExecuteA() { } //Bの時の処理 protected override void ExecuteB() { } }
よい例
親クラス
using UnityEngine; public class SuperClass : MonoBehaviour { public void Update() { //何かの判定をして、 if(....) { //trueならAの処理を実行 ExecuteA(); } else { //falseならAの処理を実行 ExecuteB(); } } //Aの時の処理 protected virtual void ExecuteA() { } //Bの時の処理 protected virtual void ExecuteB() { } }
子クラス
using UnityEngine; public class SubClass : SuperClass { //Aの時の処理 protected override void ExecuteA() { } //Bの時の処理 protected override void ExecuteB() { } }
Unity内部のライフサイクル処理はよくわかってないけど、 多重継承をした場合、Update()やStart()などのメソッドは見えなくなってしまうよう。
ほかにも、public virtual void Update()
などで、オーバーライドできるようにする記事などもあったので、
可視性をつけるのが重要っぽい
とりあえず、これで、共通化が進みそうな感じ♪ 以上!!