- 博客(73)
- 资源 (6)
- 收藏
- 关注
原创 【UGUI】ui性能优化
1、性能优化包括哪些?UGUI的性能从四方面来优化一、从CPU方面优化1、重建界面:尽量减少Rebuild的频率,将动态和静态的元素分离,放到不同的Canvas里面 使用尽可能少的UI元素。这里指的是删除不必要的节点和隐藏不用的节点。这样能减少深度排序和rebuild Layout的执行时间2、触摸事件对应不需要接受输入的元素。一定要关闭Raycast Target选项3.UI的隐藏和显示UI切换的时候,有两个地方非常耗时,一个是SetActive,另外一个则是SetPare
2021-03-10 12:47:28
1315
原创 [LeetCode]两个数组合并
一、题目给你两个有序整数数组nums1 和 nums2,请你将 nums2 合并到nums1中,使 nums1 成为一个有序数组。初始化nums1 和 nums2 的元素数量分别为m 和 n 。你可以假设nums1 的空间大小等于m + n,这样它就有足够的空间保存来自 nums2 的元素。二、解题public void Merge(int[] nums1, int m, int[] nums2, int n) { int i = m - 1,j = ...
2021-03-04 23:50:10
310
1
原创 LeetCode: 最长子串 的长度
一题目给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长...
2021-02-25 01:09:12
430
原创 LeetCode:两数相加
一、题目给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。二、解题/** * Definition f...
2021-02-24 00:14:09
359
原创 LeetCode-两数之和
一、题目给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target =...
2021-02-22 23:56:53
124
原创 【Unity-Shader】顶点着色器和片段着色器
一、简介二、代码Shader "Unlit/NewUnlitShader"{ Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM//Cg代码段标志, 与END.
2021-02-10 23:39:14
629
原创 【设计模式】桥接模式
使用频率【3星】一、概念它将一个类的抽象部分与它的实现部分分离,使它们都可以独立的变化。二、解决问题在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化。为了解决这种多维度变化,又不引入复杂度,就可以使用桥接模式。三、对象1、抽象类(Abstraction):定义抽象接口,它一般是抽象类而不是接口。该接口中包含实现具体行为、具体特征的Implementor接口。2、扩充的抽象类(RefinedAbstraction):继承自Abstraction的子类,通常情况下它不
2021-02-06 17:22:01
186
原创 【设计模式】23种设计模式简介
一、设计模式分类总体来说设计模式分为三大类:创建型模式【用来创建对象】,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式【处理类或对象的组合】,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式【描述对类或对象分配的某种职责或执行的交互】,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。二、每种设计模式处理的问题单例模式:如
2021-02-06 16:10:01
896
原创 [设计模式]设计模式的七大原则
一、设计模式的目的设计模式是为了更好的代码重用性,可读性,可靠性,可维护性,可扩展形。二、设计模式的原则开闭原则:对扩展开放,对修改关闭注解:一段程序应该尽量保持在对扩展友好,但是尽量不修改原有的逻辑。依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象;要针对抽象层编程,而不要针对具体类编程。注解:抽象指的是接口或抽象类,细节就是具体的实现类,使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。单一职责原则:类的职责要单一,
2021-02-06 15:52:49
119
原创 【UGUI源码解析】18、Scrollbar
一、简介Scrollbar继承自Selectable类,以及IBeginDragHandler, IDragHandler, IInitializePotentialDragHandler, ICanvasElementt接口。是一种标准的滚动条,带有大小可变的手柄,可以在0和1之间拖动。滑块组件是一个可选择的控件,用于控制跟随当前值的控制柄,并根据“大小”属性调整大小。控制柄的定位由滚动条驱动。手柄可以是滚动条游戏对象的直接子对象,或者,可以将转换放置在中间以进行额外的控制。当s...
2021-02-06 10:58:37
230
原创 【UGUI源码解析】17、ToggleGroup
一、简介ToggleGroup继承UIBehaviour,表示一组Toggle的切换。一组toggle当前只能由唯一个toggle对象被选中。维护了一个ToggleList,用于保存注册在该ToggleGroup的所有Toggle。二、功能讲解1、Toggle在OnEnable的时候注册到group,OnDisable的时候移出group,另外通过为group属性赋值也可以让Toggle注册到指定的ToggleGroup(一般是编辑器帮我们设置)2、NotifyToggleOn这个方法是将除
2021-02-06 10:20:29
464
原创 【UGUI源码解析】16、Toggle
一、简介Toggle继承于Selectable, IPointerClickHandler, ISubmitHandler, ICanvasElement。主要用于供下拉框选择。二、功能讲解1、Toggle有个重要的bool变量m_IsOn(对应成员属性IsOn),表示是否被勾选。2、与Button类似,Toggle也有一个onValueChanged事件用于外部监听m_IsOn是否改变。3、Set方法用于设置m_IsOn的值,并发送事件onValueChanged.Invoke(m_.
2021-02-06 10:20:04
386
原创 【UGUI源码解析】15、Shadow与Outline
一、简介Shadow组件是通过IVertexModifier给graphic(文字或者和图片)的对象增加outline效果,实现的细节是通过给文字或者图片 mesh添加顶点来实现。而Outline是在对象四角上各添加了一个Shadow。由此我们可以得知,Outline的(额外)消耗是Shadow的四倍,所以还是需要谨慎使用。继承BaseMeshEffect基类二、功能讲解1、BaseMeshEffect1、是一个抽象类,继承了IMeshModifier接口,接口允许在传递给CanvasRen
2021-02-06 10:19:36
1053
原创 【UGUI源码解析】14、Text
一、简介Text组件是ugui中核心的组件,使用该组件可以实现字符串文字的输出控制。继承了MaskableGraphic, ILayoutElement。主要的功能都是在TextGenerator实现。二、功能讲解1、OnPopulateMesh ()该类继承MaskableGraphic,后者继承于Graphic类,该方法是重写Graphic的OnPopulateMesh ,当Graphic执行Rebuild的时候执行。1、根据用户的设置生成了一个TextGenerationSetti
2021-02-06 10:19:15
357
原创 【UGUI源码解析】13、Image
一、简介Image是比RawImage功能更加丰富的图片类。继承MaskableGraphic, ISerializationCallbackReceiver, ILayoutElement, ICanvasRaycastFilter,提供四种图片类型--Simple,Sliced,Tiled和Filled。继承了ILayoutElement,是一个布局元素,可以被各种布局组(ILayoutGroup)所包含,将它和其他布局元素进行布局(后续博客讲解布局)。二、功能讲解1、OnPopulat
2021-02-05 19:45:12
217
原创 【UGUI源码解析】12、RawImage
一、简介如果你没有或不想创建一个地图集,你可以简单地使用这个脚本来绘制一个纹理。请记住,这将创建一个额外的绘制调用,每个RawImage都存在,因此最好只用于背景或临时可见图形。【脚本注释】继承MaskableGraphic。是未经处理的图片,每个RawImage都会创建一个DrawCall。二、功能说明1、SetNativeSize重写MaskableGraphic的SetNativeSize方法,用以设置图片的大小,设置RectTransform的sizeDelta等于纹理Textu
2021-02-05 18:52:27
278
原创 【UGUI源码解析】11、Mask
一、简介Mask继承了UIBehaviour, ICanvasRaycastFilter,IMaterialModifier,实现对图片的裁剪功能二、功能OnEnable()1、如果含有Graphic组件,设置graphic.canvasRenderer.hasPopInstruction为true,调用graphic.SetMaterialDirty()方法。2、调用MaskUtilities.NotifyStencilStateChanged,重新计算遮罩。OnDisable()
2021-02-05 17:35:45
313
原创 【UGUI源码解析】10、RectMask2D
一、简介RectMask2D继承了UIBehaviour, IClipper, ICanvasRaycastFilter。二维矩形遮罩,允许对遮罩外的区域进行剪裁/遮罩二、功能1、OnEnable()1、m_ShouldRecalculateClipRects设置为true,该变量表示当前是否需要对m_Clippers重新获取设置,2、ClipperRegistry注册脚本对象,ClipperRegistry会在EventSystetem的PerformUpdate()函数中执行,也就是
2021-02-05 16:46:46
263
原创 【UGUI源码解析】9、MaskGraphic
一、简介MaskableGraphic是一个抽象类,继承了Graphic, IClippable, IMaskable, IMaterialModifier接口,派生了RawImage,Image和Text二、功能1、OnEnable() protected override void OnEnable() { base.OnEnable(); m_ShouldRecalculateStencil = tru.
2021-02-05 16:03:33
239
原创 【UGUI源码解析】8、Graphic
一、简介Graphic主要是用来控制图片的显示,设置mesh的顶点和uv数据,提供给VertexHelper和CanvasRenderer进行mesh绘制。所以有时候制作一些角色头顶的血条使用动态创建mesh的方法进行绘制。Graphic是一个抽象类,是MaskableGraphic(可遮罩图像)的基类,而MaskableGraphic是RawImage、Image和Text的基类。二、功能1、添加的特性 [DisallowMultipleComponent]//一个对象只能挂载
2021-02-05 14:23:59
381
原创 【UGUI源码解析】7、Button
一、简介Button继承自Selectable,IPointerClickHandler、ISubmitHandler。添加了一个UnityEvent类型的事件onClick。二、功能1、onClick事件可以添加用户自定义的监听,具体方法可以通过编辑器添加也可以通过onClick.AddListener添加。2、OnPointerClick会调用Press方法来回调onClick。3、OnSubmit也会调用Press方法,并切换状态为Pressed,并开启协程调用OnFinishSu
2021-02-05 13:51:33
279
原创 【UGUI源码解析】6、Selectable
一、简介Selectable是所有交互相关组件的基类,在UGUI的组件中是比较重要的一个类,可以说把这个类搞清楚,那基本其他类都问题不是太大。二、功能1、添加的特性 [AddComponentMenu ("UI/Selectable", 70)] [ExecuteAlways]运行在编辑器模式下 [SelectionBase]标记此对象为基本选择对象 [DisallowMultipleComponent]不允许一个GameObject上出现同种组件2、Selec...
2021-02-05 13:43:20
566
原创 【UGUI源码解析】5、 Raycaster
一、全局窥探通过全局搜索可以发现跟Raycaster相关的类主要是,BaseRaycaster,PhysicsRaycaster,GraphicRaycaster,Physics2DRaycaster,RaycastResult,RaycasterManager。接下来,我们从几个方面入手来分析射线相关的内容。1、射线相关类的功能2、射线类的使用二、射线相关类功能根据名字,我们可以猜测到BaseRaycaster是所有射线类处理的基类,所以我们先从这个类开始分析。1、BaseRayc
2021-02-05 13:12:59
406
原创 [Unity-Shader]6.Pass-模板
一、模板的作用模板缓冲区可用作一般母的的每像素遮罩,以便保存或者丢弃像素。【官网】所以有时候需要继续图片的遮罩或者是裁剪就可以使用模板二、实现原理模板缓冲区通常是每像素 8 位整数。该值可以写入、递增或递减。后续绘制调用可以根据该值进行测试,以确定在运行像素着色器之前是否应丢弃像素。三、渲染管线的环节https://www.cnblogs.com/SouthBegonia/p/11564407.html四、语法Stencil { Ref 1//Reference V
2021-02-05 01:11:11
150
原创 【UGUI源码解析】4、CanvasUpdateSystem
一、CanvasUpdateRegistry实现 的功能主要的实现功能是对所有的graphic对象和layout对象进行注册管理【组件需要是ICanvasElement类型】,根据canvas的事件,调用ui对象的Rebuild函数进行重建。二、源码分析1、 private static CanvasUpdateRegistry s_Instance;表示当前的CanvasUpdateRegistry是一个单例。2、//布局刷新队列private readonly IndexedSet&.
2021-02-04 23:57:24
300
1
原创 【UGUI源码解析】3、输入模块InputMoudle
一、输入模块组成BaseInputModule、PointerInputModule、StandaloneInputModule、TouchInputModule组成输入模块二、触发流程以TouchInputMoudle输入模块为例子1、通过OnEnable()函数获取当前对象挂载的EventSystem组件,获取事件系统管理对象eventSystem。【这就要求EventSystem组件和输入模块的组件是挂在同一个对象】2、通过EventSystem的Update()函数触发Touch
2021-02-04 21:30:25
350
原创 【UGUI源码解析】2、事件委托
一、功能说明1、包含BaseEventData,有不同类型的事件接口类【都在EventInterfaces】和对应的事件点击数据结构,2、对外调用的统一执行接口,获取当前收到事件的对象,判断当前是否对象是否可以收到执行事件二、重要代码说明1、定义代理函数,使用相同的事件数据类型进行数据封装 //事件代理函数,以及对应的数据, //代理函数会根据指定的T1类型去查找对应的执行函数, //由于参数类型不同,所以函数名可以都取同一个 publi.
2021-02-04 19:47:48
166
原创 【UGUI源码解析】1、EventSystem系统
一、功能说明1、创建ui对象的时候,引擎会自动生成Canvas和EvenSystem对象。EventSystem类是挂在在EventSystem对象的组件2、EventSystem主要是用来执行和处理场景中的事件,比如点击交互,射线和事件系统的发送3、一个场景只能有一个EventSystem对象二、类关系继承:UIBehaviour,管理对象的生命周期函数基类包含【重要的一些功能类】:BaseInputModule,BaseEventData,PointerEventData,Ray
2021-02-04 18:34:14
675
1
原创 [Unity-Shader]5.Pass
一、语义块Pass[Name][Tags][RenderSetup]}二、名字【Name】表示当前的pass名字,可以用来让其他的shader文件进行直接调用,使用UsePass命令来表示。注意在是使用UsePass调用需要将名字写成大写,这是因为内部中,Name将被转化成大写。三、标签【Tags】在Pass中,标签是用来控制词通道在光照管线(环境光,顶点光照,像素光照等)具有的那个角色以及某一些其他选项。以下的标签必须是在Pass中,不能在SubShader中。1、
2021-02-04 01:04:59
341
原创 [Unity-Shader]4.SubShader-状态设置Blend
一、原理1、当同时存在透明物体和不透明物体,首先渲染不透明物体,将不透明物体颜色写入颜色缓存,深度写入深度缓冲区,然后渲染透明物体(关闭深度写入,开启深度测试),将透明物体的颜色与颜色缓冲中的颜色混合,得到正确结果。所以Blend操作的作用是--用来制作透明物体或者进行纹理混合。2、混合操作的发生时间点是shader渲染的最后一步。如下图可见,像素点通过光照模型,顶点着色器,剔除,深度测试,雾效,片元着色器,透明度测试,最后到混合操作。3、UnityShaderLab提供了相应的Ble...
2021-01-31 23:58:18
449
原创 [Unity-Shader]4.SubShader-状态设置ZWrite
一、原理1、在unity中渲染物体的顺序主要是先通过渲染队列判断较前的先渲染,之后执行zwrite和ztest,也就是深度测试和深度写入。2、那什么是深度呢?就是我们在不使用深度测试的时候,我们先绘制一个距离较近的物体,在绘制一个距离较远的物体,这样就无法通过其他方式去控制物体的绘制顺序,导致一些重叠效果不好。而使用深度缓冲之后,绘制就是根据z值 也就是深度值来计算,跟物体距离相机远近没有关系。3、那什么是深度缓冲?就是z-buffer,通过存储每个刑诉点的深度值,开启深度缓冲区,在绘制之前Op
2021-01-30 23:55:26
683
原创 [Unity-Shader]4.SubShader-状态设置ZTest
一、原理二、ZTest作用ZTest即深度测试,所谓测试,就是针对当前对象在屏幕上(更准确的说是frame buffer)对应的像素点,将对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象在该像素点才会将颜色写入颜色缓冲区,否则否则不会写入颜色缓冲。三、语义ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always四、数值说明ZTest Less(深度小于当前缓存则通过)ZTe...
2021-01-30 23:43:23
486
原创 [Unity-Shader]4.SubShader-状态设置Cull
一、语义SubShader { Tags { "ForceNoShadowCasting"="true" } Pass { ... } }二、作用三、参考https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://blog.csdn.net/maozi_bsz/article/details/78008027https://zhuanlan.zhihu.com/p/51080323...
2021-01-28 01:53:53
959
原创 [Unity-Shader]3.SubShader的Tags--PreviewType
一、语义SubShader { Tags { "PreviewType"="true" } Pass { ... } }二、作用PreviewType指示材质检视面板预览应如何显示材质。默认情况下,材质显示为球体,但也可以将 PreviewType 设置为“Plane”(将显示为 2D)或“Skybox”(将显示为天空盒)。三、参考https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://blo..
2021-01-26 23:28:02
912
原创 [Unity-Shader]3.SubShader的Tags--CanUseSpriteAtlas 标签
一、语义SubShader { Tags { "CanUseSpriteAtlas"="true" } Pass { ... } }二、作用如果着色器用于精灵,请将CanUseSpriteAtlas标签设置为“False”,这样在精灵打包到图集内时,该标签将不起作用,(请参阅精灵打包器 (Sprite Packer))。三、参考https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://blog...
2021-01-26 23:26:57
536
原创 [Unity-Shader]3.SubShader的Tags--IgnoreProjector 标签
一、语义SubShader { Tags { "IgnoreProjector"="true" } Pass { ... } }二、作用如果提供了IgnoreProjector标签并且值为“True”,则使用此着色器的对象不会受到投影器的影响。这对半透明对象非常有用,因为投影器无法影响它们。三、参考https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlhttps://blog.csdn.net/maozi...
2021-01-26 23:25:37
1260
原创 [Unity-Shader]3.SubShader的Tags--ForceNoShadowCasting
一、语义SubShader { Tags { "ForceNoShadowCasting"="true" } Pass { ... } }二、作用如果提供了ForceNoShadowCasting标签并且值为“True”,则使用该子着色器渲染的对象绝不会投射阴影。对透明对象使用着色器替换并且不希望从其他子着色器继承阴影通道时,这非常有用。三、参考https://docs.unity3d.com/cn/current/Manual/SL-SubShaderTags.htmlh...
2021-01-26 23:19:47
185
原创 [Unity-Shader]3.SubShader的Tags--DisableBatching
一、语义Tags { "DisableBatching" = "true" }二、作用使用绘制调用批处理时,一些着色器(主要是进行对象空间顶点变形的着色器)不起作用,这是因为批处理会将所有几何体转换为世界空间,所以“对象空间”丢失。三、数值的含义可使用DisableBatching标签来指示这一情况。有三个可能的值:“True”(始终对此着色器禁用批处理)、“False”(不禁用批处理;这是默认值)和“LODFading”(当 LOD 淡化处于激活状态时禁用批处理;主要用于树)。...
2021-01-26 23:09:28
679
原创 [Unity-Shader]3.SubShader的Tags--RenderType 渲染类型
一、语义二、作用Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。三、类型Unity内置的RenderType包括:(1)”Opaque”:绝大部分不透明的物体都使用这个;(2)”Transparent”:绝大部分透明的物体、包括粒子特效都使用这个;(3)”Background”:天空盒都使用这个;(4)”Overlay”:GUI、镜头光晕都...
2021-01-26 22:55:48
594
原创 [Unity-Shader]2.SubShader的Tags--Queue渲染队列
一、子着色器的结构Subshader{ [Tags] [CommonState] Passdef [Passdef ...] }二、子着色器标签标签是用来告诉渲染引擎期望何时以及如何渲染对象。语法结构如下Tags{“TagName1”="vaule1" "TagName2"="Vaule2"}三、标签的分类1、决定渲染次序--队列标签:使用Queue来决定对象被渲染的次序。后台(Background) 这个渲染队列在所有队列之前被渲染,被用于渲染天空盒之类的对象...
2021-01-20 01:22:20
422
opencvfor unity 很好用的插件
2020-12-02
Build Report Tool v3.5.zip
2020-06-16
手游资源提取工具(强烈推荐)
2017-12-21
svn环境搭建说明文档
2017-12-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人