- 博客(87)
- 资源 (8)
- 收藏
- 关注
原创 SVN Update item to revision、Revert to this revision、Revert changes from this revision
*还原指定版本做出的修改。表现:**将指定版本修改的内容去掉,还原后,服务器认为你的版本号比服务器更新,所以也会有新的提交内容,并且提交后的版本号+1,例如:当前处于提交3版本,选中提交3版本执行操作,则会还原/抹去,3版本的操作,结果是1234。,服务器认为你的版本号和服务器相同,不会有新的提交内容,更像是查看指定版本的内容。,服务器认为你的版本号比服务器更新,所以会有新的提交内容,并且提交后的版本号+1,
2024-01-22 17:22:16
1067
原创 Unity编辑器扩展之CustomPropertyDrawer理解
在上一篇文章中提到,CustomEditor只能自定义单一类,被其他类持有的类自定义没有作用,这个时候就需要使用CustomPropertyDrawer属性。PropertyDrawer介绍PropertyDrawer用于自定义属性绘制器的基类。使用PropertyDrawer来控制它在Inspector中的样式。可以使用CustomPropertyDrawer 特性将 PropertyDrawer附加到 Serializable类,然后传入绘制器进行渲染。使用此基类有两种用途:
2023-10-27 16:33:52
1758
2
原创 Unity编辑器扩展之自定义Inspector面板
CustomEditor这个东西能够自己绘制在Inspector视图的显示规则,但是!如果这个类被另一个类持有,他就没作用了,就需要使用PropertyDrawer。单独对MonoTest类型,进行自定义显示,符合自定义代码的显示布局。对持有类进行自定义显示,没有任何改变,unity默认显示方式。这个东西,对于嵌套的类没作用,这个时候就需要使用。1.对CustomClass类编辑自定义面板。2. 对MonoTest类编辑自定义面板。
2023-10-27 11:15:13
779
原创 Unity中GUI、GUILayout、EditorGUI、EditorGUILayout、GUILayoutUtility、EditorGUIUtility区别
Unity中GUI、GUILayout、GUILayoutUtility、EditorGUI、EditorGUILayout、EditorGUIUtility区别## 1.解释一下Unity中的编辑器扩展类,分为两组: - 在编辑器或者Runtime都能使用,命名空间UnityEngine - **GUI:** ui系统,包括button,lable,toggle等控件 - **GUILayout:** 在GUI基础上,控件新增自动布局功能 - **GUILayoutUtility:
2023-10-26 17:24:41
728
原创 Unity Inspector编辑器扩展,枚举显示中文,枚举值自定义显示内容
Unity对于枚举的扩展, Inspector面板编辑器扩展,枚举都是使用英文定义,能不能在组件上显示中文、数字、自定义字符,并且控制显示值,例如None值不显示,都可以通过编辑器扩展得到想要的效果。
2023-10-25 18:45:13
1376
1
转载 浅谈C#中Dictionary字典的底层原理
对于C#中的Dictionary类相信大家都不陌生,这是一个Collection(集合)类型,可以通过Key/Value(键值对的形式来存放数据;该类最大的优点就是它查找元素的时间复杂度接近O(1),实际项目中常被用来做一些数据的本地缓存,提升整体效率。那么是什么样的设计能使得Dictionary类能实现O(1)的时间复杂度呢?那就是本篇文章想和大家讨论的东西;这些都是个人的一些理解和观点,如有表述不清楚、错误之处,请大家批评指正,共同进步。
2023-06-13 10:37:25
3424
1
原创 Unity中UI方案。IMGUI、UIElement、UGUI、NGUI
通过Create->UIToolkit->UIDocument,创建布局文件,双击打开UIBuilder,UIBuilder是UXML和USS的可视化编辑器,让使用者不需要手写布局代码,在编辑器中可以方便做出各式各样的界面。NGUI的最早版本发布于2011年12月份,NGUI可以说是Unity平台最强大的第三方UI系统Unity早期版本(Unity4.6之前),引擎自身的UI系统是很差的,绝大多数项目都是使用的NGUI进行UI界面开发的。官方解释这是一套兼顾。它是独立的UI编辑器,且对美术、策划都友好。
2023-06-12 19:07:09
5553
1
转载 Unity Github 上 AssetBundle 框架
三人行必有我师焉,大家看看有木有借鉴得地方。资源热更框架都逃不过 Unity AssetBundle 那一套,大家做轮子也就是实现各自的基于 AssetBundle 的工具链,包括但不限于:完善的 Editor AB 开发工作流,所有操作有可视化窗口有 self-host 测试环境,支持 Editor 下直接 AB 模拟加载资源加密设计分包策略,预设优化规则,保证不重复打包包体依赖关系整理版本更新逻辑、资源检测 、增量下载,边下边玩多线程下载、断点续传依赖加载,引用计数。
2023-06-08 15:19:05
594
转载 UnityShader 序列帧动画Shader实现
如果游戏中,需要大量2D怪物,类似roguelike,割草的效果,就会有很多不同的帧动画,使用Animation,性能问题就很大,这个时候我们就需要使用gpu渲染,既能减少动画组件,还有效合批,再加上使用GPUInstance,轻松达到几千个怪物。本篇文章是一片转载文章,记录一下,通过学习文章的思路,自己放到项目使用,所以文章的代码没有测试,大家可以试试。--------------"_Time"是Shader内置时间变量-----------//横向ID = 整数ID减去 横向个数乘以纵向ID。
2023-05-26 10:45:54
1592
原创 Unity中GPUInstance详解
为什么要用GPUInstance在没有GPUInstance此技术之前,对于像草地、树木,割草游戏,它们往往是数据量很大,但同时又只存在微小的差别如位置、旋转、颜色等。如果像常规物体那样进行渲染,所使用的绘制指令必然很多,资源占用必然很大,一是cpu对gpu提交数据的次数(包括设置数据buffer,渲染状态以及调用对渲染原语的绘制即drawcall),二是gpu上的绘制(包括顶点处理和像素绘制),随着场景物体的提升,cpu和gpu的压力都会上升。一个合理的策略就是,我们指定一个需要绘制物体对
2023-04-19 15:46:44
5250
原创 Unity静态合批处理详解
静态批处理的原理静态合批最重要的一件事就是合并网格。在运行前 或是 发布前,场景中相同材质,并且标记为 Batching Static(自动静态合批)或者通过代码调用合并函数(StaticBatchingUtility.Combine手动静态合批)的物体,引擎会把网格信息取出来,之后对网格上的顶点进行空间变换,变换到同一坐标系下,合并成一个新的大网格。形成新的大Vertex Buffer Object(VBO 顶点缓冲对象)和Index Buffer Object(IBO 索引缓冲对象)(这两
2023-04-18 16:33:14
2152
原创 Unity中stats中的SetPass Call详解
一般 OpenGL 中,绘制一个对象,就是提供,VBO,IBO(IBO还不一定需要提供,可以使用 DrawArray 直接通过VBO来绘制,如果通过DrawArrayIndex 之类的就需要 IBO 了,前面的 VBO,IBO 也可以通过 VAO 统一绑定后设置),然后指定 shader(VS(顶点着色器),FS(片元着色器),其他的按需提供),就可以调用 DC(DrawCall) API 来绘制就可以了。索引数据块,在显存中,可被GPU直接访问。
2023-04-18 15:36:54
1188
原创 C# 声明一个变量 是如何分配内存空间
值类型:int a,直接在栈(堆栈)中分配内存空间,用来存储值。引用类型:preson a=new preson(),分为两步。所以,a中存储的并不是preson实例,而是实例的地址引用。
2023-04-17 15:19:56
412
原创 Unity ShaderVariant 变体收集方案分析
工程把所有shader单独打包Assetbundle,editor打包ab包的时候,未收集到正确的shader变体,未将场景中使用的shader变体打包到ab包中,所以发布apk之后,渲染异常。最近遇到一个问题,在editor中场景渲染正确,打包android之后,渲染异常。
2023-04-14 17:05:21
4910
转载 Shader优化方案、shader变体
Unity的Shader绝对是个黑盒,困扰了很多开发者,我也陆陆续续被困扰了好久。首先我们需要知道Unity的Shader从编写到最终被GPU执行经历了什么?编写Shader的时候我们用的是HLSL语言,在打包的时候会根据目标平台生成对应的着色器语言,如Android平台是GLSL,iOS平台则是MSL。无论是整包,又或是构建Assetbundle,GLSL或MSL会被打进包中。这也能解释当使用AssetStudio这样的解包工具解开Shader的时候是无法看到原本的HLSL代码的。
2023-04-13 17:14:34
1197
转载 ShaderVariant变体
在写shader时,往往会在shader中定义多个宏,并在shader代码中控制开启宏或关闭宏时物体的渲染过程。最终编译的时候也是根据这些不同的宏来编译生成多种组合形式的shader源码,说白了就是和if类似。其中每一种组合就是这个shader的一个变体(Variant)。定义方式中值得注意的是,#pragma shader_feature A其实是 #pragma shader_feature _ A的简写,下划线表示未定义宏(nokeyword)。
2023-04-06 18:42:29
999
转载 Unity中的静态合批,动态合批,SRPBatcher,GpuInstance
动态合批的条件:①使用相同的材质球②在视野范围内的物体动态合批的适用范围: 移动的,没有进行前几种合批的物体动态合批的过程:①。
2023-03-29 18:52:04
3138
转载 Unity 蒙皮动画 SkinnedMesh 使用GPU Instance
我想很多开发游戏的小伙伴都希望自己的场景内能渲染越多物体越好,甚至是能同时渲染成千上万个有自己动作的游戏角色就更好了。但不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为代价的,因为有太多Draw Call的问题,如果游戏对象有动画的话还会涉及到cpu的蒙皮开销,最后我们必须找到其他的解决方案。那么本文就来聊聊利用GPU实现角色的动画效果,减少CPU端的蒙皮开销;同时将渲染10,000个带动画的模型的Draw Call从10,000+减少到22个。
2023-03-29 17:36:59
1901
2
原创 Unity -- Material does not have a _MainTex texture property. It is rqured for SpriteRenderer.
在SpriteRenderer上,有时候会提出警告,Material does not have a _MainTex texture property. It is rqured for SpriteRenderer.它的意思是SpriteRenderer材质球shader上,必须有_MainTex属性,如下图,必须要有_MainTex属性。
2023-03-27 12:29:50
1615
原创 Unity NavMeshObstacle组件详解
但是如果出现动态的障碍,比如一堵墙原本不能通过,现在又需要通过,这时候就需要用到Nav Mesh Obstacle,这里可能会想到空气墙,但是空气墙使用的是Rigidbody,如果速度过快可能就会出现穿过的问题。表示障碍物移动之后,等待多长时间,变为静止物体,然后去判断一次移动阈值,如果移动阈值不满足,同样不会生效到NavMesh,所以这里就是这个组件自己掌握性能优化的地方。Carve Only Stationary属性不勾选,那么静止时间没用,组件会每帧雕刻,消耗过大,但是移动阈值正常工作。
2023-03-16 16:49:21
2001
原创 C# For、Foreach性能比较
例如:在update中,两句代码都用foreach遍历同一个字典,则只有第一个foreach有gc产生。一直听说foreach会有gc产生,有说.net3.5之前有,.net4则修复,一直没有测试,今天测试记录一下。使用foreach循环遍历其中的key或values,则会分别产生额外GC,同样只只产生一次。for循环遍历字典,同样的,如果两句代码遍历同一个字典。GC产生的大小,与字典存的数据结构有关,存int的GC 就小于存Class GC。for循环、 foreach循环,第一次都会产生GC。
2023-03-15 19:12:11
1162
1
原创 【C#】Dictionary的TryGetValue和Contains使用、性能比较
可以看到,判断ContainsKey的时候调用一次FindEntry,使用索引取值的时候又是用了一次FindEntry。可以看到,获取字典的一个值时,TryGetValue,使用了一次FindEntry,然后直接根据索引,取到了对应的值。TryGetValue,调用1次FindEntry取到想要的值【推荐使用】。ContainsKey,调用2次FindEntry取到想要的值。使用 ContainsKey判断是否存在,用索引返回值。使用 TryGetValue,用out返回值。
2023-03-15 16:46:23
1132
转载 unity3D Mecanim动画系统Generic动画支持动画中的位移
不过如果能让动画直接带上位移,那么程序和美术童鞋都解放了,动画设计的时候就能更大胆了,毕竟角色动画的真实位移相对于程序控制的更协调,而且大家都省了不少的事情,何乐不为啊。尼玛,发现单个动画在播放的过程中角色确实发生位移了,但是每个动画结束之后回到IDLE状态动画的时候,角色在场景中的位置会发生一次闪回,直接重新归位到动画开始播放时角色所在的位置,并且在整个动画播放的过程中,角色的位置从未发生过变化,角色身上绑的Capsule Collider也完全不会移动,完全落在角色身后了。
2023-03-11 19:38:02
723
转载 unity3D 中useGravity和isKinematic以及applyRootMotion
这个属性是用来控制物体在播放骨骼动画的时候是否应用骨骼根节点的运动参数,也就是说在动画播放的过程中是否使用动画中物体的位移。在实际制作的过程中,总会有某些动画自身带位移,而某些动画是不带位移的,对于那些动画中自带位移的,那么就可以通过设置这个变量为true就可以让对象在播放动画的过程中按照动画中的位移进行移动,这样动画的效果也会更逼真一些而不是通过程序来控制对象的位移(程序大部分情况下都是简单的做匀速或者加速运动,无法做到完全与动画中动作移动幅度完全吻合,可能会出现一些失真的情况)。这些竟然都是题外话?
2023-03-11 19:34:02
1099
原创 Unity中动画切换
不太清楚这个值具体表示什么,(测试了一下,如果近1,则直接到目标状态,没有过渡。近0,则有过渡,其他切换参数生效。api切换的优点就是不用连线,直接使用代码切换,并且能够实现过渡效果。缺点就是不直观,并且各个动画过渡参数不一样,可能需要配置。需要连接各个动画的逻辑关系,并且添加切换参数,设置退出时间,调整切换持续时间等。切换到目标动画的位置,例如切换到目标状态的0.5(动画50%处)在unity中,3D模型的切换可以使用animator状态机或者代码切换。切换到目标动画,切换过程需要消耗的时间。
2023-02-28 19:31:12
2509
原创 Unity Animator获取当前播放动画片段
这里有一个机制,如果上一句代码是播放一个动画片段,下一句代码立即去获取当前播放片段信息,是获取不到的,需要等待几十ms的延迟,才能正确获取到当前播放片段信息。这是因为动画片段切换有一个切换过渡transition时间。Animator获取当前播放片段,获取错误,跟当前播放的片段不一致的原因。
2023-02-22 16:50:01
3619
原创 图片,图集打入ab包的依赖关系、Include in build
我们将ab包解开之后,发现一张图片打成ab包里面包含有1张sprite和一张texture2d,这是因为我们没有打图集,unity自动给我们生成了单张图片的图集,这样不利于ui合批。打包图片未打图集。一个文件夹,n张图片,打入一个ab包,包内有n张sprite和n张图集texture2d。未打图集。多个文件夹,n张图片,打入一个ab包,包内有n张sprite和n张图集texture2d。打图集,一个文件夹,n张图片,打入一个ab包,包内有n张sprite和1张图集texture2d。
2023-01-29 17:24:20
1465
原创 C# 泛型继承中的静态成员字段问题
静态字段,一般都是在所有实例之间共享的值,全局唯一和和类绑定,其他实例修改之后会随之修改。是不是所有静态成员都共享呢?泛型继承中的静态成员共享吗?1.先来说几句泛型,泛型分为开放类型(类型参数未确定,例如Genneric )封闭类型(类型参数已确定,不能更改,例如Genneric),在程序运行时都已经转换成封闭类型。泛型中的,表示这是类型占位符,他不是一个特定类型,他可以代表所有类型。2.首先,泛型中的静态成员不是唯一的,原因如下:泛型的每一种类型,都是由运行时现场合成
2022-12-28 11:32:43
384
原创 unity模型描边,卡通描边,OutLine断开不连续问题
unity模型描边,卡通描边,OutLine断开不连续问题,使用法线方向描边不正确。记录一下,亲测可用。
2022-12-12 15:18:16
1078
原创 C# Const、readonly、Static区别
对于三者的关系,来彻底分解一下。1.静态常量,也称编译时常量,编译时--意味着用const定义的字段,在编译时就要确定值(也可以理解为声明时),之后无法更改。属于类型级,意思是用类名直接访问,被所有对象共享!a.编译时常量,编译时/声明时确定值,之后不能修改。b.性能比readonly稍好,灵活性差一些。c.静态常量,隐式被Static修饰,不能再用static重复修饰。d.静态常量的数据类型(内建的int和浮点型)、枚举或字符串。e.属于,意思是用类名直接访问,被所有对象共享!
2022-11-11 15:25:12
1088
3
原创 C# 学习Lock关键字
其中MethodTableRef是指向MethodTable中这个类型(Type)定义,简单说就是这个对象是什么class定义的。我们还是看lock(_lockObj)这一行,简单地想一想,lock关键字把_lockObj对象锁住了,别的线程就进不来了,那它是怎么锁的呢?一般将32位分为两段,前6位用以表示不同的功能(这里假设第5位是锁定位),后26位用以表示对象的hash值、或者是SyncBlock的索引值。上面代码应该都能看懂,可以实现在某一时刻,只允许一个线程访问功能,避免多个线程同时访问。
2022-11-10 18:49:53
1416
原创 C#中 括号强转、as、is区别
C#是一门强类型语言,一般情况下最好避免将一个类型转换成另一个类型,但是有些时候又不得不进行类型转换,那么就出现几种强转方式。1. 括号强转。在转换中不进行转换检查,直接进行转换,如果失败会抛出异常,会执行catch语句。如下图2.is。可以用来判断是否可进行转换,表达式返回值为bool。如下图,结果会打印转换失败2. as转换。在转换中先进行转换检查(相当于在强势转换前,做了一次is运算),如果失败会返回null(所以as不能用于值类型,值类型不能为null),如下图,结果会打印转换失败
2022-11-09 18:17:31
696
原创 Unity为什么ios不能热更新
2、AOT(Ahead Of Time 运行前编译)模式——在编译成CIL之后,会把CIL再处理一遍,编译成原生码,在运行的时候交给CPU直接执行,Mono下的AOT只会处理部分的CIL,还有一部分CIL采用了JIT的模式;但是对于Jit来说,要动态生成代码并且执行,则需要在运行是动态分配内存来存放生成的代码,并通过这块内存来执行对于的代码逻辑。还有一种对Jit的理解是:一个程序在它运行的时候创建并且运行了全新的代码,而并非那些最初作为这个程序的一部分保存在硬盘上的固有的代码, 就叫Jit。
2022-09-21 11:38:36
1857
原创 Unity Text文字超过长度显示为省略号
文字超过多少字,或者超过几排,就显示为省略号。这两个方法,如果传入单个字,输出就是单个字的宽高;如果传入长串字符,则是长串总宽高,注意:在刚才传入的范围内。在 Text 位于 Canvas 上并且画布缩放时非常有用。相除之后就得到正确的宽高了。思路:使用TextGenerator,预先得到文本框能显示字数,行数,高度,宽度等,用于逻辑开发。这里为什么要相除呢,因为它是。......
2022-08-10 16:05:46
3645
4
原创 Unity Text文本输入空格换行 解决方法
在unity里面,给文本内容排版的时候,经常会遇到空格换行问题,这里提供几种解决方法。c#中,支持unicode编码,所以可以使用。直接替换成上面对应的符号,或者使用。space键(输入法半角月亮)来进行空格替换排版。使用方法,将内容中的。...
2022-08-09 19:22:10
8089
原创 Unity AR阴影投射透明地面 仅渲染模型实时阴影 Shader实现
项目有个需求,通过灯光照射,仅渲染模型阴影,相当于接受阴影的地面透明。原理就是使用一个shader,将接受阴影地面透明,并且仅仅渲染阴影。
2022-08-02 15:45:36
2447
原创 Unity 报错No ‘git‘ executable was found. Please install Git on your system then restart
亲测可用。An error occurred while resolving packages:Project has invalid dependencies: com.unity.xxx: No 'git' executable was found. Please install Git on your system then restart Unity and Unity Hub在我们使用PackageManager时,Unity允许我们使用Git上的package(点击加号,...
2022-04-25 14:03:47
16876
4
原创 获取安卓Keystore的SHA1、KeyHash密钥散列
获取SHA1找到keystore所在文件夹,shift+鼠标右键(在此处打开命令窗口)输入:keytool -v -list -keystore keystore名称.keystore获取KeyHash在接入FackBook的时候,后台需要密钥散列,这里就来获取一下。第一步:下载官方openssl科学上网下在地址https://code.google.com/archive/p/openssl-for-windows/downloadshttps://cod...
2022-04-21 14:22:57
3533
原创 Unity 使用USB、WiFi连接真机调试 Profiler
亲测可用。发布一个development apk,在buildsetting发布界面,勾选Development build。 usb连接手机,打开调试模式,并且在电脑上使用adb查看是否连接正确(如果遇到adb不是内部或外部命令,直接去找到android sdk/platform-tools文件夹,有一个adb.exe,不用双击,在本文件夹点击shift+鼠标右键选择在此处打开命令窗口),输入adb devices出现类似下图,则设备连接电脑成功。 检查连接端口是否被占用,在cmd里面输入nets
2022-04-18 11:26:59
6659
原创 SpriteRender MaterialPropertyBlock used to modify these values
记录一下,给Sprite Renderer赋值sprite之后,在材质球下方有一行警告信息MaterialPropertyBlock used to modify these values官方回答:这是因为 Sprite Render 使用 MaterialPropertyBlock 将 sprite 纹理分配给材质(着色器)。这就是为什么您可以在 Sprite Renderer 上使用不同的精灵,而只需使用一种材质。默认精灵着色器具有隐藏材质上的 _MainTex 属性的标签,因此您无法
2022-04-08 15:14:15
2156
1
Easy Touch 5 Touchscreen Virtual Controls v5.0.8 (Apr 20, 2016)
2023-04-07
openssl最新版本下载 openssl-0.9.8k_X64
2022-04-21
Unity Studio 、 AssetStudio插件
2022-04-01
Unity 使用 Play Asset Delivery 插件
2022-03-26
android-support-v4-25.3.1-解决ContextCompat中不包含checkselfPermission
2019-03-27
New-Unity-For-ShareSDK-master
2019-03-26
android-support-v4 android-support-v7-appcompat
2018-12-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人