🦔
[Unity]UniRxで無限ループを起こしたらRunTimeErrorが発生した
初めて遭遇するケースだったので備忘録代わりに。
タイトルの通りです。
うっかりミスで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