Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jiatengmeng opened this issue Aug 29, 2022 · 12 comments
Open

Comments

@jiatengmeng
Copy link

当使用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
Copy link
Owner

Bian-Sh commented Aug 30, 2022

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

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

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

@Bian-Sh
Copy link
Owner

Bian-Sh commented Aug 30, 2022

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

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

@3356550151
Copy link

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

@3lxl3
Copy link

3lxl3 commented Jun 1, 2023

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

@jiatengmeng
Copy link
Author

jiatengmeng commented Jun 1, 2023

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

@ShenKang4181
Copy link

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

@3lxl3
Copy link

3lxl3 commented Jun 25, 2023 via email

@ShenKang4181
Copy link

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
Copy link

3lxl3 commented Jun 26, 2023

这个情况没有遇到过,之前遇到的是 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
Copy link

这个情况没有遇到过,之前遇到的是 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
Copy link
Owner

Bian-Sh commented Jul 14, 2023

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

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

@CubeSugarHX
Copy link

当使用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类对象时空,单独打印非强转的数据可以打印出来,你知道这种情况是什么原因吗

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants