在 HTML 中将脚本添加到 assetbundle
Add script to assetbundle in HTML
我正在做一个项目,使用 Unity WebGL 显示不同的 machines/parts/.. 在 3D 中,这些零件或机器由用户选择,然后加载到场景中(目前有只是一个场景,但我们可能还想动态加载场景。
由于选择较多,我们希望创建不同的资产包,每个包含 1 个或多个部分,因此我们可以按需下载这些。
我通过将 URL 传递给 LoadFromCacheOrDownload
并从 www 对象中提取 gameObject 成功地完成了这项工作。
现在我们还想在资产中包含脚本以创建动画和用户交互。我遵循了这里给出的解释:docs.unity3d link,这在 WebPlayer 中完美运行。但是最终要求是 WebGL,为 WebGL 构建的相同代码会出现以下错误:
NotSupportedException: /Users/builduser/buildslave/unity/build/Tools/il2cpp/il2cpp/libil2cpp/icalls/mscorlib/System/AppDomain.cpp(184) : Unsupported internal call for IL2CPP:AppDomain::LoadAssemblyRaw - "This icall is not supported by il2cpp."
System.AppDomain.LoadAssemblyRaw (System.Byte[] rawAssembly, System.Byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence, Boolean refonly)
System.AppDomain.Load (System.Byte[] rawAssembly, System.Byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence, Boolean refonly)
System.AppDomain.Load (System.Byte[] rawAssembly, System.Byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence)
System.AppDomain.Load (System.Byte[] rawAssembly)
System.Reflection.Assembly.Load (System.Byte[] rawAssembly)
API+c__Iterator0.MoveNext ()
它似乎源于调用 System.Reflection.Assembly.Load(txt.bytes);
(我从示例中得到),所以我想反射 class 还没有(还?)完全支持 WebGL。我似乎找不到任何关于此的文档。
有没有办法为此使用反射?充其量我希望有一些不同的代码可以解决这个问题,最坏的情况是我们必须在 Javascript 中为 WebGL 创建脚本并按原样添加它们而不是二进制文件?我在这里有点迷路,所以感谢任何线索。
(来自 answers.unity3d 的交叉发布)
不,无法通过反射绕过此限制。
在这种情况下,Unity 中网络播放器和 WebGL 构建目标之间的主要区别在于 WebGL 使用 AOT(提前)编译,而网络播放器使用 JIT(即时)编译。使用 AOT 编译,不可能在 运行 时加载编译时不存在的程序集。
当然,可以在 运行 时加载 JavaScript 代码,所以按照您的建议,您可能需要走这条路。
我正在做一个项目,使用 Unity WebGL 显示不同的 machines/parts/.. 在 3D 中,这些零件或机器由用户选择,然后加载到场景中(目前有只是一个场景,但我们可能还想动态加载场景。
由于选择较多,我们希望创建不同的资产包,每个包含 1 个或多个部分,因此我们可以按需下载这些。
我通过将 URL 传递给 LoadFromCacheOrDownload
并从 www 对象中提取 gameObject 成功地完成了这项工作。
现在我们还想在资产中包含脚本以创建动画和用户交互。我遵循了这里给出的解释:docs.unity3d link,这在 WebPlayer 中完美运行。但是最终要求是 WebGL,为 WebGL 构建的相同代码会出现以下错误:
NotSupportedException: /Users/builduser/buildslave/unity/build/Tools/il2cpp/il2cpp/libil2cpp/icalls/mscorlib/System/AppDomain.cpp(184) : Unsupported internal call for IL2CPP:AppDomain::LoadAssemblyRaw - "This icall is not supported by il2cpp." System.AppDomain.LoadAssemblyRaw (System.Byte[] rawAssembly, System.Byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence, Boolean refonly) System.AppDomain.Load (System.Byte[] rawAssembly, System.Byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence, Boolean refonly) System.AppDomain.Load (System.Byte[] rawAssembly, System.Byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence) System.AppDomain.Load (System.Byte[] rawAssembly) System.Reflection.Assembly.Load (System.Byte[] rawAssembly) API+c__Iterator0.MoveNext ()
它似乎源于调用 System.Reflection.Assembly.Load(txt.bytes);
(我从示例中得到),所以我想反射 class 还没有(还?)完全支持 WebGL。我似乎找不到任何关于此的文档。
有没有办法为此使用反射?充其量我希望有一些不同的代码可以解决这个问题,最坏的情况是我们必须在 Javascript 中为 WebGL 创建脚本并按原样添加它们而不是二进制文件?我在这里有点迷路,所以感谢任何线索。
(来自 answers.unity3d 的交叉发布)
不,无法通过反射绕过此限制。
在这种情况下,Unity 中网络播放器和 WebGL 构建目标之间的主要区别在于 WebGL 使用 AOT(提前)编译,而网络播放器使用 JIT(即时)编译。使用 AOT 编译,不可能在 运行 时加载编译时不存在的程序集。
当然,可以在 运行 时加载 JavaScript 代码,所以按照您的建议,您可能需要走这条路。