自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 Unity Nav Mesh导航系统的简单使用

勾选后,会依据设置的高度、可跳跃宽度等全局选项,在满足条件的地方(如存在高度差或间隙等)自动生成 OffMeshLink(导航链接 ),用于指示寻路代理可跨越的区域。Height:一样是能通过的最小间隙,与Bake的区别就是,Bake先决定好了NavMesh的可行区,然后Agent的Height再对每个player进行个性化的定义。(可行/不可行/自定义区域),每个区域有不同的权值,而导航依赖于这些权值来做判断。Agent Height:定义可行高度的最小值,大于等于这个值的高度才有可能是可行区域。

2025-04-19 16:10:37 583

原创 ORCA避障算法梗概

速度障碍是一种几何概念,用于描述两个智能体发生碰撞的所有相对速度集合。对于智能体 A 和智能体 B,以智能体 A 为参考系,智能体 B 的速度障碍区域是一个锥体,锥体的顶点在智能体 A 的位置,锥体的两条边与智能体 B 的边界相切。如果智能体 A 的相对速度落入这个锥体内,那么两个智能体将会发生碰撞。易得以最优速度垂直的外半平面都是可行解,因为任意一个点的向量在u方向上的投影都大于或者等于u。高中线性规划,在可行解集中找到一个最优速度解。若无解则会采取后退避让。

2025-04-18 11:32:36 97

原创 万向死锁的发生

可以把万向死锁的情况理解成:由于轴体旋转的顺序是固定的,而中间轴的90倍数度旋转会导致最后一个轴体的位置回到了中间轴体变换之前第一个轴体的位置,所以导致最后一个轴体的变换看起来与第一个轴体变换相似,导致失去了一个自由度。由于这种描述方式下会发生万向死锁,解决办法有1.让不太可能到达90倍数的轴体充当中间轴2.用更好的描述方式来描述旋转,于是引出了四元数。欧拉角在Unity中描述的是一种变换(Transform)共有3个轴体,默认顺序为x->y->z.

2025-04-17 12:00:12 160

原创 Unity使用Newtonsoft.Json本地化存档

把要存储的对象数据等使用JsonConvert.SerializeObject(object T)进行序列化为字符串,并且通过File.WriteAllText写入json文本文件。由于硬盘的读写是比较耗时的操作,我们可以用字典存储<userName,userData>的键值对。好处:读取相同的数据只有第一次需要使用文件读取,后续只需要使用字典访问。因为一个数字异或同一个数字两次能得到原来的结果,所以可以借此来加密解密。读取的时候就通过反序列化读取存储的数据。

2025-04-16 01:38:39 278

原创 Unity有限制状态机FSM

一般的小型游戏的状态机会使用一个枚举类来枚举所有的状态,然后使用一个switch case来处理所有状态的行为逻辑,但是用这种方式会形成大量的冗余,因为所有的行为逻辑都在一个脚本中,所以团队开发来说模块性不足,可扩展性低。所以就有了有限制状态机(FSM),行为逻辑写在别的脚本中,每个行为逻辑之间互相独立,并且通过一个状态控制中心来进行控制,同时有“大脑”BlackBoard来实现整体之间的数据互通和共享,可拓展性和模块性强,耦合度低。

2025-04-14 21:04:29 417

原创 UGUI优化

UGUI优化核心在于减少渲染状态的开销。那么怎么减少渲染开销呢?减少渲染过程中的Setpasscall次数(从一个材质的渲染状态切换到另一个材质的不同渲染状态,或者启用 / 禁用某些渲染特性)。明明大头不在DrawCall为什么还要关心合批来减少drawcall?因为如果更换批次大概率会增加setpasscall,unity不能完全的帮我们处理好渲染的批次分配,我们需要通过一些人为的干预从而减少setpasscall。详细看我之前的这篇文章链接跳转。

2025-04-03 15:09:38 945

原创 unity客户端面试高频2(自用未完持续更新)

析构函数需要定义为虚函数的主要原因是为了在使用基类指针指向派生类对象并通过该指针删除对象时,可以正确地调用派生类对象的析构函数,以防止内存泄漏。如果不将析构函数定义为虚函数,当使用基类指针指向派生类对象并通过该指针删除对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。去掉forward直接传递arg的话会导致,第一次传入forwardExample这个函数时,在这函数生命周期中是右值,然而第二次传递进去的是一个arg的参数会被识别为左值。右值引用会给右值一个临时的地址,并且延长它的生命周期。

2025-03-29 17:29:48 1258

原创 【Unity】合批处理和GPU实例化的底层优化原理(完)

原因:unity可以识别一些简单的物体是否是相同的材质,并且自动合批,但是在大多数复杂的环境下unity在渲染的时候不能分辨哪些是同一个材质,只是在某些复杂场景下,比如动态物体较多、材质变体复杂等情况,可能无法完美做到所有相同材质物体都能高效合并,导致仍存在多次切换相同材质引发 SetPass Call 的情况,所以合批是为了让尽可能减少的切换到相同材质的情况导致多次调用 SetPass Call。据说很鸡肋使用条件十分之苛刻,只能在很有限的范围内进行优化,甚至是负优化,HDRP甚至不支持。

2025-03-24 23:43:44 811

原创 Unity客户端一些面试高频题(自用不定期更新)

如果对象池物体创立之后经过一段时间的高频使用后使用变少,那么本来创建的多个对象就闲置了,有什么办法优化吗?引用类型在传递给函数时,传递的是对象的引用而不是对象本身,不过多赘述。答:C#的关键字Ref和out关键字就是在做这件事。unity中存在多进程的情况,但比较复杂。C#没有指针,只有引用类型与值类型。那C#是怎么修改传入的值类型的?

2025-03-24 20:37:59 1076

原创 unityAB包(2/2)

如果你手动把相关的材质添加到了另外的AB包中,此时该材质就不会添加到预设体的AB包中(可能是出于性能考虑机制),则一定要引用预设体对应的包和材质所对应的包,否则会出现材质错误。通过给定的API得到所有依赖的信息,然后用一个string数组存储这些依赖包的名字,通过遍历依赖名字数组导入所有的依赖。显而易见的是当这个预设体的引用来自各个不同的AB包中,那么一条一条引入包的代码就会显得很冗余。这种方法不能对一个AB包中的预设体进行区分,例如A刚需EF包,B刚需OL包,在类建立之初就创建一个只读的对象,确保唯一。

2025-03-23 18:37:40 359

原创 unityAB包(1/2)

当参数为true时,会卸载所有已加载的 AB 包,并且会卸载所有通过这些 AB 包加载到内存中的资源,即便这些资源正被其他部分依赖引用;当参数为false时 ,会卸载所有未被其他资源依赖的 AB 包及其资源,对于正被依赖引用的资源则不会卸载。首先在Project窗口,在Asset窗口下创建一个名为Editor的文件夹,并将AB包导出的代码放于此处,否者将报错。AB包导出的资源最好合理分类,不要引用Project中的Resource内的资源文件,否则会多次调用复制。Configure栏。

2025-03-20 23:26:36 854

原创 C#的List和DIctionary实现原理(手搓泛型类以及增删查改等功能)

Add方法:向列表中添加元素,若数组容量不足,会调用EnsureCapacity方法来扩容。EnsureCapacity方法:确保数组容量足够,若不足则将数组容量扩大为原来的 2 倍。索引器this[int index]:用于访问列表中的元素。MyList类:这是一个泛型类,能够存储任意类型的元素。_size变量:记录当前列表中的元素数量。Count属性:获取列表中的元素数量。_items数组:用于实际存储元素。构造函数:初始化数组容量为 4。

2025-03-19 19:35:07 350

原创 计算机图形学学习日志4

La表示环境光,该物体本来该有的颜色。Ld表示漫反射光,与出射角无关。Ls表示镜面反射,与半程向量和法线的夹角有关。半程向量是入射光线方向向量与观测方向向量的中间向量。1.每个面: flat Shading。2.每顶点: Gouraud Shading。3.每像素: Phong Shading。是每个面法线的加权平均! 权为面积!是两个顶点法线之间的一个平滑过渡,感觉是Lerp?u01,u11对s进行插值。记x1u00,u10对s进行插值。记x2x1, x2对t进行插值。根据相邻像

2025-03-19 17:37:43 800

原创 计算机图形学学习日志3

Z-Buffer在以画家算法思想(没有排序)渲染的时候,记录当前像素点的深度,如果后续该点的深度大于新渲染的点的深度,那么更新这个像素点的深度为较浅的这个。kd表示漫反射系数,i表示单位长度能获取的能量,r表示距离光源距离,max(0, n*l)表示入射和发现夹角余弦值,与v无关。由于能量守恒,单位面积光强相等,小的圆球表面积总和光强应该等于大圆球表面积总和光强。所以图示点位光强是I/r^2。画家算法:优先选择深度更深的东西渲染,循序渐进。不足:无法处理3个或者更多个两两互相覆盖的图形。

2025-03-17 21:28:50 339

原创 unity泛型对象池

【代码】unity泛型对象池。

2025-03-16 14:37:01 610

原创 unity生命周期

用途:常用于进行基本的初始化操作,如变量赋值、查找组件引用等,因为此时所有对象的脚本实例都已创建,适合建立对象间的初始关联。用途:常用于处理那些依赖于 Update 中对象状态变化的操作,例如相机跟随玩家角色,确保相机在玩家移动后再进行位置更新。若对象在运行时被禁用后又。调用时机:当脚本实例被载入时调用,在场景加载时,每个对象的脚本实例创建后立即执行,用途:常用于处理物理计算,如刚体的移动、力的施加等,确保物理模拟的稳定性。调用时机:当脚本实例即将被销毁时调用,例如当对象被删除或场景被卸载时。

2025-03-15 13:04:22 943

原创 Unity学习日志4

当把一个引用类型的变量赋值给另一个引用类型的变量时,实际上传递的是对象的引用(内存地址),而非对象本身。避免频繁的字符串拼接:在 C# 中,字符串是不可变的,每次进行字符串拼接操作都会创建一个新的字符串对象。减少数据结构的频繁扩容:对于一些动态数组,如List,在添加元素时可能会发生扩容操作,导致内存重新分配和临时对象的创建。:把引用类型转换回值类型,在进行拆箱操作时,首先会检查引用类型所指向的对象是否是目标值类型的装箱实例,如果是,则将堆上存储的值复制到栈上的目标值类型变量中。

2025-03-14 15:55:15 1206

原创 Unity学习日志番外:简易行为树

2.Blackboard充当大脑用于存储string映射到object的键值对,因为object是所有类型的基类,在转化的过程中会产生很多的拆装箱影响性能,不过由于行为树本身就不是什么庞大(1e6甚至更多那种)底层由哈希表实现在没有哈希冲突的前提下是。Sequence:Sequence的逻辑是AND,要求当前队列下的所有子节点都要是Success才返回success否者返回Failure,如果还在执行返回Running。2.该节点的父节点以及该节点的子节点。1.Node节点的定义与声明。

2025-03-12 23:40:19 969

原创 unity几种设计模式(自用)

逻辑:在被观察者类里面新建事件和事件的调用,订阅观察者类里的某些函数,达到某种要求通知所有观察者。一般都是写一个接口里面包含各种方法,继承的子类必须完成这些函数的实现,也可以再此基础上扩展。当观察者观察的对象出现变化满足某种条件时,记录变化,所有依赖它的对象都会收到通知。确保全局的一个类只有一个实例。非静态的方法也可以像静态函数那样使用了。角色死亡了->通知控制器和游戏结束UI。比如:角色受伤->通知UI显示。水烧开了->通知报警器和显示器。

2025-03-11 17:49:19 381

原创 计算机图形学学习日志2

总而言之,只要把相机的右(g叉乘t),上方向(t),g方向按列排放并且在最后一列放上平移的数字就得到了将世界坐标系变换到相机坐标系的旋转变化复合矩阵。将一个立方体,中点平移到原点上,并且将长宽高映射到Range(-1,1)成为一个立方体。于是我们有任意向量 A 绕着轴n旋转就等同于R * A的结果。

2025-03-10 23:29:12 331

原创 计算机图形学学习日志1

右结合性质,且不满足交换律所以顺序很重要,优先级高的放在最右边。会从右边先开始运算。刚好是数学意义上的逆矩阵乘上变换后的矩阵成为原矩阵。每个图形变换都可以转化为一个齐次矩阵乘上一个向量。由于向量不会受到平移因素的影响所以第三个数字是0。

2025-03-10 01:29:28 349

原创 Unity学习日志3

2.创建一个Empty物体作为父物体,把音频拖入 Hierarchy作为一个GameObject,会自动挂载AudioSource组件。3.在C#脚本中声明一个Audiosource数组存储AudioSource组件(挂载于父物体上)。在 Resources 文件夹中创建子文件夹,将不同类型的文件分类存放。3.将音频拖入这个数组中(把AudioSource添加到数组中)。与位置position无关,与rotation有关。与位置position有关,与rotation有关。

2025-03-09 16:52:11 746

原创 Unitty学习日志2.

总结来说就是每条线段做Lerp然后得到的新的点按顺序连起来再做Lerp直到线段只剩下1的时候就是n次贝塞尔曲线。Mesh Renderer 和 Mesh Filter 是为 3D 物体设计的,不适合直接用于 2D 物体,除非是3D物体在2.5D情况下表现。当你创建一个立方体(Cube)时,Unity 会自动为其添加一个 Mesh Filter,并将其 Mesh 属性设置为立方体的几何数据。在Lerp的两个点的基础上,在中间增加一个额外的点。得到的是减数指向被减数方向,值是对应坐标的差。

2025-03-09 11:08:40 822

原创 Unity学习日志1

最后一个参数是返回值类型。

2025-03-07 13:03:10 775

原创 洛谷P1255 数楼梯

见acwing题解。

2025-01-24 17:38:47 211

原创 P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two

PII存4个方向, 地图大小是100 如果走超过400步算找不到。flag判断障碍情况。

2025-01-18 14:04:14 160

原创 AcWing 1262. 鱼塘钓鱼(每日一题)

贪心 + 前缀和 + 优先队列。时间最坏O(2n + n^2)

2024-11-27 10:14:34 160

原创 AcWing 505. (详解)火柴排队的另类思路使用map以及priority_queue

【代码】AcWing 505. (详解)火柴排队的另类思路使用map以及priority_queue。

2024-11-26 19:48:26 101

原创 AcWing 4655. 重新排序

给交集一个权重,用差分来对区间内的数权重 +1,然后优先队列(默认大根)一一匹配就好了。vector和队列都要,没开只过了7个点,服了//

2024-11-24 15:54:05 131

原创 AcWing 4262. 空调(每日一题)

通过这种方式,最终我们总能找到 一个操作对结果不重要的位置,从而使得我们的调整得以完成。对于两段数列 想要把A[] -> B[] 并且必须操作连续的序列时可以使用。把 A[] - B[] 的差数列置0 等价 A[] -> B[]也就是说通过这种方式我们总可以把原数组前n项置0,而n + 1以及。即 令 A 与 B的差距为0 差距为A数组和B数组的差数组体现。差分数组(对于差数组)的前n项置0 就是差数组前n项置0。我们不关心差分数组和原数组第n + 1项的影响。后面的项并不一定是0(大概率不是)

2024-11-23 16:32:06 248

原创 AcWing 102.最佳牛围栏

时间复杂度(二分O(Nlog(N) + 前缀和 2O(N))二分 + 前缀和 + 数学知识。

2024-11-20 22:26:26 110

原创 Acwing 802.区间和 离散化详解

【代码】Acwing 802.区间和 离散化详解。

2024-11-19 17:41:46 111

原创 洛谷P8649 [蓝桥杯 2017 省 B] k 倍区间

所以我们新增一个数组cnt来存储mod的结果如果出现大于2个一样的mod结果就在ans里加上结果的数量,代表这个mod的结果与上个mod结果之间的区间对k mod可以余0。根据同余性质如果 a 同余 b (mod m)那么(a - b) mod m 一定为0;初始化cnt[0] = 1;代表自己本身就mod k 为0的数字。暴力 + 前缀和:O(n2) 数据范围1e5 显然过不了。前缀和 + 同余定理优化。过两个节点剩余的TLE。

2024-11-18 19:20:50 193

原创 DFS找环

【代码】DFS找环。

2024-11-18 02:22:17 444

原创 AcWing 5973.最佳问题

交了发现才用了8MB的空间,好像也不用那么怕毕竟最大可以开1e7 ~ 1e8 的数组,时间过半了,YXC好像是用DP写的,菜鸡看不懂DP。我这里面向结果编程了,因为我不知道数组要开多大,又怕MLE又怕WA,所以取了800发现刚好能过,估计数据加强一下就过不了了。所以我们使用一个3维数组来表示x,y以及目前累加的分数score,如果之前已经走过了就直接退出。剪枝:我们发现每个路径如果不剪枝可能会导致相同的分数在相同的格子出现多次。只过了17个数据,后面都是TLE。

2024-11-16 12:03:07 115

原创 AcWing 899编辑距离

【代码】AcWing 899编辑距离。

2024-11-15 19:11:52 81

原创 AcWing 902 最短编辑距离

图片来源:B站NotOnlySuccess(侵删)有这状态图一目了然不言而喻了。

2024-11-15 17:57:16 175

原创 01背包和完全背包区别!

也就是说如果背包容量为10,物品一体积为2,价值为5,那么在01背包的倒序遍历中只会把所有体积大于等于2的背包的最大价值赋值为5,而在完全背包中,由于体积为2的背包会先被赋值为5,然后在体积为4的背包时候,体积为4及时得到了更新,那么为10,以此类推。在关注背包问题的时候要考虑同层次之间的联系,和不同层次的联系,也就是横向和竖直方向的联系,01的倒序保证了同一个物品不会被选择多次,完全背包的正序保证了如果可以放下同一件物品多次那么就会放下。可以看到两者状态方程完全一致 ,那到底为什么呢?

2024-11-14 17:27:14 248

原创 AcWing 5181.好四好五

如果能减到0说名目前数字j可以达到 方案数加一 相当于初始化0 - n 的所有数字的方案数 用前面的数更新后面的数 加入的顺序不重要。思路一:DFS暴力剪枝。(略大于O(nlogn))极限是到10的5次方,超过1e5 TLE。思路二:完全背包问题。From --- 今天打卡了吗。

2024-11-14 12:01:46 181

原创 ACwing 5164.所有三角形

如果是奇数而且正上为黑前一个也有为黑那么可以节省1条胶带。如果不是奇数:前一个如果为黑色,那么这一个只需要1条胶带。如果前一个为黑色那么这一个只需要2个胶带。如果是奇数而且正上为黑那么只需要1个胶带。

2024-11-11 18:53:10 223

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除