![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
unity游戏开发
莫之
不努力奔跑,怎么能停在原地
展开
-
Unity 查找各种丢失的引用
usingUnityEngine;usingUnityEditor;usingSystem.Text.RegularExpressions;usingSystem.IO;usingSystem.Collections.Generic;publicclassArtPrefabAutoConfigurer:AssetPostprocessor{staticvoidOnPostprocessAllAssets(string[]importedAs...原创 2020-08-14 17:27:29 · 2566 阅读 · 0 评论 -
Unity编辑器小提示和小技巧
概述这篇文章主要是总结了Unity编辑器使用的一些技巧,通过掌握这些技巧来提高开发效率;其中一部分编辑器功能是在2019版本以后被引入的。主要参考来自:https://unity.cn/projects/unity-tips快捷键Unity提供了Shortcut Manager快捷键管理器,可以在Edit>Shortcuts中查看快捷键:https://docs.unity3d.com/Manual/ShortcutsManager.html编辑器使用1.编辑器着色原创 2020-06-27 21:29:52 · 1100 阅读 · 0 评论 -
Unity IL代码注入(基础)
一、什么是代码注入C#程序编译生成中间代码IL,为了实现问题修复和一些通用功能扩展,通常所使用的就是代码注入。xlua的热修复方案即采用了代码注入的方式,没有污染C#代码,也不需要提前埋点,十分方便。再比如这篇文章讲述了使用代码注入来做一些工具,:自动注入代码统计每个函数的执行效率以及内存分配方案代码注入需要借助一个注入工具,就是Mono.Cecil开发包,它可以让我们对编译好的程序集进行IL代码注入。http://www.mono-project.com/docs/tools+li原创 2020-06-25 14:30:07 · 2632 阅读 · 0 评论 -
游戏设计模式——面向数据编程(转)
作者:KillerAery出处:http://www.cnblogs.com/KillerAery/随着软件需求的日益复杂发展,远古时期面的向过程编程思想才渐渐萌生了面向对象编程思想。当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象,热衷于研究如何更加优雅地抽象出对象。然而现代开发中渐渐发现面向对象编程层层抽象造成臃肿,导致运行效率降低,而这是性能要求高的游戏编程领域不想看到的。于是现代游戏编程中,面向数据编程的思想越来越被接受(例如Unity2018更新的ECS框架就是.转载 2020-06-02 20:14:25 · 2985 阅读 · 0 评论 -
游戏中的帧同步概念
帧同步相关的概念和联系游戏中的同步方式有两种:帧同步和渲染同步;帧同步,介绍帧同步之前首先确定帧的概念,在游戏中有两种帧,逻辑帧和渲染帧(表现帧),逻辑帧和渲染帧的分离就是业务逻辑(数据)和表现的分离,通常大多数游戏都是混在一起的;而帧同步的实现方式,客户端发送游戏数据(输入)到服务器,服务器广播分发所有客户端的操作,然后客户端根据数据来做逻辑处理;状态同步,客户端发送数据到服务器,服务器根据数据做完逻辑处理以后将结果广播分发到客户端;所以两者的主要区别在于客户端和服务器谁来做游戏逻辑的原创 2020-06-01 11:41:25 · 2288 阅读 · 0 评论 -
Unity统计文件夹下某种类型的资源数量
功能:统计文件夹下某类型所有资源的数量,包括子文件夹;用法:指定文件夹路径,并通过输入文件的后缀名代表文件类型(不需要加.符号)using UnityEngine;using UnityEditor;using System.IO;public class AssetCountWindow : EditorWindow{ public string assetFol...原创 2020-04-07 16:04:14 · 1680 阅读 · 1 评论 -
Unity中制作角色血条
一、制作原理我们希望在一个模型的头顶放置一个UI,但是我们不可能直接挂一个UI在上面;因为我们的UI需要用一个单独的相机而非模型的相机来渲染,所以如果直接在模型的GameObject下直接挂一个子物体,渲染出来的结果肯定不对;明白这一点后,我们就需要找到如果想要渲染到模型的顶部,我们得到一个UI的世界坐标使其在渲染到屏幕空间后,正好位于模型顶部;设UI的世界坐标Pos1,其计算方式为,首...原创 2020-03-08 02:02:13 · 1750 阅读 · 0 评论 -
Unity中的多相机渲染
在unity使用多个相机-及其重要性参考:在unity使用多个相机-及其重要性;一帧的渲染中,可以有很多个相机进行渲染,相机渲染的物体由视锥体以及层级遮罩等决定,相机渲染的顺序由相机的深度及其加载到场景中的顺序决定;每个场景渲染的结果都是保存到硬件的缓冲区中的,它们共用一个缓冲区,所以每次开始渲染前都要设置对之前缓冲区中的数据如何处理,一帧的渲染结果由所有相机的处理结果所决定;下面多相...原创 2020-03-05 23:02:30 · 5206 阅读 · 0 评论 -
Unity内存优化之了解unity自动内存管理
一、认识Unity的自动内存管理Unity为我们做了一些自动的内存管理操作,但是我们也需要遵守一些规范才能让这种机制更好的发挥作用,所以我们需要了解一下unity自动内存管理究竟做了什么;我们知道当一个Object,字符串或数组被创建时,计算机会在堆中为其分配内存;但它不在使用的时候,内存就会被回收;在之前都是由开发者分配和释放堆内存,但是运行时runtime system如Unity的M...原创 2020-07-03 13:38:10 · 469 阅读 · 0 评论 -
Unity3d:LuaPanda+xlua调试
一、LuaPanda介绍LuaPanda是腾讯开源的一款用于vscode的Lua代码工具,类似于vscode中的luaide,不过luaide是收费的,而luapanda是开源的,而且luapanda还补充了一些luaide没有支持到的功能;LuaPanda中已经给出了比较详细的教程,这里主要是总结归纳一下自己在第一次配置时遇到的一些问题,希望对大家能够有所帮助;这里先贴出lua官方的...原创 2020-01-17 12:35:24 · 8400 阅读 · 0 评论 -
Unity drawcall批处理
一、我们为什么要做DrawCall批处理什么是drawcall,当我们需要绘制一个物体时,就需要调用底层的图形接口,如OpenGL,DX等;也就是在CPU收集完物体的数据信息后向GPU发起调用的一个过程,过多的drawcall就会造成CPU的性能瓶颈;Unity提供了两种技术来处理动态批处理:对足够小的网格,它在CPU层自动转换它们的坐标,将许多顶点组织到一起然后一次绘制; 静态批处...原创 2020-01-18 15:33:18 · 1215 阅读 · 0 评论 -
UnityEngine.Object和System.Object的区别与问题归纳
一、UnityEngine.Object和System.ObjectC#中有一句经典,所有的对象都是从Object派生而来的,UnityEngine.Object也是从System.Object派生而来;但是两者也有很大的差异,首先是在创建的时候UnityEngine.Object obj=new UnityEngine.Object();if(obj==null){ } //不...原创 2020-01-13 10:59:18 · 2767 阅读 · 0 评论 -
C#扩展方法
一、简单认识扩展方法Extension Methods当我们需要扩展现有类型时,我们通常需要创建一个新类型继承自父类来完成,但是扩展方法可以让我们向现有的类型中添加一些方法,达到扩展的目的;扩展方法时一个特殊类型的静态方法,但是它们会像扩展类型的实例方法一样被调用;在unity中,我们通常会根据项目需要为GameObject以及各种组件做出自己需要的扩展;二、如何实现和调用一个自定...原创 2020-01-10 12:51:08 · 144 阅读 · 0 评论 -
Unity Animation 动画相关总结
一、Animator窗口1.动画渐变CrossFade是按照动画的自身时间进行混合。如果动画10秒,混合持续时间0.2,会在2秒后混合完成CrossFadeInFixedTime是按照实际时间进行混合。如果动画10秒,混合持续时间0.2,会在0.2秒后混合完成使用CrossFade或CrossFadeInFixedTime混合时,如果混合时间大于动画自身长度,动画自身会被滞留在最后一...原创 2020-01-05 19:42:57 · 2945 阅读 · 0 评论 -
Unity PBR基础知识与实践
一、认识PBRPBR&PBS,即基于物理的渲染,它对光和材质之间的行为进行更加真实的建模,也就是基于一些物理模型而不是经验模型;Unity为我们提供了很好的封装,以至于我们不需要自己实现一套PBR渲染框架也可以实现一些PBR效果(但是这种只局限于学习研究而非生产环境),如果应用到项目中,能针对项目需要实现专门的PBR框架是很有必要的;...原创 2020-09-12 20:53:48 · 5408 阅读 · 0 评论 -
Unity Log工具扩展-控制日志颜色与格式化输出
前言:在Unity提供的Log中,我们很多时候只能看到三种,log,warning,error;当我们在项目中需要输出太多log时,找到自己想要的log信息往往会浪费掉我们一些时间,而这些时间确实可以通过工具来解决;就像那句经典名言,计算机科学中的任何问题都可以通过添加一个中间层来解决,我们就根据自己的需要在Unity的log接口和其它接口上提供一层封装;一、控制颜色的输出Unit...原创 2019-12-05 10:09:23 · 2421 阅读 · 0 评论 -
Unity Shader 变体处理与预加载流程
一、优化Shader加载时间1.优化shader加载时间Shader程序是需要在GPU中的,将其从磁盘加载到显存中当然需要一些时间,单个的GPU程序一般不会花费太多的加载时间,但是一个Shader通常会有大量的变体,也就是一个Shader可能会有很多个GPU程序,从而引起了加载时间过长的问题;举个Standard Shader的例子,如果它被完全编译,该Shader将会生成上千个有细微...原创 2020-04-07 15:02:43 · 8451 阅读 · 0 评论 -
Unity CommandBuffer
一、介绍CommandBuffer是Unity提供用于扩展内置渲染管线的,Unity可以让我们扩展性地在一些指定的渲染节点上做一些自定义的操作,这些自定义的操作命令就是放置在CommandBuffer中的,而这些特殊的渲染节点放置在CameraEvent.enum中进行,这些可扩展的节点主要就是各个渲染过程的衔接点;二、抓取屏幕内容GetTemporaryRT/ReleaseTempo...原创 2019-11-06 01:42:51 · 672 阅读 · 0 评论 -
GPU Instancing
一、介绍使用GPU实例化能够在使用很小的DrawCall情况下一次性渲染多个相同网格,它主要用于绘制建筑、树木、草或者一些在场景中重复出现的东西;GPU实例化仅仅能够在每次drawcall中渲染相同的网格,但是每个实例可以有一些不同的参数如color、scale等,它的主要作用在于绘制相同物体时减少drawcall的数量从而提升渲染性能;(可使用Game窗口的Stat数据观察不同,更多内容...原创 2019-11-04 11:37:59 · 523 阅读 · 0 评论 -
引擎的资产管道与资源管理器
游戏引擎需要读取大量数据,数据形式包括游戏资产、配置文件、脚本等;资产管道将描述数据如何从制作原始资产的工具一直流到游戏引擎本身; 资产管道的第一环:游戏本质是多媒体应用,所以游戏引擎的输入数据形式非常广泛,所有源数据都是使用数字内容制作(digital content creation)DCC软件制作;DCC软件都是为制作某一类数据而设,而且都会有其特有的数据格式,这些数据并不会直接用于游...原创 2019-11-02 17:47:33 · 488 阅读 · 0 评论 -
游戏引擎的动画系统及骨骼动画原理
三维模型/网格数据 三维模型通常在DCC工具如Max、Maya中制作,必须编写相应的导出器Exporter获取数据并存储为引擎可读的格式才行;DCC软件会提供一些标准或半标准的导出格式,比如导出为FBX格式,但是这些格式基本上都不完全适合游戏使用(要明白游戏运行的CPU以及内存资源都是很宝贵的),所以往往要建立自定义格式以及编写专门的导出器,或者在资源导入时创建专门的导入器(Importer...原创 2019-11-02 15:37:39 · 1716 阅读 · 0 评论 -
Unity工程结构与编辑器背后的工作-Behind The Editor
本文介绍的工程结构为Unity工程的结构而非Assets下各种不同的文件夹,基于Unity+VS,总结如何对工程进行版本控制,同时会讲述在资源导入时编辑器(引擎的资源系统)在背后的一些工作;另外,本文主要来自于各种网站资源以及书籍资料的总结,文末会备注出处;一、工程结构主要介绍一下四个文件夹:Assets、ProjectSettings、Library、Temp/Obj;主要是因为这几个文...原创 2019-11-02 15:37:53 · 263 阅读 · 0 评论 -
Unity 序列化类型总结
主要内容介绍unity常用的与序列化相关的属性,总结一下unity的序列化系统一、SerializeFieldunity在序列化脚本时,它只会序列化公有字段,如果想要序列化私有字段,就需要为该字段添加SerializeField特性,该特性用于强制序列化私有字段;序列化的目的是为了进行本地存储,unity将会序列化所有的脚本化组件然后从序列化版本中重新创建脚本组件;unity的序列...原创 2019-11-04 18:54:39 · 2560 阅读 · 0 评论 -
OpenGL与显卡驱动
一、OpenGL是什么在开始这段旅程之前我们先了解一下OpenGL到底是什么。一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。如果没有图形编程接口,我们要访问GPU,就需...原创 2019-08-11 14:38:34 · 13031 阅读 · 0 评论 -
unity .meta文件
Behind the Scenes.meta文件中包含了两项重要的部分,guid和资源的import settings;要理解.meta文件,就要明白它是何时生成的和如何生成的,具体可参考官方手册:Behind the Scenes,它讲述了unity背后做了什么;一、GUID资源导入时,unity会自动为该资源生成一个guid(Global Unique Identifier);...原创 2019-08-14 18:58:32 · 1383 阅读 · 0 评论 -
Unity编辑器扩展
前言:该文章主要介绍unity的几个扩展属性一、ContextMenu上下文菜单属性主要是为了给上下文菜单添加一些命令,而且是给脚本组件添加的上下文菜单。(最后遇到MenuItem组件,也可以添加一些组件的上下文菜单,不过那个主要为内置组件添加(也可以为当前已有的脚本组件添加),而ContextMenu是为当前脚本组件添加)示例代码:新建了一个menu脚本文件,然后添加如下代码,...原创 2019-07-23 09:46:46 · 185 阅读 · 0 评论 -
Unity MenuItem属性
一、基本功能介绍MenuItem是UnityEditor下的属性,它是对编辑器的扩展,主要有两大作用:第一,在主菜单中添加菜单项,也就是在以下编辑器部分添加,这是一个很重要的用途,在开发插件的时候经常用到。示例代码如下: [MenuItem("MyMenu/LookCamera")] static void LookCamera() { ...原创 2019-07-23 01:11:30 · 2032 阅读 · 0 评论 -
关闭深度测试的渲染规则
一、问题提出这是一个立方体在关闭了剔除(Unity背面剔除)和深度写入后的呈现效果,由于关闭了深度测试后不用再比较深度信息,所以就不清楚颜色信息到底是如何进行处理的。二、基元的绘制顺序每一个立方体有多个面,每个面的片元绘制顺序是由该面的顶点数据在几何模型中的顺序决定的,也就是在渲染管线中的几何阶段准备顶点数据传入GPU时,会有一个图元的顺序,比如一个立方体有12个三角形,就要依次准...原创 2019-07-25 12:18:07 · 1524 阅读 · 0 评论 -
unity中的值类型和引用类型
一、值类型和引用类型概念值(value)类型 :Unity中的vector3、quaternion是structs,它们是值。引用(feference)类型 :Unity中的transform、gameobject是类类型,所以它们是引用。引用类型是对数据存储位置的引用,引用类型指向的内存区域称为堆。在决定定义引用类型还是值类型时,关键因素是:如果逻辑上是固定大小不可变的值,就考虑定义...原创 2019-08-14 16:32:53 · 7589 阅读 · 4 评论 -
Unity Shader屏幕特效基础OnRenderImage()函数
前言:unity shader中的pass是会顺序执行的,但是由于在图像处理中我们常常需要使用一个pass的处理结果作为另一个pass的输入,这个时候就需要用到OnRenderImage()函数了。一、函数介绍MonoBehaviour.OnRenderImage(RenderTexture source,RenderTexture destination)官方描述Descrip...原创 2019-01-11 16:34:13 · 18046 阅读 · 2 评论 -
Unity LOD多细节层次---两种使用方式
前言:LOD在unity优化中是很重要的一个技术,这里根据自己的学习做一个简单总结。一、什么是LOD细节层次,level of detail,它就是一个数值,随着物体或者模型远离观察者而逐步降低。它能够通过减少多边形的数目从而提升渲染的效率,但是恰恰又由于物体距离很远,所以理论上观察者不会感觉到模型和物体的视觉质量会有所下降。至于为什么一个简单的数值它能够减少多边形的数目呢,它其实就是...原创 2018-12-23 11:32:17 · 4490 阅读 · 0 评论 -
Unity 3D 从渲染管线的角度分析分辨率对渲染结果的影响
本文着重分析的是unity把场景渲染到一张Render Texture上,但是为什么texture的大小也就是分辨率不同,会给人一种不同的清晰度的效果。根据我们日常了解的,肯定是高分辨率的图片就更加清晰,低分辨率的就不清晰,这里要讨论的就是为什么造成这种结果,也就是从渲染管线里探究到底是哪些部分影响了最终的结果。首先,你需要对3D渲染管线里的知识有一定的了解,不了解的需要先看一下这篇文章,...原创 2018-12-23 01:03:12 · 1158 阅读 · 0 评论 -
unity 内容小结--适合入门
在学习unity的过程中,为了更好的理解和复习已经学过的内容,我把一些知识写了下来,从自己理解的角度做了一点笔记和归档,并将其放在github上,都是比较简单基础的内容,希望能够对想要unity入门的朋友有些帮助。https://github.com/zhimo1997/UnityReport...原创 2018-09-25 09:38:10 · 185 阅读 · 0 评论 -
unity 汽车的音效控制
1.关于unity中的Audio相关的组件这里就不作介绍了,本文主要讲述个人对汽车的音效控制的一些思路。汽车的声音还是蛮复杂的,包括了加速、减速、刹车、碰撞等等。我的思路就是根据汽车的当前的行驶速度和驱动力来为汽车划分为多个行驶状态,然后对于每个行驶状态,根据行驶速度和驱动力的大小来完善声音的细节,例如:驱动力增大以后,声音的音量加大。2.实现细节 public enum C...原创 2018-07-20 10:46:47 · 2360 阅读 · 1 评论 -
NGUI ScrollView 滚动视图
一、制作滚动视图控件滚动视图控件由两部分组成:滚动条和滚动视图组成,由滚动条控制滚动视图滚动(其实也可以通过拖动视图滚动);滚动视图的原理就是要设置一个可显示的窗口区域,然后将内容滚动出现在该视图中以此显示所有内容;1.首先是滚动条滚动条的核心组件是UI ScrollBar,如下图,它继承自UI Slider,滚动条包含了背景和前景精灵,其中前景精灵要添加box collider以...原创 2019-08-11 21:25:22 · 664 阅读 · 0 评论 -
Unity查找游戏对象及组件
一、访问游戏对象自身的游戏组件 GetComponent<T>(); //T为组件名称 GetComponents<T>(); transform.Translate(1,0,0) 和 GetComponent<Transform>().Translate(1,0,0) 是一样的 脚本挂载到游戏对象上以后就是组件,即脚本组件; H...原创 2019-08-11 21:31:04 · 4117 阅读 · 0 评论 -
Unity Transform类
1.SetSiblingIndex用于设置一个物体在其父物体下的索引,根据该索引值来排列一个物体下所有child节点的位置(这些节点拥有同一个direct parent),是孩子节点,不是子节点;注意:改变该值时,层级视图中的位置也会发生改变,在UI的布局中常常会用到;2.支持foreach遍历Transform支持Enumerator,它实现了IEnumerableInterfac...原创 2020-01-15 11:21:42 · 487 阅读 · 0 评论 -
Unity快速清空控制台&UnityEditor程序集
定义一个快捷键来清除控制台利用反射来完成,using System.Reflection;using System;using UnityEditor;public static class MyWindowLayout{ [MenuItem("MyTools/ClearConsole _c", false, 1)] public static void Cl...原创 2019-09-06 12:44:56 · 1256 阅读 · 0 评论 -
认识 Unity C# Job System
一、认识Job SystemUnity C# Job System是用于写多线程代码的,使用多线程能够带来高性能,提高code generation的质量,减少移动设备的耗电量等;二、什么是多线程单线程:多线程:线程池:...原创 2020-06-29 23:46:13 · 732 阅读 · 0 评论 -
C# 自动内存管理
一、垃圾回收VES内置了垃圾回收支持,垃圾回收器只负责内存管理,它没有提供一个自动的系统来管理与内存无关的资源。.NET的垃圾回收多数CLI实现使用一个分代的(generational)、支持压缩的(compacting)、以及基于mark-and-sweep(标记并清除)的算法回收内存。分代的:是因为只存活过短暂时间的对象与已经在垃圾回收时活下来的对象(原因是对象仍在使用)相比,前者会...原创 2019-09-01 17:45:20 · 491 阅读 · 0 评论