开发期资源管理的策略选择

news/2024/7/20 22:12:13 标签: Resource, iOS, Animation, Editor

1)开发期资源管理的策略选择
​2)iOS14启动就Crash
3)IL2CPP加密:global-metadata.dat在iOS下的解密问题
4)如何实现可程序控制的3D动作
5)Unity Editor内Screen的Width和Height


这是第212篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Resource

Q1:因为打包需要用AssetBundle,但是开发中用AssetBundle不太友好,以上两种加载都会有各自的问题:
Resources:需要放在Resources文件夹下,打包不好处理。
AssetDatabase:没有异步加载方法,开发中没办法模拟一些需要异步加载的情况。

目前项目用的Resources,打包机分了两个项目,打APK的项目阉割了Resources,写了单独版本管理更新命令,但是依然挺麻烦。大部分公司都是用的AssetDatabase,请问是否有一些方法可以模拟异步加载?

另外以上两种方法都无法模拟真实的卸载情况,导致组员不合理操作时,打AssetBundle后会有内存泄漏或者丢失引用的情况,可以说一些大家公司开发时用的资源管理方案吗?

A1:用AssetDatabase可以加一些随机延时模拟异步,资源加载的接口可以封装一下,做到根据配置来决定走AssetDatabase还是走AssetBundle。

我们打包机会把打好的AssetBundle自动提交到SVN,可以随时更新下来,在编辑器下测AssetBundle比较方便。

另外:新的Addressable也可以试试看。

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

A2:听说过一个项目组做法是:平时开发使用Resources来加载;打AssetBundle或者正式包时,按某些规则根据Resources的目录自动生成一个新工程,这样就不用维护两个工程了。

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

A3:之前是协程模拟AssetDatabase下的异步,即LoadFromFileAsync。

后面尝试过一种方法,就是使用单独的美术工程处理AssetBundle,然后程序工程不负责任何资源,只使用美术工程打包生成的AssetBundle。初听上去流程比较复杂,一点点小的改动即需要操作2个Unity工程。但是其优点也是非常多的。

代码上可以保留AssetDatabase的加载部分用于调试,当然能在日常开发中使用AssetBundle大部分时候能把AssetBundle的Bug暴露在Editor端,而不是上了真机才出问题。

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

A4:以前是用Resources来加载,只不过会把资源放到Editor/Resources目录下来避免被打进包内。

然后要发布的时候切换Flag,并读取Editor/Resources目录下资源进行打AssetBundle包。不过现在全部交给Addressables来管理了。

感谢黄程@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f0acbca39b05c2c143aa37e


iOS

Q:在iOS 14发布之后,就出现闪退问题了。和机型没关,只要是iOS 14就必闪退的那种,iOS 13就正常。用的Unity版本是2018.2.3。请教有人遇到过吗?

 

A:我们iOS14也出了状况,有两个表现:

  1. 启动就闪退,多起几次可以过去。
  2. 启动后到某个阶段之间卡死(必卡跳不过)。

XCode里看,始终是GfxDriver报错,我们渠道方发现,XCode里【BuildSetting - Packaging - Product Name】不能含有中文,有中文就出这个问题,改掉就好了。

根本原因尚不明确,个人猜测Product Name会影响Header Folder Path,可能是代码加载路径中出现中文会出问题(类似早期Unity的状况)。希望对你有帮助。

感谢Walker@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f0c6d02423c965a6f40736c


iOS

Q1:为了加大破解难度,需要对global-metadata.dat文件进行加密。
实现方式是:
1. 加密在导出Android和Xcode工程后进行,对global-metadata.dat按字节加密。
2. 修改:
Android:\Editor\Data\il2cpp\libil2cpp\vm\MetadataLoader.cpp
Mac:Unity.app\Contents\il2cpp\libil2cpp\vm\MetadataLoader.cpp
文件中的LoadMetadataFile函数,对从文件中读取出来的内容按字节解密。

现在出现的问题是:在Android上没有问题,可以正常加密和运行游戏。但是在Mac上,貌似解密函数没有生效,导致启动游戏崩溃。

请教一下各位大佬:在Mac上,global-metadata.dat的读取是不是不是通过这个函数。我看到Mac上Unity安装目录还有一个PlaybackEngines文件夹,里面也有IL2CPP相关文件,例如MetadataLoader.h,但这个文件是只读的,无法修改,而且也没有找到MetadataLoader.cpp。Mac上解密不生效和这个文件有关吗?

A:iOS上是直接链接预编译好的PlaybackEngines\iOSSupport\Trampoline\Libraries\libil2cpp.a
可能需要自己把.a从工程里移除,把IL2CPP源码引入到工程里。

Q2:工程是指iOS Support/Tramponline文件夹下的Xcode工程吗?要把Unity.app\Contents\il2cpp\libil2cpp中的文件全部加入到这个工程里面是吗?

A:是指导出的项目工程。具体哪些文件可能需要自己试试了。可以在Windows上导个IL2CPP的VS工程对照一下文件和编译参数。

Q3:我们最近遇到这个iOS加密Metadata的问题,请问最后有找到解决方案吗?https://forum.unity.com/threads/how-to-cross-compile-libil2cpp-for-ios-platform.785315/ 看这个帖子,似乎是需要Unity源码才可以?

A:IL2CPP的代码直接拖到XCode工程里应该就可以了。

感谢littlesome@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5edf80de55f66053ed8029d0


Animation

Q:我们的需求是希望用程序实现灵活的拍掌动作,如下图:


中间一个大模型,左右两手,两手掌要做拍掌动作,蓝色点都可作为拍掌点,就是说要让程序控制拍到哪里。目前想到的方案是:
1. 做很多个拍掌动画,然后在Blend Tree里用二维混合,但那样不够精确。
2. 用Final IK,控制两手掌运动,但那样做的动作不自然。

我们希望尽量减少K动作工作(外包耗不起),问有没有其它方案可用?

A1:这种需求基本上都需要使用IK来做,Final IK是目前看到的Unity引擎中最为成熟的IK解决方案了。如果还是不行,可能需要考虑自行研发了。

该问答由UWA提供

A2:我们之前用过2D Freeform Directional的Blend Tree来融合前后左右移动的动作,融合效果是比较理想的。道理上你分别做最左最右最上和最下四个拍掌动作,然后通过两个参数分别控制左右和上下的融合,能够比较线性地对应起来,精确度应该能接受,不过我没资源测试,也不确定你对精确度要求程度,还是建议做个Demo试试。

感谢邓永健@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f0de05f125d6020412cc118


Editor

Q:在Unity 2018.4.23版本中测试,新增一个9:16的分辨率,此时获取到的Width与Height是515x916,如果改动Game窗口大小,这个值也会变,请问这个具体规则是怎样的呢?

发现应该是乘以了对应分辨率下的Scale值,比如在720x1280的分辨率下看Game窗口的Scale值是0.741,切成9:16后的分辨率正好是533x948(720x0.741 : 1280x0.741)。现在有API能获取到这个值么?

因为有一些UI操作,比如会把一张图设为和屏幕一样大的大小,但在Editor下UI分辨率是720x1280,所以会和期望的值不一样。如果把分辨率设为720x1280(也是9:16),那么获取到的值就是对的。

主要是想知道规则,然后能根据515x916换算出来720x1280。

A:编辑器下,如果Game窗口采用的比例(Aspect Ratio)的模式,Screen获取的就是Game窗口的实际大小。如果Game窗口采用的是固定分辨率(Fixed Resolution)。Screen获取的就是设定的窗口大小。

感谢张首峰@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f0d6e2f6ef758272c63739e

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)


http://www.niftyadmin.cn/n/1030901.html

相关文章

Linux内核:基于int指令的经典系统调用过程分析

众所周知,代码运行可以存在多种不同的特权级别,而针对Linux系统,即为:用户模式(user mode)和内核模式(kernel mode)。在用户模式下,CPU的功能空间受到极大的限制,是没有权利访问多少系统资源的,…

Addressable卸载单个资源的疑问

1)Addressable卸载单个资源的疑问 ​2)如何判断硬件支持GPU Instance 3)StringBuilder反射实现String报错 4)Unity 2018 RequireES3.1AEP有什么作用 5)Unity打包AssetBundle闪退 这是第213篇UWA技术知识分享的推送。今…

C语言:宏定义的#和##用法

在查看学习操作系统的过程&#xff0c;会经常遇到各种宏定义&#xff0c;其中有两种宏参数的定义方式较为特殊&#xff0c;分贝是#和##。 其中#为将宏参数按照符号名直接解析成字符串&#xff1b;##为参数连接符号。 #include <stdio.h> #include <string.h> #in…

机器学习驱动的游戏AI 应用流程指南

以卡丁车游戏演示 AI 开发过程&#xff0c;来一场速度与激情&#xff1f;自己玩卡丁车的时候总是碰撞&#xff1f;那不如跟着课程作者一起来打造一个可以自己掌控的AI 玩家&#xff1f;哇&#xff5e;想想就很酷&#xff0c;那我们开始吧&#xff01; #你将获得# 1、实践将机器…

出于数据保护的结构体指针强制转换和字段截断

/*人为地在更改结构体指针的类型&#xff0c;从而手动地实现结构体指针在读取第一个字段之后便被截断&#xff0c;可以用来隐藏不想暴露的其他信息*/ #include <stdio.h> #include <stdlib.h> #include <string.h>void foo(){printf("inSide foo functi…

LuaJIT性能热点函数优化

1&#xff09;LuaJIT性能热点函数优化 ​2&#xff09;Unity 2019.4打包Android疑问 3&#xff09;RenderTexture.GetTemporary报错问题 4&#xff09;WaitForTargetFPS耗时太高 5&#xff09;ParticleSystem.Main的有效性 这是第214篇UWA技术知识分享的推送。今天我们继续为大…

Windows系统:解析文件句柄Handle的详细机制

1. 用户程序和运行库层面的文件”句柄” FILE* IO初始化时讨论了在运行库层面的文件句柄管理机制&#xff0c;工作流程如下FILE *file ->ininfo* pioinfo\[\]\[\] -> ioinfo 1.在程序中提供给IO函数的文件句柄是封装在FILE*指针里面的&#xff1b;2.FILE结构体总共包括…

游戏开发中的优化思维

本文讨论的是GamePlay开发中面对一些需要改善的问题时所做的思考&#xff0c;选例具有一定针对性&#xff0c;无Demo示例&#xff0c;请知悉。 作者是这样介绍他的文章的&#xff1a; 文章主要介绍在开发中&#xff0c;一些具有共性的调优步骤&#xff0c;以及能够给游戏“追求…