Unity
文章平均质量分 85
永恒星
这个作者很懒,什么都没留下…
展开
-
Unity Job System详解(3)——NativeList源码分析
查看NativeList源码需要安装Unity的Entities PackageNativeList要实现的基本功能类似C# List,如下:(一些简单的类同NativeArray的不在说明)构造函数、析构函数、取值赋值扩容、添加、移除操作解析步骤包括,基本函数,常用操作,常用属性,接口函数。原创 2024-11-03 21:50:45 · 411 阅读 · 0 评论 -
Unity Job System详解(3)——NativeArray源码分析
【特性】原创 2024-10-28 21:01:54 · 988 阅读 · 0 评论 -
Unity Avatar详解
Avatar用于解决人形动画的复用问题。物理上,两个不同人形角色的骨骼结构整体一致。为其中一个角色制作好动画后,为了避免再次做同样的动画,我们自然而然想到将已经做好的动画迁移到另外一个角色上。但是我们不能直接去使用,例如将角色A的AnimationClip给角色B使用,角色B无任何反应。(角色模型和角色动画数据是可以分离的。因为无法找到骨骼节点对应的曲线数据。AnimationClip中会记录每个曲线对应哪个节点,通过相对根节点的路径作为标识。(运行时为省内存一般会哈希化)原创 2024-10-24 13:19:44 · 1014 阅读 · 0 评论 -
Unity AnimationClip详解(2)——动画数据的优化
首先要意识到运行时和编辑时的区别,当运行时和编辑时所需的数据相差不大时,我们用同一套数据结构即可,当两者差异较多或者数据量很大时,需要有各自的数据结构,这意味着在打包或构建时需要将编辑时数据转为运行时数据。(所以Unity中的AnimationClip Curve数据不提供给非editor情况下使用)(内存优化把握三个核心方向:一是内存中只存在当前或最近需要的资源及数据;二是需要的资源及数据在内存中仅存在一份;三是简化资源和数据的结构,运行时和编辑时的数据区分是方向1)由前文可知,动画至少有30个骨骼节点,原创 2024-10-21 21:43:52 · 693 阅读 · 0 评论 -
Unity AnimationClip详解(1)
前文我们介绍了骨骼动画,在Unity中骨骼动画的部分静态数据存储在SkinedMeshRender中,而另一部分动态的关键帧数据就是存储在AnimationClip中的。原创 2024-09-09 22:10:46 · 1262 阅读 · 0 评论 -
Unity构建详解(12)——自动构建
自动构建是指整个构建流程不需要人工操作,只需要输入启动构建指令即可获取构建结果。支持命令行参数启动我们不可能每次构建时都打开Unity去手动点击构建,必须支持通过命令行启动Unity自动执行构建我们每次构建的需求不同,可能构建Debug、Release或者其他特殊需求的应用,因此Unity需要支持识别命令行输入的不同参数支持工程自动检查我们构建时需要保证不会出现错误,否则中途就构建失败了。原创 2024-05-10 22:34:01 · 1418 阅读 · 1 评论 -
Unity构建详解(11)——代码剥离
我们知道代码在程序启动时全量加载到内存中的,一个库内的全部代码有些是不需要使用的,遵循减少内存的一个目标:内存中仅存在需要的数据,如果可以将这些不需要的代码去除,就可以减少内存,这就是代码剥离。对于大型的项目而言,代码剥离可以减少几十M的常驻内存。在Unity中,被剥离的是托管代码,并不是全部代码。使用 IL2CPP 编译时,托管代码剥离还可以减少构建时间,因为需要转换为 C++ 并进行编译的代码减少。游戏逻辑的C# 脚本构建的程序集插件中的程序集。原创 2024-04-28 19:26:34 · 1526 阅读 · 0 评论 -
Unity构建详解(10)——Unity构建流程
构建流程为:准备构建->资源收集->脚本编译->Shader编译->配置文件生成->平台构建原创 2024-04-22 20:24:01 · 1653 阅读 · 0 评论 -
Unity构建详解(9)——Addressable的打包结果
这里说的Task不算是真正SBP管线里的了,而是Addressable中自定义的,包括之前的GenerateLocationListsTask和Post Processing AssetBundles都是在Addressable中的。一般使用SBP时都会用上Addressable。原创 2024-04-15 21:24:08 · 1019 阅读 · 0 评论 -
Unity构建详解(8)——SBP的Bundle生成
这个Task目的是为Addressable创建寻址信息,在Addressable中每个Bundle、Asset都会有一个用于寻址的Location,上层加载传入路径,根据路径找到Location,根据Location找到Bundle、Asset。这一步会生成实际的SerializedFile文件,文件名就是之前的InternalName,但这还不是最终的Bundle文件,所以在之前的处理中会有一个InternalnameToBundleName的映射。这里生成最终的Bundle文件。原创 2024-04-13 18:32:29 · 1116 阅读 · 0 评论 -
Unity构建详解(7)——AssetBundle格式解析
文件可以分为文本文件、图片文件、音频文件、视频文件等等,我们常见的这些文件都有行业内的标准格式,其意味着按照一定的规则和规范去保存读取文件,可以获取我们想要的数据。有些软件会有自己的文件格式,会按照其自己设计的规则和规范去保存读取文件。我们自己在做开发时,也需要保存和读取一些文件,但我们需要保存的数据一般会比较简单,很少去做设计格式。例如,要保存一系列角色和怪物的当前血量。为了读取时能区分是角色和怪物,可以先保存角色个数。读取时先读取角色个数n,随后读取n个血量数据,这些都是角色的,随后读取的是怪物的。个数原创 2024-04-11 20:42:26 · 1832 阅读 · 0 评论 -
Unity构建详解(6)——SBP的Bundle写操作生成
这里其实就是将构建Bundle需要的参数封装成命令模式,每一个File(AssetBundle)都会有一个WriteOperation。这里主要是为了处理BuildExtendedAssetData,创建对应的AssetLoadInfo。原创 2024-04-02 21:21:48 · 1153 阅读 · 0 评论 -
Unity构建详解(4)——SBP的依赖后处理
这里Task存在的主要原因是:指定哪些Asset要被打包时不是一个个指定的,可以指定贴图所在的文件夹,此时文件夹内的贴图都被认为是要打包的Aseert,但实际上可能有些贴图根本不需要被打包,这里就是为了去掉不需要使用的贴图。Hash算法接受的输入是byte[],通常我们需要将输入数据转为byte[],转化的实现看HashingMethods.GetRawBytes。这里主要是因为要根据依赖计算Hash值,所以才放在后面,如果仅仅根据指定的Bundle的名字来算Hash值,可以去掉这个Task。原创 2024-03-27 20:30:05 · 1466 阅读 · 0 评论 -
Unity构建详解(2)——SBP的初始设置和脚本编译
TypeDB包含了Unity中所有的类、结构体、枚举、委托,类的名称、命名空间、父类、成员变量、方法等信息,它是Unity的一个核心组件,可以用来进行反射和序列化等操作,可以通过C#代码或Unity编辑器中的各种工具来访问和修改。这里步骤是可选得,在BuildApp时做,其可以用增量缓存,会生成一系列的文件和Dll,如果有缓存,可以直接读取。也是直接调用unity提供的接口,重新打包图集,这一步也可以完全自己做,一般会根据项目的实际情况,自己做图集打包。原创 2024-03-19 20:31:35 · 899 阅读 · 0 评论 -
Unity构建详解(1)——SBP介绍
Unity的资源工作流程分为导入、创建、构建、分发、加载。我们说的是其中的构建步骤。构建是指将项目工程中的资源文件和代码整合程可执行文件的过程,构建的结果是生成可执行文件,在win平台上是exe,在Android平台上是apk,在ios平台上是ipa。游戏比互联网的app多了很多资产,资产的整合是构建过程中非常耗时且重要的一步,这一步通常会被单独拿出来说,叫打包,在Unity中叫打Bundle。因此,我们说游戏构建通常分为两个大步骤,一是打包,二是构建。原创 2024-03-18 20:04:02 · 2712 阅读 · 0 评论 -
Unity Job System详解(2)——如何将业务逻辑Job化
Job化只是加速计算,并不改变原有的业务计算逻辑。并不是一上来就使用Job,而是要先优化下原有的业务逻辑。如果优化完了之后提升并不大,可以考虑再Job化。最好真的有一块的业务逻辑需要你Job化,要不然可能看不懂接下来再说什么。原创 2023-11-16 19:45:14 · 1004 阅读 · 0 评论 -
Unity Job System详解(1)——基础知识
当需要加速计算以优化性能时可以考虑使用Job。为了更好的理解和使用Job,需要有些并行编程的基础。必须先了解下C# Task是怎么回事。原创 2023-11-14 20:58:33 · 1196 阅读 · 0 评论 -
BlendTree动画混合算法详解
在动画混合中,四个点就表示四个动画片段,X轴和Y轴表示角色运动的两个属性,以速度和朝向为例,a1和a2是运行时根据角色当前的速度和朝向,以及动画片段的属性计算出来的。在实际运行时,需要先根据属性值知道四个动画片段,分两次找,每次找的方式与一维线性插值混合找的方式相同,然后进行双线性插值,得到最后的角色Pose。这实质上是一个离散数据插值问题,这里有一个基本假设,假设某个采样点对目标点的影响因子为h,所有采样点影响和为H,那么采样点的权重w = h/H。接下来需要确定两个动画片段的权重分别是多少。原创 2023-11-13 20:01:04 · 456 阅读 · 0 评论 -
骨骼动画详解
插值骨骼坐标:骨骼坐标插值要在骨骼自身空间中完成,如果在模型空间,那么插值出来的骨骼组成的Pose很怪异,因此,我们需要保存骨骼的TransformMatrix,而不是骨骼的TransformMatrix。首先,人眼的分辨率是有极限的,当两个点足够近,在人眼看来就连在一块,很多足够近的点就连成线了,再多的点就可以构成一个面。等到了66.6ms时,人眼才感知到物体在动。可以猜想不够平滑的地方是关节处,关节处的顶点受到多个骨骼的影响,在初始Pose中给定了每个骨骼的权重,在随后的计算中这些权重是固定不变的。原创 2023-11-06 21:06:16 · 790 阅读 · 0 评论 -
Unity性能优化
这里暂时将性能优化分为程序和渲染两个部分,这里主要说的是程序部分。原创 2023-03-12 16:52:53 · 556 阅读 · 0 评论 -
Unity内存管理的原理
【前言】当我们谈及Unity内存管理时,我们更多的是在说手游项目上如何更好的去管理内存,如果是在端游项目上,没有那么多讲究,内存随便用。【为什么手机上内存不够用】CPU读写速度远快于内存的速度,大多数时候CPU都在等内存给数据,为了缓解主存速度慢、跟不上CPU读写速度要求的矛盾,进而提高程序运行效率,CPU设计时引入了高速缓冲存储器。在PC中,CPU一般有三级缓存,大小共8~16M。而手机没有独立显卡、独立显存,CPU和GPU共用一个缓存,其内存更小,缓存级数更少、大小仅为2M。PC有内存.原创 2022-05-10 17:19:47 · 2450 阅读 · 1 评论 -
Unity HDRP快速制作Mask Map
在HDRP管线中,材质需要使用Mask Map贴图,这个贴图由四张子图合成。这四个子图都是【操作界面】using System.Collections;using System.Collections.Generic;using System.IO;using UnityEditor;using UnityEngine;public class MaskMapEditor : EditorWindow{ private Texture2D meta..原创 2021-12-25 19:52:31 · 5160 阅读 · 2 评论 -
编辑器扩展自定义按钮以便调试
有时候在运行时需要调试更改一些东西或调用某些方法,而这在Inspector面板中无法操作,所以需要自己写个编辑器扩展按钮等来方便调试。首先,写测试脚本,脚本中有需要的字段using UnityEngine;public class Test : MonoBehaviour{ public Vector3 pos;//位置 public Transform go;//需要设置位置的物体 public MyScript script;//需要执行的方法所在的脚本原创 2021-12-06 21:33:16 · 323 阅读 · 0 评论 -
对Unity资源Asset和对象Object的理解
【Asset和Object的区别】Unity将Assets文件夹下的文件称为"Asset",翻译成中文的意思是资源,为了便于理解,本文不翻译。一个文件就是一个Asset,我们知道这些文件是存储在硬盘上的。UnityEngine.Object是Asset的实例,A是B的实例所表示的意思是,将B的数据复制一份得到A,所以经常将实例叫克隆,这和类的实例化的意思差不多,两者区别是Asset的实例是完全复制不修改,类的实例化会修改某些字段的值。Object(的数据)存储在内存上。【Asset的分类】可原创 2021-10-14 21:09:12 · 2400 阅读 · 0 评论 -
Unity微信聊天框界面制作
【原理】一个聊天界面主要由三个部分组成:内容区、可见区、滑动条可见区在内容区上边,内容区会随着聊天内容变得非常长,但只有位于可见区的部分才能被看见,其他区域的看不见。通过滑动条上下移动内容区,看见的内容发生变化。【步骤】新建一个UI->Panel,重命名为ChatPanel,添加Scroll Rect组件 在ChatPanel下新建一个UI->Panel,重命名为ViewPort,添加Mask组件 在ChatPanel下新建一个UI->Scrollbar,Directi原创 2021-10-13 18:32:33 · 9497 阅读 · 19 评论 -
UGUI源码调试方法
新建一个工程,找到工程中的Package文件夹进入文件点开manifest.json,删除 "com.unity.ugui": "1.0.0",回到Unity中,在Package下找到Unity.UI文件夹,右键单击,然后选择Show in Explorer将com.unity.ugui@1.0.0文件夹剪切到工程Asset文件夹,这个文件夹包含了项目的源码。源码也可在C:\ProgramFiles\UnityEditor\2019.4.28f1\Editor\Data\Resour...原创 2021-08-26 19:59:54 · 948 阅读 · 1 评论 -
Unity可配置关节详解
【组件界面】【前置基础】关节的作用是使得两个刚体连接到一起,使两个刚体的运动受到对方的限制,例如绳子连接的两个石块的运动会受到对方的限制。在关节中,这种运动限制通过锚点来实现,其原理是:关节有六个自由度,在物体A上有个锚点a,物体B上有个锚点b,锚点ab分别相对于物体AB有Position和Rotation,两个锚点间也有Position和Rotation,后两者的差值表示的是关节的Position和Rotation的值。物体AB运动时使得锚点ab的Position和Rotation改.原创 2021-08-06 20:22:01 · 2569 阅读 · 0 评论 -
Unity中的Camera相机组件详解
【组件界面】原创 2021-08-25 17:35:04 · 10663 阅读 · 0 评论 -
理解Unity中的序列化
【什么是序列化】序列化是将对象转换为二进制流的过程,反序列化是将二进制流转换为对象的过程。序列化主要解决对象的传输问题。Unity对Unity有自己的序列化机制(方法),但没有开放成API。Unity 的一些内置功能(保存和加载、Inspector 窗口、实例化和预制件)的实现需要使用序列化。【Unity中可序列化的对象】该对象必须是非static、非const、非readonly,且为public 或者具有SerializeField属性 可序列化的字段类型 原始数据类型(int、floa原创 2021-07-14 14:44:09 · 9836 阅读 · 4 评论 -
Unity中的时间
【流程图】【流程图说明】计算Time.deltaTime,其表示从上一帧开始到这一帧开始所用的时间,也即相邻两帧的时间间隔,单位为秒。其受Time.timeScale影响,默认值时1.0,可以通过修改其值来实现运动加速和减慢,设置为0可实现游戏暂停。 判断Time.deltaTime是否大于Time.maximumDeltaTime,其表示两帧间所允许的最大时间间隔。如果上一帧用时过长超过了这个值,那么帧间隔将被设置为这个值。这意味着上一帧可能并没有全部执行完,但下一帧就要开始执行了。而上一帧用.原创 2021-06-26 11:39:00 · 1338 阅读 · 1 评论 -
Unity与mono内存管理
【C#与mono】C#有跨平台的特性,因为C#代码先被编译器变成CIL(公共中间语言,Common Intermediate Language),CLR(公共语言运行时,Common Language Runtime)控制着CIL的解释和执行。平台按照一定的标准(.Net、CLI等)实现CLR,那么用C#写的程序就可以在该平台上运行。.Net Core 实现了CLR,可以跨平台;mono也实现了CLR,按照其实现的方法,在更多的平台上实现了CLR,这样就能跨更多的平台。例如,在Android系统上,游戏原创 2021-04-12 16:00:00 · 984 阅读 · 2 评论 -
抛物线射击功能实现详解
射击要具备四个基本条件:射击方向direction,射击速度speed,射击角度angle,目标位置dstPosition。【A】我们从最简单的情况开始:射击方向、角度、速度固定,目标位置随意。取angle=45°,speed=40,direction=Vector3.right根据斜抛运动的物理知识可知,炮弹的运动可分为水平方向的运动和垂直方向的运动。实现运动实际上是要计算出每个时刻炮弹...原创 2019-10-26 16:29:33 · 2029 阅读 · 0 评论 -
Unity获取物体、脚本、组件的引用
随着逻辑复杂起来,有时一个物体的引用要被很多的脚本获得,这是可以这样:单独写一个ObjectRef脚本,脚本中有公开的变量成员,如Public GameObject go,Public Button button等等,在Hierarchy中将对应的物体拖过去。 新建一个GameObject,改名字为RefHolder,将ObjectRef挂载在下面 在某个脚本中获取某个物体的引用时...原创 2020-04-05 21:32:28 · 9357 阅读 · 0 评论 -
Unity渲染优化
【前言】影响游戏渲染的主要原因主要归为三个方面,CPU、CPU、带宽。【CPU优化——减少DrawCall数目】动态批处理 原理:对共享同一个材质的模型自动批处理,每一帧把可以批处理的模型网格合并,把合并后的模型数据传递给GPU,然后使用同一材质渲染。 特点:Unity自动完成,不需要自己做任何操作,物体可以移动;限制条件多,很可能无法批处理,例如模型网格的顶点属性规模要小于900。 静态批处理: 原理:在运行开始阶段,Unity会合并所有被标识为Static的物体,把这些需要进行原创 2020-09-16 21:19:33 · 599 阅读 · 0 评论 -
Unity中的FixedUpdate、Update、LateUpdate的区别及游戏帧更新
【基本了解】三者执行顺序:FixedUpdate ——>Update ——>LateUpdate 三者作用:FixedUpdate固定帧更新,一般用作物理更新;Update一般用作游戏逻辑更新;LateUpdate一般用作相机更新【深入了解】帧率的概念帧率是什么呢?一秒内画面更新的次数。游戏常用的有30fps,60fps。我们知道,帧率低游戏会卡顿,具体解释下就是,每秒内看到的画面更新次数变少,少于一个阈值,那么画面在人眼看来就是不连续的,也即卡顿的。这是阈值是多少呢?人眼识别原创 2020-09-10 18:42:41 · 10194 阅读 · 1 评论 -
对Unity中的四元数的理解
【四元数的概念】四元数的数学表示形式:w+xi+yj+zk 通常记为 [w,(x,y,z)] 这是一个3D复数,有一个实部w,三个虚部x,y,z。(2D复数只有一个实部和一个虚部) Unity中记为(x,y,z,w)四元数的几何意义:如果一个模型的当前的旋转状态A =(10,20,30)(Unity中的ZXY旋转顺序),下一次的旋转状态B =(60,50,40)。如果用欧拉角表示旋转过程E =(50,30,10) 。(注意:描述旋转状态时我们...原创 2020-07-11 16:07:48 · 2138 阅读 · 0 评论 -
对Unity中的欧拉角的理解
【前言】欧拉角对人来说是十分直观的,很适合人机交互中,但不适用于插值和迭代。在说到欧拉角时有两点非常重要:旋转方式和旋转顺序【旋转方式】首先要区分每次旋转是绕固定轴旋转的,还是绕旋转之后的轴旋转的。绕固定轴旋转就是旋转过程中XYZ轴不变,绕旋转之后的轴旋转表示每次旋转时XYZ改变了。在Unity中绕固定轴旋转可以看做是绕世界坐标系旋转。看下图中的鲨鱼的Transform中,面板上显示的Rotation为(0,0,0)。在场景中由于我们选择的是Global,相当于绕固定轴旋转。原创 2020-07-08 18:15:27 · 3690 阅读 · 5 评论 -
Unity内存/GC优化方法
在某些脚本中,使用Invoke Repeating或者Coroutine来替代Update方法 Debug.log()会消耗很多性能,游戏完成后尽量去掉无用的Debug 减少Find,Component的使用 合理使用数据结构与算法 对于子弹等不断重复出现消失的物体使用对象池Object Pooling管理 减少拆箱代码未完待续。。。...原创 2020-06-28 15:23:27 · 7388 阅读 · 0 评论 -
Unity中Start、Uptade、Awake和method的区别及调用顺序
1.在同一个脚本中,Start在Update之前执行;Start只执行一次,Update每帧都执行;一般将初始化的代码放在Start中,将随时间改变的代码放在Update(例如,移动要有时间,一般放在Update中)。2.场景中有多个脚本时,会先执行完所有脚本的Start,然后在执行完所有脚本的Update;所有脚本的Start按照什么顺序来执行是不确定的,所以需要自己设计顺序。...原创 2020-03-22 13:14:17 · 1991 阅读 · 0 评论 -
初始化的数据要放在Start里面,不要放在Update里
最近做的游戏比较复杂涉及到网络,由于逻辑比较复杂,把中间某一过程初始化的数据放在Update里,结果两个工程中生成的一系列物体不一致,找了好长时间的BUG,最中发现是在Update里执行了很多次,虽然我在写的时候是逻辑是按照只执行一次初始化数据来的。所以,在任何阶段的初始化数据要放在Start中,不要放在Update中。...原创 2020-03-20 21:51:18 · 343 阅读 · 0 评论