在Android平台偶发的异步生成Prefab的实例报错

Forum rules
Please confirm before reporting
  • Please confirm in advance that it is a problem with LogicToolkit and not with Unity itself, other assets, or the user's project.
  • Please confirm that the problem occurs in a project with the smallest possible configuration and clarify how to reproduce it.
  • Please check if it is described in Known Issues.

Information required to report a bug
  • Logic Toolkit version
  • Unity version
  • How to reproduce

=======

報告する前の確認のお願い
  • Unity本体や他のアセット、ユーザーのプロジェクト側による問題ではなくLogicToolkitの問題であることを事前に確認してください。
  • 可能な限り最小構成のプロジェクトで問題の発生を確認し、再現方法を明確にしてください。
  • 既知の問題に記述されているかを確認してください。

バグを報告するために必要な情報
  • Logic Toolkit バージョン
  • Unity バージョン
  • 再現方法

=======

We accept posts in languages ​​other than English and Japanese, but replies will be sent via machine translation.
Thank you for your understanding.
kvfreedom
Posts: 69
Joined: 2024/07/11 04:36

在Android平台偶发的异步生成Prefab的实例报错

Post by kvfreedom »

Logic Toolkit Version 1.6.1
Unity Version 6000.0.30f1
1.png
1.png (136.47 KiB) Viewed 5380 times
2.png
2.png (41.38 KiB) Viewed 5380 times
3.png
3.png (78.84 KiB) Viewed 5380 times

Code: Select all

var prefab = await Addressables.LoadAssetAsync<GameObject>(AssetKey);
var results = await Object.InstantiateAsync(prefab, parent, position, rotation);
Prefab使用LogicPlayer,异步生成Prefab的实例,在Unity编辑器中运行从未发现报错,打包后在Android平台运行偶发报错,大约运行10次会有一次报错,不确定是不是LogicToolkit反序列化相关Bug。
User avatar
caitsithware
管理人
Posts: 108
Joined: 2024/03/26 01:56

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by caitsithware »

感谢您的报告。
我们意识到使用 InstantiateAsync 时存在反序列化问题,目前正在向资源商店提交修复版本以供审核。
审核完成后我们将进行更新。
User avatar
caitsithware
管理人
Posts: 108
Joined: 2024/03/26 01:56

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by caitsithware »

我们发布了 1.6.2 版本,支持 OnAfterDeserialize 的线程安全。
请更新并检查。
kvfreedom
Posts: 69
Joined: 2024/07/11 04:36

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by kvfreedom »

caitsithware wrote: 2024/12/09 14:03 我们发布了 1.6.2 版本,支持 OnAfterDeserialize 的线程安全。
请更新并检查。
1.png
1.png (347.04 KiB) Viewed 5367 times
2.png
2.png (404.73 KiB) Viewed 5367 times
3.png
3.png (256.01 KiB) Viewed 5367 times
4.png
4.png (26.59 KiB) Viewed 5367 times
1.6.2在Android平台仍然有偶发的报错并且出错概率比上一个版本更高了,另外Restart也失效了。
User avatar
caitsithware
管理人
Posts: 108
Joined: 2024/03/26 01:56

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by caitsithware »

如果您只是发布此类日志或图表的图像而没有详细信息,您将无法解决问题,因为详细信息将不为人知。
特别是在第一张和第二张图中,Game命名空间内处理时出现异常,目前尚不清楚这是否是LogicToolkit的问题。
首先,请检查最小必要项目的复制。
然后,如果LogicToolkit本身有问题,请报告详细的确认步骤。
这是最重要的信息,因为如果没有确认程序,就无法确定问题的原因。
感谢您的合作。
User avatar
caitsithware
管理人
Posts: 108
Joined: 2024/03/26 01:56

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by caitsithware »

我们已经能够重现Restart不起作用的问题,因此我们将修复它。
User avatar
caitsithware
管理人
Posts: 108
Joined: 2024/03/26 01:56

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by caitsithware »

我们已经查明原因,将尽快更新修正版本。
临时解决方法:
  • 打开 LogicToolkit.Product\Packages\com.caitsithware.logictoolkit\Runtime\Serialization\ValueInjection.cs
  • 将第241行更改如下

    Code: Select all

    public virtual bool HasFields => _Fields.Count > 0;
  • 将以下行添加到第 346 行

    Code: Select all

    public override bool HasFields => base.HasFields || (_BaseType?.HasFields ?? false);
  • 将第362行更改如下

    Code: Select all

    instanceTypeCache = this;
User avatar
caitsithware
管理人
Posts: 108
Joined: 2024/03/26 01:56

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by caitsithware »

修复版本1.6.3发布
kvfreedom
Posts: 69
Joined: 2024/07/11 04:36

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by kvfreedom »

caitsithware wrote: 2024/12/10 12:52 修复版本1.6.3发布
在1.6.3中,我经过多次实验,目前可以确定这个问题不会在编辑器中报错,会在Android平台报错,Object.InstantiateAsync和Object.Instantiate与报错无关,只使用handle = Addressables.LoadAssetAsync<T>(AssetKey)不Instantiate仍然会报错,若再增加一句handle.WaitForCompletion()则不会报错。
我在最小必要项目中实验不容易出现报错,多次尝试只在某次运行时成功复现过一次,目前还在实验如何能在最小必要项目中必然出现报错。
User avatar
caitsithware
管理人
Posts: 108
Joined: 2024/03/26 01:56

Re: 在Android平台偶发的异步生成Prefab的实例报错

Post by caitsithware »

谢谢您提供的信息。
也有可能是线程安全支持不够。
我们将调查细节。

请暂时尝试以下临时解决方案。
  • 打开 LogicToolkit.Product\Packages\com.caitsithware.logictoolkit\Runtime\Serialization\ValueInjection.cs
  • 在第470行添加以下代码

    Code: Select all

    private static object s_Lock = new object();
  • 将以下代码添加到第473行(Inject方法的第一行)

    Code: Select all

    lock (s_Lock) {
  • 将以下代码添加到第507行(Inject方法的最后一行)

    Code: Select all

    }
Post Reply