Unity-基础
东北砍王
做游戏,是种梦想!
展开
-
Unity颜色转换(HtmlString和Color)
一般美术给UI的色值都是 #FFF7F4 这样的,但是在unity里面是需要传 color 这个对象的那么如何转换呢?方法一:unity内置方法string colorStr = "#FFF7F4";ColorUtility.TryParseHtmlString(colorStr, out Color color);方法二:自己写解析方法Color color = CreateColor(0xFFF7F4); public static Color CreateColor(int r,原创 2021-09-13 15:32:20 · 3031 阅读 · 0 评论 -
Unity新版InputSystem之实践篇
为什么要更新InputSystem?Unity 之前设计的输入系统 UnityEngine.Input 使用起来并不舒适,在多设备和多平台输入处理时(尤其是VR和XR等)显得十分臃肿和复杂。Unity 从 2016 年起开始逐步开发新一代输入系统 UnityEngine.InputSystem ,官方表示大概在 Unity 2020 版本推出新输入系统的正式版。旧版是否下架也不确定,不过我们一定要学习一下新版的系统!!如何使用?简易的使用已经在上一个文章说明了,传送门之前我们配置所有Input相原创 2021-05-16 19:19:37 · 4863 阅读 · 8 评论 -
Unity新版InputSystem之使用篇
1.导入2.设置3.修改如果之前导入过UGUI的EventSystem,需要变更成新的原创 2021-05-16 18:30:19 · 2753 阅读 · 2 评论 -
如何判断是iPhoneX?
代码如下:static inline BOOL isIPhoneXSeries() { if (@available(iOS 11.0, *)) { UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window]; if (mainWindow.safeAreaInsets.bottom > 0.0) { return YES; }原创 2021-04-28 16:56:12 · 92 阅读 · 0 评论 -
JobSystem 的 IJobParallelFor 使用
IJobParallelFor 有啥用:IJob 一次只能执行一个任务,如果需要重复执行某个动作很多次,就可以用到并行任务 IJobParallelForParallelFor jobs使用 NativeArray作为数据源,并且运行在多个core上,每个job只负责处理完整数据的一个子集Execute(idx)方法对于数据源NativeArray中的每个item都调用一次需要手动执行次数,表示需要分多少次独立Execute执行,一般直接取 NativeArray 的数组长度作为执行次数,一次处理一个原创 2021-04-20 10:55:04 · 1433 阅读 · 0 评论 -
JobSystem 基本概念&IJob使用
参考文章:C# Job System基本概念如下:JobSystem是啥?可以简单安全使用多线程,写出高性能代码单线程是一次执行一个指令多线程是利用CPU的多核,多条指令同时执行,其他线程执行完成后会将结果同步给主线程线程池:线程如果切换上下文(context switching),性能耗费很大当激活的线程数超过CPU cores时,就会导致CPU资源争夺,从而触发频繁的context switchingc# JobSystem 和 Unity Navtive Job System贡献工原创 2021-04-20 10:51:24 · 833 阅读 · 0 评论 -
Unity 中的 async-await 支持IEnumerator
本文都是参考c一个开源的项目:Unity3dAsyncAwaitUtil/releases之前写的文章可以参考:Unity 中的 async-await 关键字解析本文要实现的就是:await 可以直接接 协程 yield return 的东西此处就拿 WaitForSecond 举例子:void Start(){ ForIEnumator();}async void ForIEnumator(){ await TestIEnumator();}IEnumerato原创 2021-04-19 16:51:23 · 1821 阅读 · 1 评论 -
Unity 中的 async-await 支持YieldInstruction
本文都是参考c一个开源的项目:Unity3dAsyncAwaitUtil/releases之前写的文章可以参考:Unity 中的 async-await 关键字解析本文要实现的就是:await 可以直接接 协程 yield return 的东西此处就拿 WaitForSecond 举例子:void Start(){ ForIEnumator();}async void ForIEnumator(){ await new WaitForSeconds(1f); De原创 2021-04-19 13:27:18 · 956 阅读 · 0 评论 -
Unity 中的 async-await 关键字解析
入门篇参考之前的文章:Unity 中的 async-await 咋用首先,理解一下这两个关键字:1.async:可以把方法标识为异步2.await:异步方法在碰到await表达式之前都是使用同步的方式执行await 后面等待什么呢?C#提供了一个接口规范,就叫做 INotifyCompletion,命名空间是 System.Runtime.CompilerServices其实现有:TaskAwaiter 以及泛型版本 TaskAwaiter其实在Unity中使用 async,还是会在当前线程原创 2021-04-19 12:03:35 · 2909 阅读 · 0 评论 -
Unity 中的 async-await 咋用
async-await 是啥?之前在Unity写一个定时功能,可以使用协程实现:IEnumerator Start(){ Debug.Log("等待 1 秒"); yield return new WaitForSeconds(1.0f); Debug.Log("结束");}现在会有一种新的实现方式:就是 async-awaitasync void Start(){ Debug.Log("等待 1 秒"); await Task.Delay(TimeS原创 2021-04-18 17:20:37 · 2752 阅读 · 0 评论 -
U3D流光效果
流光效果是一个非常常见的效果,不仅仅是游戏,一些广告之类的也都会有这种效果。实现原理:需要一张流光图,流光图的大部分都是黑色的,然后又一条亮线。在采样的时候,最终输出叠加上这张图的采样值,根据时间调整采样UV就可以有流光效果。Shader "Sprite2D/Flash2D"{ Properties { _MainTex("Main Texture", 2D) = "white" {} _FlashTex("Flash Texture",2D) = "white"{} _Flas原创 2021-02-22 12:43:20 · 1027 阅读 · 0 评论 -
U3D粒子特效问题
1.粒子特效如何一直朝向摄像机?在 Renderer Mode 渲染模式里面设置。a.Billboard(面板模式):粒子永远面向摄像机。b.Stretched Billboard:粒子永远面向摄像机,允许粒子缩放。c.Horizontal Billboard:粒子永远面向摄像机,粒子方向是世界x轴。d.Vertical Billboard:粒子永远面向摄像机,粒子方向是世界y轴。e.Mesh:使用3D网格代替纹理渲染,可以旋转等操作。2.粒子特效大小自适应调节 Scaling Mode原创 2021-02-22 12:43:11 · 1224 阅读 · 0 评论 -
U3D屏幕截图
1.全屏幕截图: ScreenCapture.CaptureScreenshot(fileName);2.指定区域Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);screenShot.ReadPixels(rect, 0, 0, true);screenShot.Apply();byte[] bytes = screenShot.Encod原创 2021-02-21 10:17:45 · 82 阅读 · 0 评论 -
Attribute 特性
什么是特性?对程序用的元素进行标注。声明如下:[AttributeUsage(AttributeTargets.All)]public class TestAttribute : Attribute{}常用的 Attribute 如下:1.Condition:条件编译。2.DllImport:该方法在外部DLL中定义。3.Obsolete:标记方法弃用。适用范围:程序集,模块,类型(类、结构、枚举、接口、委托),字段,方法,参数,方法返回值,属性等。用法:主要就是在反射的时候用原创 2021-02-21 10:17:27 · 153 阅读 · 0 评论 -
UGUI 虚拟摇杆
使用Unity源生UGUI做虚拟摇杆。使用Unity三个接口:1.IPointerDownHandler2.IPointerUpHandler3.IDragHandler分别是当按下、抬起、拖拽时候进行的回调。原理:拖动的时候使用通过 PointerEventData 获取当前事件数据。得到 delta 滑动差,设置 anchoredPos 调节坐标(范围检测,不能超出底部的圆)通过事件传出,方向坐标(单位向量)。Unity结构如下图所示:代码如下:public class Joy原创 2021-02-21 10:17:15 · 148 阅读 · 0 评论 -
世界空间如何转换为屏幕空间?
废话不多说: public static Vector3 World2Screen(Vector3 worldpos) { Vector3 result = 你的相机.WorldToViewportPoint(worldpos); result = new Vector3(你屏幕的宽度 * result.x, 你屏幕的高度 * result.y, 0f); return result; }...原创 2021-02-21 10:17:09 · 453 阅读 · 0 评论 -
新手引导系统
新手引导是游戏中必不可少的系统。原理:1.添加一个灰色的遮罩层2.高亮显示引导玩家的内容,比如需要点击的按钮3.显示提示语:“点击此处”要解决的问题:1.统一的触发接口2.统一的引导基类3.符合开闭原则4.按钮如何触发原按钮的点击事件,并触发下一步引导5.如果不是按钮,点击背景触发下一步引导6.遮罩锯齿(直接提到遮罩上,不会有锯齿)7.记录是否已引导过case 1:一个简单引导案例模拟如图所示,只有一个按钮和一张图片。1.引导玩家点击按钮2.高亮图片3.结束引导这是一原创 2021-02-21 10:16:20 · 427 阅读 · 0 评论 -
换装系统之原理剖析
基础传送门Skinned Mesh Renderer:蒙皮网格渲染器当导入有蒙皮的网格时,骨骼蒙皮渲染器会自动添加到加入的网络。需要了解的:Mesh:此渲染器使用的网格。RootBone:动画“根”的骨骼(即所有其他骨骼相对于其移动的骨骼)。Materials:所用材质。换装原理:(使用Unity官方案例说明)1.获取需要换装的每个部位以及SkinnedMeshRendererSkinnedMeshRenderer[] parts = souceTrans.GetComponentsIn原创 2021-02-21 10:15:54 · 366 阅读 · 0 评论 -
U3D网格合并
模型的样貌由 MeshFilter 决定。模型的上色由 MeshRender 决定。网格合并就是指:将零散的几个模型的 MeshFilter 进行合并,得到一个整体的模型。优点:减少Draw Call。代码实现://获取材质MeshRenderer[] meshRenderers = this.GetComponentsInChildren<MeshRenderer>();Material[] mats = new Material[meshRenderers.Length];原创 2021-02-21 10:15:44 · 119 阅读 · 0 评论 -
换装系统之3D模型基础
Mesh 是由顶点信息所组成的集合。渲染就是用这些定点信息,把这些模型绘制出来。如果想添加动画怎么办呢?动画的本质就是对模型顶点集合的一系列变换。但是对于复杂的模型复杂的动作是不可取的。so,变成了 骨骼+蒙皮 的方式。A)骨骼1.Bones,自由度较高。2.Bip,按照人体的骨骼结构规范制作的。复杂的模型一般都混着用,身体结构使用 Bip,对于头发或者裙子使用更自由的Bone骨细化。骨骼在unity里面通常是通过一些 Transform 组合而成的如上图。B)蒙皮单纯有骨骼没有卵原创 2021-02-21 10:15:31 · 164 阅读 · 0 评论 -
U3D圆形图片
Unity里面如何实现圆形图片呢?1.可以使用 Mask 来实现。但是会有额外的 DrawCall ,使用 Mask 明显会增加 4 个 DrawCall 。Mask 本身占 2 个,上下两层各占一个(如果能合批的话)。Mask实现原理:通过 GPU 的 Shader 实现,第一个 DrawCall 是一个在底层模板绘制一个区域的指令,根据 Image 传进来图片的a值,确定裁剪区域。之后 Mask 节点下面的元素会根据这个区域计算Alpha的值,最后一个 Mask 是绘制区域结束的指令。2.自原创 2021-02-21 10:15:08 · 242 阅读 · 0 评论 -
U3D怎么调用Start这种函数的?
都知道Unity的生命周期有一些函数:Awake、Start、Update等等。Unity 是如何调用的呢?在这里进行猜想:1.虚函数的重载但是没有 override关键字。2.反射mono支持对函数名进行字符串获取,获取到这些函数名之后,进行反射调用。也就是说继承 MonoBehavior 类之后,Unity都会统计内部的函数,执行一次遍历反射回调。...原创 2021-02-21 10:14:56 · 468 阅读 · 0 评论 -
U3D生命周期
官方文档:传送门主要流程:1.编辑器(在编辑器下调用):Reset:用户点击 Inspector 面板的 Reset 或者首次添加该组件被调用。2.初始化:Awake:仅被调用一次,不同物体的 Awake 被随机顺序调用。OnEnable:当对象被激活就调用。Start3.物理系统FixedUpdate:固定帧。处理刚体时,需要使用它。yield WaitForFixedUpdateInternal Physics updateOnTriggerXXXOnCollisionXXX原创 2021-02-20 10:24:08 · 195 阅读 · 0 评论 -
单例模式
1.如果是普通单例模式私有构造函数的条件public class Singleton<T> where T : class{ private static T instance; public static T Instance { get { if (instance == null) { var ctors = typeof(T).GetConstru原创 2021-02-20 10:23:46 · 70 阅读 · 0 评论 -
Entitas 初级
Entitas 实现 点击创建物体在屏幕上面1.创建四个 Component每个 Componet 都是只包含自身的数据。[Game]public class TransformComponent : IComponent //使用Gameobject 也行{ public Transform transform;}[Game]public class PositionComponent : IComponent{ public Vector2 position;}[G原创 2021-02-20 10:23:38 · 96 阅读 · 0 评论 -
扩展类
扩展类是一种静态的一种类的调用方法,通过实例化进行调用。利用this进行指正该类,有参数的时候直接在后面追加参数。在游戏内可以预定义一些常用的扩展类:1.Colorpublic static class ColorExtension{ public static Color HtmlStringToColor(this string htmlString) { Color retColor; var parseSucceed = ColorUtili原创 2021-02-20 10:23:13 · 473 阅读 · 0 评论 -
Entitas 入门
####使用 Entitas 实现 Hello World!Entitas的Github地址:传送门下载后导入工程,点击Tools菜单栏打开设置:实现 Hellow World 正常的代码:public class NormalHellowWorld : MonoBehaviour{ public string message = "Hello World"; void Start() { Debug.Log(this.message); }}原创 2021-02-20 10:22:55 · 200 阅读 · 0 评论 -
Entitas 初级
####Entitas 实现 点击创建物体在屏幕上面1.创建四个 Component每个 Componet 都是只包含自身的数据。[Game]public class TransformComponent : IComponent //使用Gameobject 也行{ public Transform transform;}[Game]public class PositionComponent : IComponent{ public Vector2 position;原创 2021-02-20 10:22:46 · 78 阅读 · 0 评论 -
什么是ECS?
全称:Entity Component System一种新的模式(类似MVC是一种思想),取代 GameObject / Component 的模式。流程:游戏内每个基本单元都是一个实体。每个实体由多个组件构成。每个组件仅包含其所需要的数据。通过系统来处理多个组件。优点:1.逻辑都在System里,指责单一,修改方便。2.容易扩展,新增Entity后,可以共享现有的System。3.各层之间耦合度低。4.效率高,面向数据的设计 , 很容易并行高速处理。几个基本概念:1.Entity原创 2021-02-20 10:22:38 · 337 阅读 · 0 评论 -
Unity 的 layer 有啥用?
目前感觉:主要给 物理碰撞 或者 渲染 减负的比如:1.碰撞的参数 最后一个就是layer 这样只检测特定layer 的碰撞,这就是减轻计算量。2.再比如相机的渲染层的参数原创 2021-02-20 10:22:13 · 358 阅读 · 0 评论 -
UI 设计中的MVC、MVP、MVVM
什么是MVC?分为:Model、View、Controller。交互流程:View 发起 Controller , Controller 更新 Model 后 刷新 View;View 可以直接访问 Model。缺点:Controller 不可复用。什么是MVP?多了一层 Presenter ,对 Model 和 View 解耦。View 发出给 Presenter 事件,Presenter 更新后 Model 刷新 View。大部分实现的框架都是 MVP 的。什么是MVVM?Mod原创 2021-02-20 10:23:59 · 346 阅读 · 0 评论 -
Coroutine 协程
协程的关键字是 IEnumerator这是迭代器的意思,那么什么是迭代器?先请看下面的代码:定义一个Test类,实现IEnumerable接口: class Test : IEnumerable<string> { public IEnumerator<string> GetEnumerator() { for (int i = 0; i < 5; i++) {原创 2021-02-19 10:29:17 · 165 阅读 · 2 评论 -
记录下I18N是啥
导入xlua之后,打包成功但是运行不了,报错是没有这个 I18N来自百度百科:i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改变就能够适应不同的语言和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 在全球化的时代,国际化尤为重要,因为产品的潜在用户可能来自世界的各个角落。通常与i18n相关的还有L10n(“本地原创 2021-02-19 10:26:58 · 269 阅读 · 0 评论 -
Http通信
Unity使用Http很常见。原生提供的WWW功能不多,也不支持超时检测。后来有UnityWebRequest,可以设置timeout,通过isNetworkError判断是否成功怎么断点续传对于大的文件,采取变读取变生成对应文件。Stream方式下载的时候现根据读取的内容生成一个临时文件,当全部下载完成后,才将这个临时文件转换成正式的文件名若中途中断下载,已经下载好的那部分文件也存在于对应目录下下次下载直接在上次下载的临时文件后添加内容短链接:建立数据-数据传输-关闭连接,建立连接-数据原创 2021-02-20 10:23:24 · 80 阅读 · 0 评论 -
U3D脚本系统
这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~游戏常用的脚本系统是Lua什么是脚本?C#脚本并不属于脚本脚本指的是:使用方式与字节码(ByteCode)类似,是在运行时通过虚拟机系统(Virtual Machine)来载入文件,动态更改逻辑影响游戏行为一条命令被可优化的底层操作定义一系列这样的命令被编码成字节流虚拟机通过中间层依次执行命令优点:可以灵活的定义行为,动态改变逻辑缺点:需要VM的支持,这种模式的效率不可能太高从本质讲:把行为控制从编码层转向了数据层逻辑与行原创 2021-02-19 00:21:42 · 159 阅读 · 0 评论 -
U3D同步
#####这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~目前游戏大体分为两个类别。1.MO(Multiplayer Online)少量玩家一起的竞技游戏2.MMO(Massively Multiplayer Online)期望大量玩家进行长期的社交性游戏MMO里面的小副本也可以以MO的方式实现,技术并没有冲突通信方式有什么?1.C/S架构客户端与服务器连接的消息传递方式所有消息都是由服务器进行转发优点:1.服务器知道一切,可以控制非法行为2.客户端只做表现,完全由服务器的原创 2021-02-18 00:16:27 · 192 阅读 · 1 评论 -
U3D动画
#####这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~编写战斗系统,需要处理动画事件1.模型里的 Animation 中有个Events标签,可以添加函数名进行回调缺点:依赖于动画2.基于时间的事件记录的是基于局部时间线的偏移值,以独立文件的方式存储动画开始后,根据时间线进行事件的回调触发完全把显示与逻辑分离好处是:1.有的同屏多人游戏,有时会有不播放角色动画,只触发技能的需求,很容易实现2.异步数据影响的场景中,可以预先做逻辑计算,数据优先于动画同步,降低网络延迟如果基于原创 2021-02-18 00:15:00 · 161 阅读 · 1 评论 -
U3D时间
#####这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~游戏里的时间会经常用到,比如:人物移动,延迟伤害等如果一台机器掉帧了,帧率会处于波动状态,需要防止出现与标准帧率不一致的情况1.真实时间线代表绝对的时间流逝,是一切时间的参考不同的设备中得到的结果一定是相同的对应Unity的:Time.realtimeSinceStartup2.游戏时间线当游戏暂停时,游戏时间应该停止回访战斗录像时候,希望游戏时间快于真实时间做动作游戏中,还需要控制时间速率忽快忽慢也可以停止游戏,查看场原创 2021-02-18 00:14:30 · 165 阅读 · 0 评论 -
游戏循环
#####这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~游戏循环由三部分组成:1.非阻塞的用户输入2.更新游戏逻辑状态3.渲染游戏画面while(true){ Input(); Update(); Render();}每次循环完成后,会更新一次画面的绘制,这个过程也叫做帧(Frame)帧率(FPS)是标定游戏循环的速率与真实时间的映射关系。(越小越卡)一般来说:PC上60/秒,手机上30/秒帧数的倒数就是每帧所占用的时长,单位通常为毫秒什么会影响帧原创 2021-02-18 00:13:56 · 241 阅读 · 0 评论 -
UI事件绑定模式(不靠谱)
#####这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~(不过这个感觉不靠谱啊。。。)UGUI如何绑定事件响应?1.Inspector界面添加好处:可以随资源热更坏处:容易变更,不确定2.代码中添加好处:程序员都喜欢的方式插入:DRY原则:Dont Repeat YourselfDavidWheeler说:计算机任何领域的任何问题都可以通过增加一个间接的中间层来解决思路:创建一个容器类,自动将可响应事件的子节点找到,并为其添加监听。可通过 index 或者 gameob原创 2021-02-18 00:13:40 · 113 阅读 · 0 评论