🦔

[Unity]UniRxで無限ループを起こしたらRunTimeErrorが発生した

2023/12/23に公開

初めて遭遇するケースだったので備忘録代わりに。

タイトルの通りです。
うっかりミスでUniRxで無限ループを発生させてしまい、上記画像のようなダイアログが表示される事態に。このダイアログを閉じるとUnityが強制終了されます。
無限ループを解消したら無事に解決しました。

無限ループを起こすとたいていはUnityがフリーズするものだと思っていたので、原因になかなか気づけずやたら沼ってしまいました。
Library,Tempフォルダを消してみたり、Unityを再インストールしたりと無駄な時間を過ごす羽目に...。

構造としては下記のような感じ。
一応状況を再現したコードも載せておきますが、同様のエラーを出すことができませんでした...。
具体的な原因は謎のままですが、何かの参考になればと...。


クラスChildの関数Hogeからイベントが飛ばされる
-> 紐づけられていた関数Fugaが呼ばれる
-> Fugaの中でクラスChildのHogeを呼ぶ
-> Hogeから再びイベントが飛ばされる


Child.cs
public class Child : MonoBehaviour
{
    //! イベント
    protected Subject<Unit> _trigger = new Subject<Unit>();
    public IObservable<Unit> Trigger => _trigger;

    /*
     *  @ イベントを飛ばす
     */
    public void Hoge()
    {
        _trigger.OnNext(Unit.Default);
    }
}
BaseClass.cs
/*
 * 
 *  @ 基底クラス
 *  @ 参照しているChildにイベントを登録する
 * 
 */
public class BaseClass : MonoBehaviour
{
    // 子要素
    // イベントが飛んでくる
    [SerializeField] protected Child _childClass = null;

    private void Start()
    {
        // イベントの登録
        _childClass.Trigger.Subscribe(_ => Fuga()).AddTo(this);

        Fuga();
    }

    /*
     *  @ イベントを受け取ったら呼び出される
     *  @ 派生先でoverrideされる
     */
    protected virtual void Fuga()
    {
    }
}
Parent.cs
/*
 * 
 *  @ BaseClass の派生クラス
 * 
 */
public class Parent : BaseClass
{
    /*
     *  @ イベントを受け取ったら呼び出される
     *  @ override
     */
    protected override void Fuga()
    {
        _childClass.Hoge();
    }
}

Discussion