当前位置: 首页 > news >正文

关于AssetBundle禁用TypeTree之后的一些可序列化的问题

1)关于AssetBundle禁用TypeTree之后的一些可序列化的问题
2)启动Unity导入变动的资源时,Singleton ScriptableObject 加载不到
3)Xcode15构建Unity 2022.3的Xcode工程,报错没有兼容的iPhone SDK


这是第361篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

AssetBundle

Q:如果AssetBundle禁用了TypeTree,Unity在加载的时候会对其引用的脚本进行“签名”校验(Property Hash和FulIName),而包内的脚本信息只在打包的时候生成,并不能直接更新。因此,在禁用TypeTree的时候,貌似不能对可序列化脚本进行变动更新。

于是,想要咨询两个问题:
1、包内的脚本“签名”信息存放在哪里,存放了什么内容? 猜测是在assets/bin/Data,但具体的位置与内容不清楚。

2、能否在禁用TypeTree的情况下实现可序列化脚本的变化更新(自行保证代码与资源一致)。

A:1、脚本“签名”信息是存在MonoScript上,保存了Assembly、Namespace、Class的名称,以及它的可序列化字段的Hash128,用AssetStudio可以看到。

2、在支持热更动态库的平台上(安卓)直接热更libil2cpp.so及元数据应该就可以。若寻求通用方案,恐怕要上HybridCLR这种深度定制IL2CPP的方案,因为引擎需要使用IL2CPP的API以类似反射的方式获取脚本的可序列化字段。

注意:HybridCLR对禁用TypeTree的情况参考以下说明:
MonoBehaviour支持 | HybridCLR

感谢littlesome@UWA问答社区提供了回答


Asset

Q:当有资源变动时,启动Unity,在导入资源时,Singleton ScriptableObject 加载不到,有解决办法么?

问题出现:
把ScriptableObject封装成单例,当配置文件,在别的资源导入的时候需要读单例配置。

已知现象:
加载不到的原因是当有新资源变化时,Asset Database要等新资源初始化完才能初始化完成,这个阶段,很多东西都加载不上来;Resource接口也是不能用的。

A1:可以参考Spine的做法:
https://github.com/EsotericSoftware/spine-runtimes/blob/b09e189c6438cb9358005771c3304b8f52bc4e30/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Utility/AssetUtility.cs#L114

见这段注释:

public static void HandleOnPostprocessAllAssets (string[] imported, List<string> texturesWithoutMetaFile) {// In case user used "Assets -> Reimport All", during the import process,// asset database is not initialized until some point. During that period,// all attempts to load any assets using API (i.e. AssetDatabase.LoadAssetAtPath)// will return null, and as result, assets won't be loaded even if they actually exists,// which may lead to numerous importing errors.// This situation also happens if Library folder is deleted from the project, which is a pretty// common case, since when using version control systems, the Library folder must be excluded.//// So to avoid this, in case asset database is not available, we delay loading the assets// until next time.//// Unity *always* reimports some internal assets after the process is done, so this method// is always called once again in a state when asset database is available.//// Checking whether AssetDatabase is initialized is done by attempting to load// a known "marker" asset that should always be available. Failing to load this asset// means that AssetDatabase is not initialized.AssetUtility.assetsImportedInWrongState.UnionWith(imported);if (AssetDatabaseAvailabilityDetector.IsAssetDatabaseAvailable()) {string[] combinedAssets = AssetUtility.assetsImportedInWrongState.ToArray();AssetUtility.assetsImportedInWrongState.Clear();AssetUtility.ImportSpineContent(combinedAssets, texturesWithoutMetaFile);}
}

感谢littlesome@UWA问答社区提供了回答

A2:将ScriptableObject序列化(例如json)保存到本地,资源导入时候直接读取本地配置反序列化。

感谢zerolj@UWA问答社区提供了回答


Platform

Q:最近不小心升级了Mac的版本,随之Xcode也要求升级到15.0,然而升级后,Unity 2022.3构建的Xcode工程无法构建,报错如下图所示,就是找不到兼容的iPhone SDK,这个问题尝试了很多方法无法解决,求问除了降低版本之外还有没有其他解决方案,万分感谢!

A:建议尝试将/Applications/Xcode.app/Contents/version.plist里的

<key>ProjectName</key>
<string>IDEApplication</string>

改成

<key>ProjectName</key>
<string>IDEFrameworks</string>

我看了下我在2022.3.10f1里的相关逻辑,已经改为判断是否是IDE开头:

确认了下,2022.3.10f1确实有提及对Xcode15兼容的支持:
Unity 2022.3.10

Unity Issue Tracker - Building projects with IL2CPP scripting backend for Apple platforms fails with Xcode 15.0b6 or newer

感谢littlesome@UWA问答社区提供了回答

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com

 

相关文章:

  • ArgoWorkflow教程(一)---DevOps 另一选择?云原生 CICD: ArgoWorkflow 初体验
  • 音频采集的相关基础知识
  • 【数据结构初阶(4)】栈的基本操作实现
  • 【DevOps】Git 图文详解(七):标签管理
  • 基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码
  • 基于Springboot+Vue选课系统
  • PTA 海盗分赃
  • Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂
  • 376.摆动序列
  • 【完美世界】叶倾仙强势登场,孔雀神主VS护道人,石昊重逢清漪
  • 【Vue】插值表达式
  • 6、信息打点——Web架构篇语言中间件数据库系统源码获取
  • 【学习篇】Linux中grep、sed、awk
  • Qt手写ListView
  • dom api
  • (三)从jvm层面了解线程的启动和停止
  • echarts花样作死的坑
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • gops —— Go 程序诊断分析工具
  • httpie使用详解
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js如何打印object对象
  • LeetCode29.两数相除 JavaScript
  • Mac转Windows的拯救指南
  • MobX
  • rc-form之最单纯情况
  • Xmanager 远程桌面 CentOS 7
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 工程优化暨babel升级小记
  • 前端学习笔记之观察者模式
  • 如何选择开源的机器学习框架?
  • 使用SAX解析XML
  • 为什么要用IPython/Jupyter?
  • 我建了一个叫Hello World的项目
  • 小而合理的前端理论:rscss和rsjs
  • 应用生命周期终极 DevOps 工具包
  • hi-nginx-1.3.4编译安装
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #if等命令的学习
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2)nginx 安装、启停
  • (30)数组元素和与数字和的绝对差
  • (C++17) std算法之执行策略 execution
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (独孤九剑)--文件系统
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)ABI是什么
  • (转)fock函数详解