- 博客(76)
- 收藏
- 关注
原创 Unity Animation的其中一种运用方式
先说目的,其使用是为了在UI中播放动效,并且在动效播放结束后接自定义事件而设计的设计的关键点在于,这个脚本不是通过Animation直接播放动画片段,而是通过修改AnimationState的normalizedTime,并且调用Animation.Sample方法来直接应用动画状态到具体时间点,然后再通过时间判断是否播放结束,如果播放结束,那么调用onComplete回调在决定播放动画时,先调用Stop方法,停止所有动画,然后重置_progressTime,再调用Play方法,让动画从头开始播放,这
2025-03-23 22:39:20
424
原创 Unity UGUI下实现精确点击的一种方式
比如有这样一个情况,UI的显示区域是个圆形,在点击的时候也需要精确点击到这个圆形显示区域,但是UI元素的RectTransform是个矩形。
2025-03-09 01:15:37
327
原创 UGUI 自动扩张的聊天气泡制作时的问题
LayoutGroup类的组件会事先确定其最小或偏好数据,然后ContentSizeFitter会获取到这些数据,进行最终的宽高计算。
2025-03-02 21:59:20
449
原创 UGUI Canvas为Overlay模式锚点分散的情况下的anchoredPosition计算
刚好,Pivot也在这个位置,根据anchoredPosition的定义描述,是从Anchor到Pivot的向量,而此时锚点是四处分散的,而此时anchoredPosition也正好是(0, 0),说明上面的公式计算出来的anchoredPosition原点是正确的。再代入Canvas的长宽计算,即1125 * 1=1125,2436 * 0.5 = 1218,即对于父物体,以父物体的左下角为原点,计算出来的参考点(1125, 1218)在这个位置。此时的anchoredPosition是(0, 0)
2025-02-15 03:18:57
160
原创 UGUI Canvas为Overlay模式锚点聚拢情况下的anchoredPosition
先说结论,在Canvas为Overlay模式锚点聚拢情况下的anchoredPosition,是从元素Anchor到Pivot的向量,即以Anchor为原点,到Pivot。此时Pivot在元素左下角,PosX= -50,PosY= -50,anchoredPosition也为(-50,-50)PosX=0,PosY=0,且anchoredPosition为(0,0)
2025-02-14 04:25:27
144
原创 UGUI的RectTransform的rect属性
此时Pivot在Image中心,而rect的x,y打印为-50,-50,说明rect的x,y的坐标是以Pivot为原点的。说明上面的说法是正确的,rect的x,y此时为0,0。将Pivot改变一下位置,改到左下角。通过打印观察rect属性。
2025-02-12 02:53:02
138
原创 UGUI 的offsetMax和offsetMin
offsetMax为(-512,-1168),offsetMin为(512,1168),说明分别是以右上锚点和左下锚点为原点的。图中的Image的锚点全部张开到Canvas的四个角,屏幕分辨率为1125x2436。
2025-02-12 02:21:44
201
原创 UGUI UI元素的position和localPosition
Transform有position和localPosition属性,这两个分别代表在世界空间的绝对位置和相对于父级物体的相对位置,RectTransform也一样,对于下图中的红色Image。而对于localPosition,是相对于父亲的坐标,当前这张Image的父亲是Canvas,而Canvas的中心点和Image重合,所以是(0,0,0)因为在当前Canvas为overlay模式的情况下,position就是屏幕坐标,所以坐标系原点在Canvas左下角。锚点和轴心都在中心点。
2025-02-12 01:46:17
191
原创 Unity项目接入xLua的一种流程
因为提前设置了Lua文件的读取路径,都在LuaScripts文件夹下运行Lua脚本执行了对应的逻辑,将text的值变为了“你好”,同时打印了协程的输出。
2025-02-08 22:09:12
658
原创 Unity 中计算射线和平面相交距离的原理
其中(A, B, C)是平面法向量,D是平面到原点的距离,这里的xyz的意思是,当你有一个点 (x,y,z) 时,你可以将这个点的坐标代入平面方程 Ax+By+Cz+D=0 中。其中,P 是射线上的任意一点,origin 是射线的起点,direction 是射线的方向向量,t 是一个参数,它表示从起点到点 P 的距离(但注意这里的距离是沿着射线方向的,所以实际上是一个标量倍数,用于缩放方向向量)根据上面的说法,射线和平面相交的这个点代入这个公式,如果等于0,就说明这个点在平面上,即我们需要的这个交点。
2025-01-04 01:43:34
717
原创 Unity Mesh生成Cube
第一个Cube的顶部,此时vertices列表中是空的,所以base_index是0,然后遍历这个面的顶点的渲染顺序,将其添加到这个组别的列表中,即[0,2,1,0,3,2],也就是说subs[0]目前是这个列表。一共是6个面,每个面包含的数据包括4个顶点的相对顶点坐标(Cube的中心为原点),法线方向,UV坐标,顶点渲染顺序,以及这个面用到的材质,因为这里是Top,即顶部,所以法线方向是(0,1,0),其他面以此类推。最后设置材质,将材质从字典中拿出,组成材质数组,给到meshRenderer。
2025-01-01 04:52:20
1229
原创 LoxodonFramework实现Lua侧绑定UI元素的原理
因为VariableArray是被CustomPropertyDrawer重新编辑过的,所以在面板上的显示是这样的。
2024-12-29 22:44:19
636
原创 两种不同的LuaBehaviour生命周期绑定
在学习xLua时,发现xLua和LoxodonFramework的LuaBehaviour稍微有些不同,其中一个点是在调用DoString方法时的区别。
2024-12-27 20:31:17
521
转载 xLua中Lua协程和C#协程交互
即在Lua侧定义一个IEnumerator,内部包含Current ,MoveNext,Reset,模拟C#侧的实现。或者,可以使用xLua封装好的一个方法,在util.lua中。这篇文章的本质是为了解决在Lua中开启C#协程的问题。
2024-12-22 02:07:58
74
原创 xlua中自定义lua文件加载的一种方式
最后,来个FileLoader类,继承PathLoaderBase,具体重写Load方法。这样,Lua代码就可以require目录为“LuaScripts”下的所有Lua文件。定义一个LoaderBase类,做一个到CustomLoader的隐式类型转换。最后在LuaBehaviour类中写一个方法,做Lua的自定义加载。再让一个PathLoaderBase类继承,做进一步路径封装。
2024-12-21 21:34:06
399
原创 C#中方法参数传值和传引用的情况
此时传的是个test引用的副本,在方法内修改的是这个副本的指向。传string,集合同理,只要是指向新对象,就是引用副本在指向。同理,传入的是个结构体的副本。同理,传入的是个值的副本。
2024-12-21 19:40:02
307
原创 协程的抛出异常改装
这个包装过的迭代器可以处理协程中嵌套等待其他协程的情况,如果等待的是一个协程,就将其添加到栈中,并且在MoveNext中可以捕获异常。Unity原本的协程不能抛出异常。
2024-12-20 01:43:38
181
原创 UGUI源码之RaycastAll方法
即Physics2DRaycaster,PhysicsRaycaster,GraphicRaycaster,其中前两个必须和Camera组件一起使用。当使用EventSystem.current.RaycastAll方法时,会遍历所有的Raycaster,执行它们的Raycast方法。当鼠标放到Image上时,输出Image的名字,当鼠标放到Cube上时,输出Cube的名字,Cube必须带有Collider。所有继承了BaseRaycaster的类会在OnEnable的时候将自己添加到列表中。
2024-12-12 02:43:55
241
原创 Mask实现裁剪的原理浅析
Stencil ID依旧为1,即当前值,Stencil Operation变成了0,即Keep,Stencil Comparison是Equal,整体意思就是模板测试在模板值和当前值相等时通过,通过后模板值依旧保持之前的样子,当前值是1,模板值是1,即通过测试,但是不改变模板缓存的值。简单来说,就是Mask会设置继承了MaskableGraphic的组件的Shader属性,进行特定的模板测试。一张普通的Image,当不挂Mask组件时,其默认Shader的模板缓存属性是这样的。当挂载上Mask时,会改变。
2024-12-11 22:39:00
176
原创 Unity Plane API解释
构造函数解释,d的解释为:距离是沿着平面法线从平面到原点的距离。注意,这意味着为正值的distance值将导致平面朝向原点。负的距离值会导致平面朝向远离原点。GetSide方法检测点是否位于平面的正向侧,结果显示。符合文档的说明,此时的平面在Y轴方向上为1的位置。
2024-12-01 22:10:34
320
原创 Lua 实现继承的一种方式
而当通过local b = a() 的方式调用时,会进入到__call元方法中,instance 会从cls继承,相当于把cls设置为了instance的元表,最终返回instance。当调用a.age时,a相当于cls,会从__index中寻找age,即super,也就是t中寻找。以下代码来自Loxodon Framework,截取子其中的一段。
2024-11-19 18:11:47
315
原创 foreach 遍历List不产生GC的原因
foreach内部其实是获取了List的GetEnumerator()方法进行迭代,而在List中,这个方法返回的是个struct的迭代器。
2024-11-05 23:29:08
184
原创 Lua 怎么解决闭包内存泄漏问题
如果闭包不再需要访问外部变量,可以通过将闭包内的变量设置为 nil 来解除引用。这样,当外部变量没有其他引用时,垃圾回收器就可以回收它们。全局变量在 Lua 中是持久的,直到它们被显式地设置为 nil 或脚本结束。避免在闭包中意外地创建全局变量。尽量将变量定义为局部变量,而不是全局变量或表的字段,以减少它们被闭包意外捕获的机会。对于弱引用表的使用示例。
2024-11-05 15:30:47
878
原创 C# List的Sort方法
当你调用 List< T >.Sort 方法时,如果类型 T 实现了 IComparable< T > 接口,那么列表中的元素会根据该接口定义的排序规则进行排序。如果没有实现 IComparable< T > 接口,但是实现了 IComparable 接口,那么也会使用 IComparable 接口的排序规则。你可以传入一个比较函数,该函数定义了两个元素之间的排序关系。比较函数应该返回一个整数,小于 0 表示第一个元素小于第二个元素,等于 0 表示两个元素相等,大于 0 表示第一个元素大于第二个元素。
2024-11-04 15:39:41
737
原创 四元数各个旋转API的使用
1. Quaternion.SetFromToRotation2. Quaternion.SetLookRotation3. Quaternion.FromToRotation4. Quaternion.LookRotation5. Quaternion.RotateTowards
2024-10-29 20:49:53
157
原创 Unity 的Event的Use()方法
对于Event的Use方法,其在调用后将不会再判断同类型的事件。这种情况下,第二个MosueDown不会进入,因为已经Use。也就是说当使用了Use方法,相同的事件类型不会进第二遍。依旧能进入第二个MosueDown。
2024-09-24 16:57:29
465
原创 unity CustomEditor的基本使用
在CustomEditor中指定要去修改的类型,通过serializedObject.FindProperty(变量名)的方式来获取变量,然后配合EditorGUILayout等GUI绘制方法绘制面板。CustomEditor用来自定义脚本的编辑面板。定义一个变量,然后准备一个类,继承自Editor。先准备一个类,继承MonoBehaviour。
2024-09-24 16:29:45
548
原创 C# CS1612 尝试修改集合中值类型的情况
可知,尝试修改某一值类型,但是该值类型作为中间表达式的结果生成但不存储在变量中,会发生报错。正确做法是将其赋值给局部变量,然后再将变量赋回集合中的项。在C#中,发现尝试直接修改集合中值类型的中的值发生报错。提示“它不是变量”,通过官方索引的。
2024-09-24 11:00:06
394
原创 Shader入门精要总结(一)渲染流水线
这个阶段由应用主导,通常由CPU负责,开发者对这个阶段拥有绝对控制权。在这一阶段,主要有三个任务首先,需要准备好场景数据,例如相机,视椎体,场景中的模型,光源其次,为了提高渲染性能,需要做一个粗粒度剔除的工作,把那些不可见的物体剔除,这样就不再需要移交几何阶段最后,设置好每个模型的渲染状态,包括但不限于使用的材质,使用的纹理,使用的shader ,最终输出渲染图元,即渲染所需几何信息,一般是点,线,三角面等,这些图元最终会被传递到下一阶段。
2024-07-20 20:50:39
778
原创 Unity UGUI ContentSizeFitter源码浅析
这里ILayoutSelfController继承自ILayoutController,先执行了ILayoutSelfController类的设置,在执行了非ILayoutSelfController的设置,最后递归遍历子结点。这里往当前RectTransform 的父亲上寻找符合条件的RectTransform,继续调用MarkLayoutRootForRebuild。首先看MarkLayoutForRebuild方法,调用自LayoutRebuilder的MarkLayoutForRebuild方法。
2024-01-31 03:35:04
568
原创 Unity UGUI Button源码浅析
在往上,来到StandaloneInputModule类的ReleaseMouse方法和ProcessTouchPress方法。对OnPointerClick溯源,调用侧来自ExecuteEvents类的Execute方法。这是一个为鼠标/键盘/控制器输入而设计的BaseInputModule类。再往上溯源多次,最终来到EventSystem的Update方法。此方法用来计算和处理任何鼠标按钮状态的变化。
2024-01-30 04:29:20
608
原创 Unity UGUI Selectable部分源码浅析
物体的可交互属性需要一起判断m_GroupsAllowInteraction 和 m_Interactable。设置状态属性,如果是Editor模式,如果正在运行,那么立即改变,没有过渡,如果非Editor模式,那么有过渡。判断是否高亮,即鼠标移上去的时候,需判断三个状态,鼠标在UI范围内,没有点下,没有选择。当焦点移动到另一个可选择对象时,调用此方法,确定选择的对象。将元素从可选择物体数组列表中移除,同时标记为脏。即时清除状态,将Selectable的状态还原。取消激活时,将自身标记为脏。
2024-01-30 01:52:35
855
原创 Unity RectMask2D源码浅析
其中m_ForceClip 强制裁剪设置主要有两种情况AddClippable和RemoveClippable的情况,都索引自MaskableGraphic类的UpdateClipParent方法。这里会通过MaskUtilities.GetRectMaskForClippable寻找父物体上的RectMask2D组件,这个方法会在激活,取消激活,父节点改变,canvas改变等时候调用。
2024-01-27 00:24:48
715
原创 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
683
原创 RectMask2D的合批情况验证
注意,虽然此处被RectMask2D裁剪了,但是在计算深度时属于需要渲染的UI元素,所以绿色图片此时的depth应该是1。经过实际测试,RectMask2D在裁剪区域完全相同且位置完全重合的情况下能够合批。但是当RectMask2D位置不重合时,就不能合批。
2024-01-23 03:48:33
640
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人