Unity
红黑色的圣西罗
#weareacmilan
展开
-
Unity UGUI ContentSizeFitter源码浅析
这里ILayoutSelfController继承自ILayoutController,先执行了ILayoutSelfController类的设置,在执行了非ILayoutSelfController的设置,最后递归遍历子结点。这里往当前RectTransform 的父亲上寻找符合条件的RectTransform,继续调用MarkLayoutRootForRebuild。首先看MarkLayoutForRebuild方法,调用自LayoutRebuilder的MarkLayoutForRebuild方法。原创 2024-01-31 03:35:04 · 476 阅读 · 0 评论 -
Unity UGUI Button源码浅析
在往上,来到StandaloneInputModule类的ReleaseMouse方法和ProcessTouchPress方法。对OnPointerClick溯源,调用侧来自ExecuteEvents类的Execute方法。这是一个为鼠标/键盘/控制器输入而设计的BaseInputModule类。再往上溯源多次,最终来到EventSystem的Update方法。此方法用来计算和处理任何鼠标按钮状态的变化。原创 2024-01-30 04:29:20 · 460 阅读 · 0 评论 -
Unity UGUI Selectable部分源码浅析
物体的可交互属性需要一起判断m_GroupsAllowInteraction 和 m_Interactable。设置状态属性,如果是Editor模式,如果正在运行,那么立即改变,没有过渡,如果非Editor模式,那么有过渡。判断是否高亮,即鼠标移上去的时候,需判断三个状态,鼠标在UI范围内,没有点下,没有选择。当焦点移动到另一个可选择对象时,调用此方法,确定选择的对象。将元素从可选择物体数组列表中移除,同时标记为脏。即时清除状态,将Selectable的状态还原。取消激活时,将自身标记为脏。原创 2024-01-30 01:52:35 · 637 阅读 · 0 评论 -
Unity RectMask2D源码浅析
其中m_ForceClip 强制裁剪设置主要有两种情况AddClippable和RemoveClippable的情况,都索引自MaskableGraphic类的UpdateClipParent方法。这里会通过MaskUtilities.GetRectMaskForClippable寻找父物体上的RectMask2D组件,这个方法会在激活,取消激活,父节点改变,canvas改变等时候调用。原创 2024-01-27 00:24:48 · 612 阅读 · 0 评论 -
Unity Mask合批情况验证
mask1首尾2个drawcall,IM1和IM2合批,1个drawcall,mask2首尾2个drawcall,IM3和IM4合批,一个drawcall,再加上相机的默认HDR开启drawcall,总共7个批次。这里和RectMask2D有所不同,IM3在完全不在Mask范围时,是会参与渲染的,但是如果在RectMask2D情况下,是不会参与渲染的。经过计算此种情况的visiableList:mask1,IM1,IM2,mask2,IM3,IM4。发现mask1和mask2的首尾进行了合批。原创 2024-01-24 05:59:20 · 495 阅读 · 0 评论 -
RectMask2D的合批情况验证
注意,虽然此处被RectMask2D裁剪了,但是在计算深度时属于需要渲染的UI元素,所以绿色图片此时的depth应该是1。经过实际测试,RectMask2D在裁剪区域完全相同且位置完全重合的情况下能够合批。但是当RectMask2D位置不重合时,就不能合批。原创 2024-01-23 03:48:33 · 479 阅读 · 0 评论 -
RectMask2D不能合批的原因
三张图片的shader和贴图都是一样的,三张图用的都是一个图集里的图,在经过深度计算等一系列操作后,是能够合批的,根据合批规则,应该就是_ClipRect属性改变导致shader不同导致不能合批。发现是因为shader里的_ClipRect属性不一样了导致的。但是给其中一张图加上RectMask2D,发现不能合批了。一般情况下,在这种情况下三个Image会合批。原创 2024-01-22 00:16:09 · 413 阅读 · 0 评论 -
unity 增量式GC
为什么使用增量式垃圾回收C#语言使用托管内存和自动垃圾回收,这意味着它使用自动化方法跟踪内存中的对象,然后释放不再使用对象的内存。这种做法的优点是,开发者不必手动跟踪释放不需要的内存,因为垃圾回收器会自动执行此操作,这样会使开发者的工作更轻松,同时避免出现潜在Bug。缺点是垃圾回收器需要一些时间完成工作,而开发者或许不希望将特定时间用于此处。Unity使用的是贝姆垃圾回收器(Boehm–Demers–Weiser garbage collector),该回收器利用了Stop-The-World机制,这转载 2021-10-22 16:43:21 · 4918 阅读 · 0 评论 -
A*寻路的基础实现
本篇文章的算法来源于这里在原来的实现基础上,改为使用UI中的Image表现路径,并且加上了F,G,H的数值显示A*的核心公式,F=G+H,F表示到达这个点的总代价,G表示从起点到达这个点的代价,H表示这个点到终点的代价还有两个集合,open和close,分别代表待检查的点集合和一斤检查过的点集合大概流程1.将待检查的点从open中拿出来,放入close,一般是open里面F最小的点2.获得这个点周围所有的点3.检查这些周围点中是否有障碍物,如果有,直接去掉4.检查周围点中是否有已经在open原创 2021-08-22 23:21:43 · 158 阅读 · 0 评论 -
Unity批处理
绘制调用批处理要在屏幕上绘制游戏对象,引擎必须向图形 API(例如 OpenGL 或 Direct3D)发出绘制调用。绘制调用通常为资源密集型操作,图形 API 为每次绘制调用执行大量工作,从而导致 CPU 端的性能开销。此开销的主要原因是绘制调用之间的状态变化(例如切换到不同材质),而这种情况会导致图形驱动程序中执行资源密集型验证和转换步骤。Unity 使用两种方法来应对此情况:动态批处理:对于足够小的网格,此方法会在 CPU 上转换网格的顶点,将许多相似顶点组合在一起,并一次性绘制它们。静态批处转载 2021-08-10 21:44:29 · 571 阅读 · 0 评论 -
背包提示面板踩坑
在做背包面的道具提示面板时,因为想让面板相对鼠标有一个偏移,所以设置了提示面板每帧跟随鼠标,在进入格子的时候显示,离开格子的时候不显示,这个时候发现一个问题,如果提示面板和鼠标离得太近,鼠标射线会射到提示面板,从而影响格子UI的OnPointerEnter和OnPointerExit方法,导致提示面板一闪一闪解决方案有两个1.直接修改提示面板和鼠标的相对距离,使鼠标和提示面板不重叠2.在提示面板上添加Canvas Group 组件,取消勾选Interactable和Blocks Raycasts原创 2021-07-17 21:19:53 · 334 阅读 · 0 评论 -
Unity下换装的主要流程
首先,美术可能会给这样一个游戏物体,里面含有所有的部位,并且每个部位上都有SkinnedMeshRenderer可以先剥离一个只含有骨骼信息的预制体出来,方便等会儿再这个预制体上生成需要两个字典,第一个字典用来存储模型上的所有SkinnedMeshRenderer信息,因为模型里面每个部位会有多个不同的装扮,所以嵌套了一个字典,还有一个字典用来存储target上的SkinnedMeshRenderer信息1.生成需要的两个预制体在这里把原始模型和带骨骼的空预制体target生成2.保存需要原创 2021-03-07 21:46:07 · 575 阅读 · 0 评论 -
在单例模式下判断某个游戏物体是否显示的情况
比如某个脚本的单例是这种模式private static Character _instance; public static Character Instance { get { if (_instance == null) { _instance = FindObjectOfType(typeof(Character)) as Character;原创 2021-02-24 02:57:32 · 147 阅读 · 0 评论 -
Unity自带的JsonUtility使用实例
实例代码:Json文件,Item.json{ "Infolist": [ { "id":1, "name":"血瓶", "type":"Consumable", "description":"回血用", "capacity":10, "buyPrice":10, "sellPrice":5, "hp":10, "mp":0, "sprites":"Sprites/Ite原创 2021-02-02 01:55:25 · 1095 阅读 · 0 评论 -
unity 状态机模式
public enum Transition //状态转换操作的枚举{ NullTransition = 0, StartButtonClick, PauseButtonClick,}public enum StateID //状态枚举{ NullStateID = 0, Menu, Play, Pause, GameOver,}/// <summary>/// This class原创 2020-10-24 15:34:14 · 425 阅读 · 0 评论