Hello Bug.
记录一点点
展开
-
Unity ECS
一:原创 2024-04-19 10:58:59 · 652 阅读 · 1 评论 -
Unity中的两种ScriptingBackend
ios:unity只有il2cpp模式的编译才支持64位系统,mono是不支持的,在快速开发阶段仍然支持Mono,但是不能再向Apple提交Mono(32位)的应用苹果在2016年1月就要求所有新上架游戏必须支持64位架构,所以必须要选il2cppandroid:从2019年8月1日起,在Google Play上发布app必须支持64位体系。从2021年8月1日起,Google Play将停掉尚未支持64位体系的APP,在国内上架32位和64位都可以WebGL和UWP:只支持IL2CPP。原创 2023-09-23 18:17:40 · 1833 阅读 · 0 评论 -
Unity中实现HybridCLR热更新
HybridCLR又称作huatuo(华佗)、wolong(卧龙)热更方案,底层是C++编写的,是一种热更新方案,与Lua、ILRuntime等都是不同的热更方案HybridCLR扩充了il2cpp的代码,使它由纯AOT runtime变成AOT+Interpreter混合runtime,进而支持动态加载assembly,实现热更新HybridCLR官网热更新是指当游戏出现bug,或者需要修改,增加某个功能的时候,我们不需要重新下载安装包,就可以更新游戏内容。原创 2023-09-19 22:01:05 · 6097 阅读 · 0 评论 -
Unity中程序集dll
一个程序集由一个或多个文件组成,通常为扩展名.exe和.dll的文件称为程序集,.exe是静态的程序集,可以在.net下直接运行加载,因为exe中有一个main函数(入口函数),.dll是动态链接库,通过反射动态加载。程序集是一个AssemblyDefinitionFile.asmdef文件,它的内容是一个JSON格式的字段,创建之后,就可以打开直接编辑JSON。原创 2023-09-13 13:57:43 · 1849 阅读 · 0 评论 -
Unity中实现可变形的Image
重写Image的OnPopulateMesh方法,首先获取到顶点坐标,然后不同方向做不同的偏移原创 2023-02-13 11:42:42 · 2418 阅读 · 0 评论 -
Unity中的LOD
LOD为Levels of Detail的简称,意为为多细节层次简单来说就是将一个模型制作成不同精细程度,相机视野离得远的时候就显示高模,相机视野离得近的时候就显示低模,是一种用内存换渲染效率的方式原创 2023-02-03 11:14:39 · 2401 阅读 · 0 评论 -
Unity中的GC
GC就是Grabage Collector,当没有任何栈内存所指向的堆内存空间,所有的垃圾将被GC不定期进行回收并且释放无用内存空间,使这些内存可以再次使用,但是如果垃圾过多将影响到GC的处理性能,从而降低整体的程序性能,在实际开发之中,对于垃圾的产生越少越好对应的方法是GC.Collect,其功能就是强制对所有垃圾进行回收。原创 2022-12-25 16:10:12 · 6252 阅读 · 0 评论 -
C#中的String和StringBuilder
String和StringBuilder都是引用类型。StringBuilder是可变的字符串,它不会创建当前字符串的新修改实例而是在现有字符串对象中进行修改。String是不可变字符串,一旦被初始化后就不能改变其内容,String值改变的过程其实是创建了一个新的String对象赋值给了原对象(引用的改变)如果有大量的字符串修改、拼接操作则使用StringBuilder会极大的减少系统的开销。原创 2022-12-25 11:06:14 · 2693 阅读 · 0 评论 -
Unity中的性能优化
Unity中的性能优化原创 2022-12-23 14:49:02 · 2053 阅读 · 2 评论 -
Unity中实现双向链表
双向链表是链表的一种,和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。原创 2022-12-15 14:33:33 · 1266 阅读 · 0 评论 -
Unity中的Update与FixedUpdate
例如一个RPG手游,主角的移动通过在Update中用速度乘以时间差Time.deltaTime模拟,当某帧卡顿了很久,Time.deltaTime将会变得很大,导致下一帧主角会无视地图障碍直接瞬移到一个很远的距离导致穿模,超出地图等bug。而在FixedUpdate中会避免此问题,下面就针对Update与FixedUpdate深入研究一下——执行顺序Update在FixedUpdate之后执行。例如有两个脚本A和B,A中有Update和FixedUpdate,B中有FixedUpdate,A中有Updat原创 2022-11-09 18:16:34 · 7410 阅读 · 2 评论 -
Unity中的Timeline
Timeline与动画系统类似,但是它可以针对多个物体做出一系列多个动画,它可以创建多个轨道,对象激活与隐藏轨道,动画轨道,声音轨道等。每个轨道都可以单独编辑,轨道内的不同资源可以排列并且融合原创 2022-11-01 16:21:27 · 15590 阅读 · 0 评论 -
Unity中实现嵌套滑动框
Unity中如果两个ScrollRect嵌套在一起,后面的会挡住前面的,当在二级列表区域拖动时导致一级列表无法滑动根据滑动的方向,来进行事件的渗透传递,如果当前滑动方向与组件的滑动方向不一致则把事件传递给父级列表UGUI提供了事件执行的方法:ExecuteEvents.Execute......原创 2022-06-09 15:11:12 · 1429 阅读 · 0 评论 -
Unity中实现局域网—Multiplayer HLAPI
Multiplayer HLAPI在之前叫做UNet,可以开发联机网络游戏原创 2022-10-19 17:31:00 · 2508 阅读 · 0 评论 -
Unity中的动画系统
Unity动画系统,也称为Mecanim系统,可以操作模型的各种动画。原创 2022-10-07 18:13:32 · 7992 阅读 · 0 评论 -
Unity中的灯光和渲染
Unity中的灯光和渲染原创 2022-09-30 16:23:02 · 6076 阅读 · 0 评论 -
Unity中实现列表中元素随机排序
例如一个列表中有顺序的10个数字0-10,现在需要将他们打乱顺序。原创 2022-09-07 13:49:16 · 2769 阅读 · 0 评论 -
Unity编辑器扩展——自动生成UI界面脚本
对于面板赋值或Find绑定UI组件,我们可以使用一种工具化的方式去自动生成代码并绑定对象,增加效率。原创 2022-09-04 22:39:52 · 3717 阅读 · 0 评论 -
Unity中的序列化和反序列化
序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。...原创 2022-08-31 11:10:40 · 7373 阅读 · 0 评论 -
Unity中实现判断Missing还是Null
例如脚本丢失,贴图丢失,面板上会显示missing通过==null判断两者都会返回true,但在有些情况下,需要判断是Missing还是Null,通过try-catch可以判断出具体是Missing还是Null。原创 2022-07-19 15:11:04 · 2422 阅读 · 0 评论 -
Unity中实现UI渐变
一:效果演示二:使用TopColor:顶部颜色BottomColor:底部颜色三:代码实现using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;[DisallowMultipleComponent][AddComponentMenu("LFramework/UI/Effects/Gradient", 1)]public class Gradient : BaseMeshEffect原创 2022-04-26 22:00:00 · 5074 阅读 · 0 评论 -
Unity中实现UI翻转
一:效果演示二:使用FlipType:翻转类型(水平翻转、竖直翻转、水平竖直翻转)三:为什么不使用将Scale设置为-1将Scale的x、y设置为-1也可以实现翻转的效果,但是这样还会影响到子物体以及animation,所以最佳的方法是修改图片的显示,我们可以继承UGUI提供的网格效果基类BaseMeshEffect修改网格顶点去实现翻转效果四:代码实现using UnityEngine;using UnityEngine.UI;using System.Collecti原创 2022-04-24 14:58:04 · 5430 阅读 · 5 评论 -
Unity中的文件夹和路径
——EditorEditor文件夹可以在Assets目录下,也可以在子目录里,只要名子叫Editor就可以。例如目录Assets/Editor和Assets/Scripts/Editor是一样的,无论多少个叫Editor的文件夹都可以Editor文件夹下存放的所有资源文件或脚本文件都不会被打进包中,并且脚本也只能在编辑时使用。一般会把一些编辑器扩展的脚本放在这里,或者是一些编辑时用的DLL——Editor Default Resources必须放在Assets目录下,可以把编辑器扩展用到的一些资原创 2022-03-04 21:00:00 · 12322 阅读 · 0 评论 -
Unity中实现四舍五入
一:前言C#中没有四舍五入,它采用的是四舍六入五成双,C#中的Math.Round和Unity中的Mathf.Round都是如此,想要实现四舍五入只能自己实现四舍六入五成双:四舍五入时,如果小数位是5,那么编译器会自动识别这个小数的前后两个整数并返回那个偶数例如10.5是10,11.5是12二:代码实现using UnityEngine;/// <summary>/// 数学相关工具类/// </summary>public static class原创 2022-02-17 15:03:08 · 8343 阅读 · 0 评论 -
Unity中实现多层血条
using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using System;/// <summary>/// 血条/// </summary>public class HpBar : MonoBehaviour{ //血条slider组件 public Slider m_HpSlider; //顶部血条 public Image m_Top.原创 2022-01-30 19:09:29 · 4507 阅读 · 3 评论 -
Unity中实现雷达图
一:效果演示二:实现思路——描边思路:一开始觉得这很简单,就直接绘制一个比当前大一圈的雷达图就可以了,试了试发现并没有那么简单当每个顶点的权重都相同时,也就是雷达图为正多边形时绘制出来的描边是等宽的,但是因为雷达图每个顶点的权重是不均匀的,所以会导致描边的宽度也不均匀,效果如下解决办法是对于每一个顶点,都找出上一个顶点和下一个顶点,并且得到它相邻的两条边的向外的垂线,沿着垂线向外延伸相同宽度后得到两个点,再把两个点沿着边的方向延伸相交于一点,对每个顶点重复上述步骤,就能得到描边外框的所有点原创 2022-01-27 22:13:05 · 5825 阅读 · 6 评论 -
Unity中实现UI描边
一:为什么尽量避免使用大量UGUI的Outline和Shadaw组件下面是Outline的源码,不论是Outline还是Shadow,它的实现原理是把原来的顶点拷贝出来一份,根据偏移量来设置拷贝出来的顶点位置。Shadow拷贝一份,Outline拷贝四份using System.Collections.Generic;namespace UnityEngine.UI{ [AddComponentMenu("UI/Effects/Outline", 15)] /// <s原创 2022-01-10 15:08:46 · 6069 阅读 · 6 评论 -
Unity中实现仿3D轮转图
一:效果演示二:实现思路原创 2022-01-05 23:14:28 · 4721 阅读 · 10 评论 -
Unity中实现限制RectTransform下某个属性不可被修改
一:效果演示让RectTransform下某些属性不可以在Inspector面板上修改二:代码实现using UnityEngine;public class Test : MonoBehaviour{ static DrivenRectTransformTracker tracker = new DrivenRectTransformTracker(); private void Awake() { tracker.Clear();原创 2021-12-26 17:57:51 · 5099 阅读 · 3 评论 -
Unity中实现UI元素的响应区域精确判定
一:前言例如这张UI图片,正常情况下它的响应区域是一个矩形,如果当前有个需求是只有点击到UI元素上才视为点击,其他空白地方不视作点击,显然正常的做法不能满足需求UGUI为我们提供了一种实现响应区域精确判断的方法,可以代码动态将alphaHitTestMinimumThreshold参数设置为0.1,这样就实现了只有在透明度大于0.1的像素点才视为响应,但它要求图片的Read/Write Enabled必须开启,这就导致了图片占用了两份内存,所以不建议使用还有一种方法可以看这篇文章:Unity中实现原创 2021-12-25 19:24:53 · 2983 阅读 · 0 评论 -
Unity中实现自己的圆形Image组件
一:前言例如圆形头像或者圆形技能图标,一般做法是使用Image组件+Mask组件实现,但是Mask组件会增加额外的drawcall影响效率并打断合批所以不建议使用UGUI的Mask实现原理:利用GPU的模版缓冲Mask组件会赋给父级和子级UI一个特殊的材质,这个材质会给Image的每个像素点进行标记并放在一个称为Stencil Buffer的缓存内,父级每个像素点的标记设置为1,子级UI进行渲染的时候会去检查这个Stencil Buffer内的标记是否为1,如果为1则进行渲染,否则不渲染.原创 2021-12-19 15:27:23 · 5838 阅读 · 1 评论 -
Unity中sizeDelta的真正含义
一:前言获取UI的长宽,可以使用sizeDelta或者rect.height/width,但是Unity官方对于sizeDelta是这样解释的:Anchors在同一点的时候,sizeDelta相当于获取长宽,但是Anchors不在同一点时,表示的只是UI真实大小比Anchors矩形大或者小多少sizeDelta.x = rect.x - anchorRectangle.x;sizeDelta.y = rect.y - anchorRectangle.y;上面的公式其实是sizeDelta的真原创 2021-11-19 23:00:57 · 11327 阅读 · 0 评论 -
Unity中解析Excel表格工具
一:前言游戏开发中,策划一般将游戏数值配置在Excel表格中,所以写一套读表工具可以提高效率我使用的是EPPlus插件读取的Excel表格,最后将Excel表转换为ScriptableObject实体二:使用1——Excel表格格式:第一行为字段名称,第二行为字段类型,第三行为字段说明,数据从第四行开始填充第一列是获取值时的键,一般填写id即可如果是内置的类型,字段类型应填写int、float、double、string、int[]、string[]........原创 2021-08-24 10:40:47 · 3291 阅读 · 1 评论 -
Unity中实现GUI适配
一:前言例如通过OnGUI绘制一个按钮,在不同分辨率下的大小比例会不同二:代码实现using UnityEngine;public class TestGUI : MonoBehaviour{ private void OnGUI() { Resize(); GUILayout.Button("this is a button"); } Vector2 nativeResolution = new Vector2(750原创 2021-08-30 15:18:10 · 2742 阅读 · 2 评论 -
Unity中实现时间戳与C#时间互转
一:什么是时间戳时间戳是指格林威治时间1970年1月1日0时0分0秒起至现在的总毫秒数1970年01月01日00时00分00秒的来历:UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的二:时间戳转C#时间10位的时间戳是秒,13位的时间戳是毫秒/// <summary>/// 时间戳转C#时间/// </summary>public static DateTime TimeStamp原创 2021-06-29 10:21:41 · 3064 阅读 · 0 评论 -
Unity中解决空格导致文本的换行问题
一:前言当Text的文本中的字符串一行显示不下并有空格时,空格后的字会被当作一个整体换行显示Unity这样设定是用于英语等西文的,是为了保证单次不会被分开显示,所以空格后的字符串会被当成一个单词给换行处理了二:解决方法平时我们打出的空格都是带这种换行功能的,但是也有一种不换行的空格,Unicode编码为\u00A0所以只要将换行空格替换为不换行空格("\u00A0")即可:using UnityEngine.UI;using UnityEngine;/// <summa原创 2021-03-03 18:49:23 · 7056 阅读 · 2 评论 -
Unity中实现粒子效果显示在UI上
一:为什么默认模式下粒子效果不能显示在UI上因为Canvas的默认渲染模式是Screen Space-Overlay,这种模式下的Canvas在屏幕空间中渲染,会显示在场景的最上方,也就是说一切UI都显示在最上层,而粒子系统是在世界空间中渲染的,所以会被遮挡住二:实现——将Canvas的渲染模式改为Screen Space-Camera并指定一个相机,新建一个Layer:EffectMainCamera用于渲染各种3D/2D的游戏物体,Depth最小,只渲染除了UI和Effect层外的物体,渲原创 2020-07-03 15:40:47 · 13256 阅读 · 4 评论 -
Unity中实现自定义脚本模版
一:前言在Unity中创建一个新的脚本打开后默认如上图所示,比如我个人习惯初始类中的方法是空的,需要的时候再添加,所以每次都需要删除掉Update和Start方法有点繁琐,其实Unity的脚本模版可以自定义二:步骤——打开Unity安装的文件目录,进入到Content—Resources—ScriptTemplates文件夹。里面有Unity所有脚本文件的模版,比如第一个就是创建C#脚本的模版——修改成自己习惯的模版using UnityEngine;public clas.原创 2021-05-14 11:39:07 · 2955 阅读 · 1 评论 -
Unity中实现移动端调试器
一:前言Unity中的Console窗口能够显示运行中的错误、警告和其他log消息,但打包到手机上无法查看,一种方式是连接手机进行联调,或者可以自定义一个控制台窗口,利用OnGUI绘制到屏幕上模拟Unity中的Console二:使用——在游戏启动时调用 DebugConsole.Ins.OpenDebugConsole()开启控制台调试窗口三:代码using System;using System.Collections.Generic;using UnityEngine;//原创 2021-05-07 10:56:18 · 2582 阅读 · 5 评论 -
Unity中实现有限状态机FSM
一:什么是有限状态机?在游戏的战斗系统开发中,角色都会有很多的状态,我们需要对这些状态进行处理以及状态之间的转换,最简单的方式是在一个Switch中进行判断,在每一个case分支中进行相应的状态处理和转换条件的判断,但是这种方式不利于扩展,每当添加新的状态都需要修改Switch总的代码,违背了对修改关闭对扩展开放的开闭原则,而使用有限状态机可以更好的扩展,如果后期需要加入新状态,只需要继承基类,添加实现就好,不用修改原来的代码二:代码实现using System;using System.C原创 2021-05-04 19:58:39 · 2597 阅读 · 1 评论