throw-out / puerts-unity-kit

使用typescript开始你的unity项目(基于puerts的项目模板). 在ts中使用Unity生命周期方法丶绑定ts脚本并序列化其成员丶在ts中使用多线程实例等功能.
Other
60 stars 10 forks source link

Behaviour is missing in Samples/01_TsComponent #18

Open Ricardo2001ZG opened 1 month ago

Ricardo2001ZG commented 1 month ago

17243225361269

请问是否缺少了类似 Sample_01.cs 的 cs 脚本进行 ts 脚本调用?

运行 01 场景时提示找不到引用,对照其他样例场景查看,其他场景有 Sample_xx.cs 类的脚本进行 app.Load,但 01 场景没有

throw-out commented 1 month ago

Samples/01_TsComponent是TsComponent组件的演示场景, 无需额外的Sample_xx.cs 类调用逻辑.

你这里的问题看起来像是TsComponent.cs的引用丢失造成的, 请检查以下文件是否存在或被更改:

请特别注意TsComponent.cs.meta文件中的guid是否被更改: image

Ricardo2001ZG commented 1 month ago

Samples/01_TsComponent是TsComponent组件的演示场景, 无需额外的Sample_xx.cs 类调用逻辑.

你这里的问题看起来像是TsComponent.cs的引用丢失造成的, 请检查以下文件是否存在或被更改:

  • Assets/XOR/Runtime/Src/Components/TsComponent.cs
  • Assets/XOR/Runtime/Src/Components/TsComponent.cs.meta

请特别注意TsComponent.cs.meta文件中的guid是否被更改: image

20240822195215

1724327842750

您好,我检查了 TsComponent 本身的 guid,并且查了 Sample01 的场景文件引用,现在是一致的。

但是我对这个项目进行了版本变更,现在是 2022.3.20f1c1,面板没有显示与 README 里面相同的模块和引用等信息,且日志只显示前文的 Warning,没有报 Error,不知是不是需要我对部分代码手动升级做兼容性处理?

throw-out commented 1 month ago

我检查了一下线上仓库内的场景文件Assets/Samples/01_TsComponent/Scene.unity, 并未发现问题(如下图). image

您遇到的问题, 可能是由于未知原因(例如guid冲突)导致TsComponent.cs的guid被强制修改/修正, 从而丢失了脚本引用. 之后再遇到此类问题, 你可以尝试手动修复.

前文的Behaviour is missing是Unity在引用丢失时的默认输出信息, 确实不会抛出错误

Ricardo2001ZG commented 1 month ago

我检查了一下线上仓库内的场景文件Assets/Samples/01_TsComponent/Scene.unity, 并未发现问题(如下图). image

您遇到的问题, 可能是由于未知原因(例如guid冲突)导致TsComponent.cs的guid被强制修改/修正, 从而丢失了脚本引用. 之后再遇到此类问题, 你可以尝试手动修复.

前文的Behaviour is missing是Unity在引用丢失时的默认输出信息, 确实不会抛出错误

好的谢谢,我去本地单步调试跟一下这个 guid 的引用,看是哪里导致的引用丢失

Ricardo2001ZG commented 1 month ago

请问一下 xor.guid 绑定的 guid 是需要手动编辑的吗?还是说 PuerTS 生成时会自动生成?我现在只看到代码注释里面有提醒,不要手动修改该段代码

throw-out commented 1 month ago

运行ts分析服务后xor.guid将会自动生成: 你可以手动开启Tools/XOR/Servies/Start菜单来启动服务, 或者在使用TsComponent相关功能时会弹窗提示是否立即启动

xor.guid的生成需要满足以下条件: image

Ricardo2001ZG commented 1 month ago

运行ts分析服务后xor.guid将会自动生成: 你可以手动开启Tools/XOR/Servies/Start菜单来启动服务, 或者在使用TsComponent相关功能时会弹窗提示是否立即启动

xor.guid的生成需要满足以下条件: image

好的谢谢,那我暂时没有问题了

Ricardo2001ZG commented 1 month ago

13 该问题仍然存在,且与本问题相关

参照该 issue 修改后能够显示相关设置,但存在报错,信息面板均显示 UNKNOWN

在 Editor 环境下,console 提示读取了 puerts/xor/listener.mjs,抛出异常: XOR module missing: puerts/xor/listener.mjs

参照 #13 的操作将文件改名,并将 Runtime 文件夹下的 puerts/xor/* 拷贝到 Editor 文件夹下,能够正常使用 TsComponent 中的功能。

目前存在两个问题:

  1. 该 listener 仅存在于 Runtime 文件夹下,是否可能有 Runtime 编译配置未同步到 Editor 的情况?
  2. partial 配置是否有潜在的配置错误?
throw-out commented 1 month ago

13 提到的问题确实存在, 非常抱歉我忽略了它, 稍后我将提交一个修复.

信息面板显示UNKNOWN, 则表示未能获取到ts的类型元数据. 你需要点击启动服务或执行菜单Tools/XOR/Services/Start来启动ts分析服务.

至于你上述描述的Editor环境下无法加载Runtime/Resources目录下载的TextAsset文件, 我未能在Unity 2022.3.17上复现, 能否提供更多信息给我

Ricardo2001ZG commented 1 month ago

13 提到的问题确实存在, 非常抱歉我忽略了它, 稍后我将提交一个修复.

信息面板显示UNKNOWN, 则表示未能获取到ts的类型元数据. 你需要点击启动服务或执行菜单Tools/XOR/Services/Start来启动ts分析服务.

至于你上述描述的Editor环境下无法加载Runtime/Resources目录下载的TextAsset文件, 我未能在Unity 2022.3.17上复现, 能否提供更多信息给我

感谢您的回复,关于 UNKNOWN 的问题,在拷贝 xor 相关的 listener.mjs 以后,分析服务是可以正常启动的

listener.mjs 加载的问题稍后附上详细报告

Ricardo2001ZG commented 1 month ago

13 提到的问题确实存在, 非常抱歉我忽略了它, 稍后我将提交一个修复.

信息面板显示UNKNOWN, 则表示未能获取到ts的类型元数据. 你需要点击启动服务或执行菜单Tools/XOR/Services/Start来启动ts分析服务.

至于你上述描述的Editor环境下无法加载Runtime/Resources目录下载的TextAsset文件, 我未能在Unity 2022.3.17上复现, 能否提供更多信息给我

partial 的修复已生效,辛苦。

我猜测可能是因为重名文件的 partial 无法识别,不是说这个关键字本身的合并有问题,我检查了 puerts.unity.kit.xor 的引用,是正常的。

20240824172641

在 Editor 环境下,直接运行项目时,会提示 puerts/xor/listener.mjs 这个文件 Module missing,同时附带很多异常信息

20240824172858

20240824172917

这个 mjs 实际的生成路径是 XOR\Runtime\Resources\puerts\xor\listener.mjs,在 XOR\Editor\Resources\puerts 路径下仅存在 xor-editor 文件夹,且里面不含 listener.mjs

按照我的理解,Editor 环境下只调用 Editor 路径下的 js 脚本,Runtime 的实机环境只调用 Runtime 路径的,是没有问题的。但是现在出现了 Editor 环境调用了 Runtime 的脚本的情况,且附带了很多错误信息。

请问这个情况是预期设计吗?Editor 环境需要这个 listener 做 TsComponent 相关的一些监听和刷新操作吗?

Ricardo2001ZG commented 1 month ago

20240826130407

20240826130418

我在加载 XOR 模块的代码段添加了两个调试语句,在 Editor 中仅启动 ts 分析服务是正常的,但是直接在 Editor 中运行游戏时会报错,结合上面的信息和代码来看,不太确定是不是某些地方加载完文件后自动 gc 了这些文件,因为我看 loader 里面是有一些预读写操作的,会把很多文件先读进来

Ricardo2001ZG commented 1 month ago

今天我给 loader 的 dispose 函数添加了调试语句,想检查一下 loader 的释放顺序,看无法加载模块的问题是否是由 loader 引起的

经过测试,在 Editor 中启动 ts 分析线程后,直接点击运行,会将 worker 线程终止,随后 MixerLoader 的 Dispose 函数被调用,输出了警告语句

20240827161022

这个问题的复现方式是:先在 Sample01 场景中启动 ts 分析线程,随后点击 Editor 的启动按钮运行场景

在这种情况下,运行场景会返回 Error,且报告无法加载模块

临时解决方法是:先运行场景,再启动分析线程读取相关信息

这个问题本身不是大问题,但是我还是建议更新 README 说明,临时提示该问题。这会给使用者带来一定的误解,认为程序本身有 bug,影响使用

完整修复要看能不能给 Loader 添加相关检测,以及对上述操作情况做一些代码检测,如果有什么建议思路欢迎详细讨论一下,有时间我再提一个 pr 修一下

throw-out commented 1 month ago

已定位到出问题的地方了, 在进入Playing模式时[InitializeOnLoad]的调用时机过早(如下图), 此时Resources.Load接口无法正确的加载资源:

image

已尝试过线程延迟调用, 但无法解决问题;

考虑的后续解决方案是, 完成ts_metadata_cache功能后, 进入Playing模式时不自动启动ts分析服务