くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

UnityのMonoBehaviourを多重継承するとStart()が呼ばれないときには、publicをつけてみる

久々に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()などで、オーバーライドできるようにする記事などもあったので、 可視性をつけるのが重要っぽい

とりあえず、これで、共通化が進みそうな感じ♪ 以上!!

[PR] めもらばではこんなあぷりを作っています!

参考にしたサイト様