Bian-Sh / Assemblies-Hotfix-Toolkit-Unity

Assemblies hotfix with unity addressable , for windows and android , both mono and IL2CPP scripting backend,IL2CPP hotfix powered by wolong(HybridCLR)
172 stars 27 forks source link

addressables和HybridCLR结合使用导致的资源加载错误 #2

Open jiatengmeng opened 2 years ago

jiatengmeng commented 2 years ago

当使用addressables来更新热更新的dll时。由于是先使用了Addressables的LoadAssetAsync函数,导致Addressables需要先进行初始化,此时的初始化中如果资源的类型是在热更新的类型,那么Addressables会认为该资源的类型为System.Object。所以需要先进行dll的加载才能够使用Addressables来加载资源,否则就会报UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown. No Asset found with for Key=xxx. Key exists as Type=System.Object, which is not assignable from the requested Type=YourHotUpdateAssetType。 解决思路 1.在结束了dll的加载之后Addressables重新初始化一遍? 2.还是继续使用AssetBundle来加载dll之后再使用Addressables

Bian-Sh commented 2 years ago

按理说,我这个仓库应该是没有问题的,你可以关注下我的场景加载逻辑:

  1. Assembly-CSharp.dll 中的 HotfixLoader加载了热更程序集
  2. 再查找热更程序集中标记了 InitializeOnAssemblyLoadAttribute的静态方法。
  3. 进而,由这个被修饰的静态方法调用热更的场景,见示例代码Init.cs#L11
  4. 总结:热更代码只能用在热更场景;热更场景的加载必须后于热更程序集;本项目已经考虑到并且已经处理了这个先后关系

PS : 谢谢使用或者参考我的开源项目,Cheers~

Bian-Sh commented 2 years ago

我可能理解了,你可以不要让 可寻址依赖你的热更类型呀,毕竟因果关系都乱了嘛,你可以约定特定的入口 key (string 类型,这种基础数据类型)来初始化热更入口。 另外,用户可以控制 catlog 的加载时机的

还有,描述 remote path 的类型可以不热更哈。

3356550151 commented 1 year ago

热更代码只能用于热更场景吗?

3lxl3 commented 1 year ago

@jiatengmeng 不知解决没有,遇到同样问题

jiatengmeng commented 1 year ago

@3lxl3 1.在loaddll结束后重新加载catalog Addressables.LoadContentCatalogAsync($"{Addressables.RuntimePath}/catalog.json"); 2.不要用具体类型,用object,可以在LoadAssetAsync出来后强转

ShenKang4181 commented 1 year ago

遇到同样问题,我加载的是其他工程的catalog文件,官网上的常见问题的解决方法不好使

3lxl3 commented 1 year ago

addressables和HybridCLR结合使用导致的资源加载错误 · Issue #2 · Bian-Sh/Assemblies-Hotfix-Toolkit-Unity (github.com)

2.不要用具体类型,用object,可以在LoadAssetAsync出来后强转

我的是用这个办法解决的

@.***

发件人: ShenKang4181 发送时间: 2023-06-25 18:32 收件人: Bian-Sh/Assemblies-Hotfix-Toolkit-Unity 抄送: liuxueliang; Mention 主题: Re: [Bian-Sh/Assemblies-Hotfix-Toolkit-Unity] addressables和HybridCLR结合使用导致的资源加载错误 (Issue #2) 遇到同样问题,我加载的是其他工程的catalog文件,官网上的常见问题的解决方法不好使 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

ShenKang4181 commented 1 year ago

Addressables和HybridCLR结合使用导致的资源加载错误 ·问题 #2 ·Bian-sh/Assemblies-Hotfix-Toolkit-Unity (github.com) 2.不要用具体类型,用对象,可以在LoadAssetAsync出来后强转 我的是用这个办法解决的 @. 发件人: 申康4181 发送时间: 2023-06-25 18:32 收件人: Bian-sh/Assemblies-Hotfix-Toolkit-Unity 抄送: 刘学良;提到 主题: Re: [Bian-Sh/Assemblies-Hotfix-Toolkit-Unity] addressables和HybridCLR结合使用导致的资源加载错误 (Issue #2) 遇到同样问题,我加载的是其他工程的catalog文件,官网上的常见问题的解决方法不好使 — 直接回复此电子邮件,在 GitHub 上查看或取消订阅。 您收到此消息是因为您被提及。消息 ID:@.>

我的不行,可能我加载的是别的工程的catalog,强转之后会报sctipt missing

3lxl3 commented 1 year ago

这个情况没有遇到过,之前遇到的是 ScriptableObject 加载问题 猜测 1 资源加载了对应的代码没有加载 2 unity,Addressables和HybridCLR版本是否对应一样,

这个HybridCLR官方关于sctipt missing的问题描述 https://hybridclr.doc.code-philosophy.com/docs/help/commonerrors#%E6%8C%82%E8%BD%BD%E5%9C%A8%E8%B5%84%E6%BA%90%E4%B8%8A%E7%9A%84%E8%84%9A%E6%9C%AC%E5%87%BA%E7%8E%B0-script-missing-%E9%94%99%E8%AF%AF

ShenKang4181 commented 1 year ago

这个情况没有遇到过,之前遇到的是 ScriptableObject 加载问题 猜测 1 资源加载了对应的代码没有加载 2 unity,Addressables和HybridCLR版本是否对应一样,

这个HybridCLR官方关于sctipt missing的问题描述 https://hybridclr.doc.code-philosophy.com/docs/help/commonerrors#%E6%8C%82%E8%BD%BD%E5%9C%A8%E8%B5%84%E6%BA%90%E4%B8%8A%E7%9A%84%E8%84%9A%E6%9C%AC%E5%87%BA%E7%8E%B0-script-missing-%E9%94%99%E8%AF%AF

我解决了,我在其他的工程里面新建了一个HotUpdate.asmdef,把相关的脚本放到里面,重新打包就好了

Bian-Sh commented 1 year ago

热更代码只能用于热更场景吗?

答案是明确的,热更代码只能配合ab使用,因为原工程中不会存在这些类型。 但是,你可以在加载并叠加场景后,对原场景动态挂载热更的 Type 也不是不行,想想这种需求挺有趣,就是感觉外在表现都在,但就是不给你注入灵魂,只有下载了热更代码并挂载,那些外在表现才活了过来。并且,如果不同的热更代码,这个外在的表现还可以不那么一样。这对哪些刻薄的甲方好像很有效,给你看就是不给你用,想用只能付费更新逻辑。

CubeSugarHX commented 5 months ago

当使用addressables来更新热更新的dll时。由于是先使用了Addressables的LoadAssetAsync函数,导致Addressables需要先进行初始化,此时的初始化中如果资源的类型是在热更新的类型,那么Addressables会认为该资源的类型为System.Object。所以需要先进行dll的加载才能够使用Addressables来加载资源,否则就会报UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown. No Asset found with for Key=xxx. Key exists as Type=System.Object, which is not assignable from the requested Type=YourHotUpdateAssetType。 解决思路 1.在结束了dll的加载之后Addressables重新初始化一遍? 2.还是继续使用AssetBundle来加载dll之后再使用Addressables

@3lxl3 1.在loaddll结束后重新加载catalog Addressables.LoadContentCatalogAsync($"{Addressables.RuntimePath}/catalog.json"); 2.不要用具体类型,用object,可以在LoadAssetAsync出来后强转

大佬你好,我采用object加载之后强转的方式拿到的 ScriptableObject类对象时空,单独打印非强转的数据可以打印出来,你知道这种情况是什么原因吗