Page 1 of 1

Object.InstantiateAsync時のエラー

Posted: 2024/12/19 03:43
by tanuki
OS:Windows11
Unityバージョン:Unity 2022.3.55f
Arborバージョン:Unity 2022.3.55f
再現方法
・Object.InstantiateAsyncでPrefab(Arbor3の内容を含む)を非同期インスタンス化するとエラー発生。
 発生場所:Arbor.NodeBehaviour.DataSlotFieldsBuilderクラスのBuildメソッド内の「nodeBehaviour._DataSlots = dataSlots.ToArray();」の行。
 呼び出しの大元は、Arbor.NodeBehaviourクラスのOnAfterDeserializeメソッド内のRebuildFields();

たまに発生しないこともありますが、特に大き目のPrefabをInstantiateAsyncする場合は確実に発生してUnityEditorごと落ちます。

何か解決方法などはございますでしょうか?
よろしくお願いいたします。

Re: Object.InstantiateAsync時のエラー

Posted: 2024/12/19 04:07
by caitsithware
ご報告ありがとうございます。
InstantiateAsyncなどによる非同期デシリアライズにはキャッシュなどのスレッドセーフ対応が必要となりますが、現在はまだ対応しておりません。
今後の更新で対応できるかを検討いたします。

暫定対処方法としては以下のようになります。
全ての箇所をここで網羅することは難しいため、一般的な対処方法を記載いたします。
お急ぎの場合は、内部コードを一時的に変更して対応していただければと思います。
  • 以下のようなスクリプトを"Plugins/Arbor/Internal/Scripts/"に作成

    Code: Select all

    namespace Arbor
    {
    	public static class DeserializeLocker
    	{
    		public static readonly object lockObj = new object();
    	}
    }
    
  • 問題となるOnAfterDeserializeメソッドの最初の行に以下のコードを追加

    Code: Select all

    lock(DeserializeLocker.lockObj) {
    
  • 問題となるOnAfterDeserializeメソッドの最後の行に以下のコードを追加

    Code: Select all

    }
    
追記: 暫定対処方法を全OnAfterDeserialize共通のロックオブジェクトに変更しました。