Page 1 of 1

自身の参照を持つオブジェクトでStackOverflowExceptionが発生

Posted: 2018/06/16 19:56
by kudou
下記のようなクラスで testScriptableObject に自身の参照をもったときに StackOverflowException が発生するか Unity が強制終了します。

public class TestScriptableObject : ScriptableObject
{
public TestScriptableObject testScriptableObject;
}

StackOverflowException: The requested operation caused a stack overflow.
Arbor.EachField`1+FindFieldBase[Arbor.CalculatorSlot].FindField (System.Object obj, System.Reflection.FieldInfo fieldInfo) (at Assets/Plugins/Arbor/Internal/Scripts/EachField.cs:81)
Arbor.EachField`1+FindFieldBase[Arbor.CalculatorSlot].Find (System.Object obj, System.Type type) (at Assets/Plugins/Arbor/Internal/Scripts/EachField.cs:111)

また、直下のフィールドでなくても、その先のフィールドで参照をもつと発生しました。

Re: 自身の参照を持つオブジェクトでStackOverflowExceptionが発生

Posted: 2018/06/16 20:17
by kudou
動作環境を書くのを忘れていました。

unity 2018 1.0 f2
arbor3.1.1

Re: 自身の参照を持つオブジェクトでStackOverflowExceptionが発生

Posted: 2018/06/16 23:47
by caitsithware
ご報告ありがとうございます。

確認して修正いたします。

Re: 自身の参照を持つオブジェクトでStackOverflowExceptionが発生

Posted: 2018/06/17 00:37
by caitsithware
確認いたしましたが、ご提供してくださった内容では再現確認できませんでした。

行った再現確認方法:
  • TestScriptableObject.cs作成

    Code: Select all

    using UnityEngine;
    using System.Collections;
    
    [CreateAssetMenu]
    public class TestScriptableObject : ScriptableObject
    {
    	public TestScriptableObject testScriptableObject;
    }
    
  • ProjectウィンドウでTestScriptableObjectアセットを作成。
  • TestScriptableObjectアセットのtestScriptableObjectフィールドに自身のオブジェクトを設定。
  • TestStackOverflowBehaviour.cs作成

    Code: Select all

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using Arbor;
    
    [AddComponentMenu("")]
    public class TestStackOverflowBehaviour : StateBehaviour {
    
    	public TestScriptableObject test;
    }
    
  • シーンにArborFSM作成。
  • ステート作成し、TestStackOverflowBehaviourをアタッチ。
  • TestStackOverflowBehaviourのtestフィールドにTestScriptableObjectアセット設定。
  • EachFieldの該当部分にDebug.Log仕込むなどしても異常は検知できず。
また、EachFieldの内容からするとUnityオブジェクトには本来付ける必要がないSystem.Serializable属性が付いている状態で自身を参照すると無限再帰するようになっておりました。
もしTestScriptableObjectにSystem.Serializableを付けている場合は削除していただくと改善されるかもしれません。
(この無限再帰になる問題は修正しておきます)

他、なにか情報がありましたら教えていただけると助かります。

Re: 自身の参照を持つオブジェクトでStackOverflowExceptionが発生

Posted: 2018/06/17 02:17
by kudou
>また、EachFieldの内容からするとUnityオブジェクトには本来付ける必要がないSystem.Serializable属性が付いている状態で自身を参照すると無限再帰するようになっておりました。
>もしTestScriptableObjectにSystem.Serializableを付けている場合は削除していただくと改善されるかもしれません。
>(この無限再帰になる問題は修正しておきます)

上記の件が問題だったようです。
報告に必要な情報が漏れていて、誠に申し訳ございません。
自作のScriptableObjectにSerializableがついていた個所を削除することで、この件の問題は発生しなくなりました。
迅速な対応ありがとうございました。

Re: 自身の参照を持つオブジェクトでStackOverflowExceptionが発生

Posted: 2018/06/17 02:33
by caitsithware
ご確認ありがとうございます。
どの問題か特定できてよかったです。

無限再帰になってしまうのは緊急性の高い不具合ですので、早急に修正版を更新いたします。

また、アセットストアへの反映には数日時間がかかってしまいますので、正式な対処方法も掲載しておきます。

対処方法:
  • Assets/Plugins/Arbor/Internal/Scripts/EachField.csをスクリプトエディタで開く。
  • 79行目に以下のコードを挿入

    Code: Select all

    else if (type == typeof(Object) || type.IsSubclassOf(typeof(Object)))
    {
    	return;
    }
    
ご不便おかけして申し訳ございませんが、よろしくお願いいたします。