Shader
Shader着色器 - Unity 手册 (unity3d.com)
Shader(着色器)是一段渲染管线运行的小程序,它负责告诉GPU如何渲染图形。在游戏开发中,CPU一直是瓶颈,所以有些计算完全可以通过Shader放在GPU中来做。例如,UV动画,如果在CPU上做,需要每一帧向GPU传递移动的范围;如果直接在GPU中处理,就不需要传递数据这部分开销了,直接在Shader中通过时间函数来移动即可。类似的需求其实还有很多,比如水流、岩浆、天气、雾和溶解等效果都可以在Shader中完成。
在Unity中可以创建5种不同的Shader(基于Unity2021),除了Compute Shader以外,其余的Shader都属于可编程渲染管线以及Shader Variant Collection(着色器变体采集)
固定渲染管线固定渲染管线是OpenGL ES 1.0所使用的渲染管线,属于最古老的一种渲染管线,无法自由灵活地控制渲染的每个片段,它只是提供了一些渲染功能的开关项,这就好比工厂生成零件的部分,相同模具生产的零件部分是完全一样的,只能选择是否生产这部分零件。例如,控制渲染管线打开漫反射 ...
List.Sort自定义排序附Unity应用
自定义List.Sort排序方式,以实现多参数,多规则的复杂排序
默认排序方法123456//升序排序,如果是字符串,则按第一个字母升序(中文拼音第一个字母)List.Sort();//反转排序List.Reverse();//从第二个元素开始,反转4个元素List.Reverse(1,4);
自定义排序的四种方法1234List<T>.Sort;List<T>.Sort(IComparer<T> Comparer);List<T>.Sort(int index,int count,IComparer<T> Comparer);List<T>.Sort(Comparison<T> comparison);
例子
假设存在一个People类,包含Name、Age属性,在客户端中创建List保存多个实例,希望对List中的内容根据Name和Age参数进行排序,排序规则为,先按姓名升序排序,如果姓名相同再按年龄的升序排序。
1234567891011121314151617181920class Pe ...
自动构建图集与压缩
为了降低DrawCall,我们需要将多个图片构建在图集上。构建图集可以自动将图片补齐2的幂次方或者正方形图,这样就可以进行ETC(安卓)和PVRTC(苹果)的压缩了,PC主机设备一般使用Unity默认DXT压缩。
随着移动平台更新迭代,最新的贴图推荐压缩方式是ASTC
关于图片压缩的文章
Unity中图像设置与常用压缩算法
unity贴图压缩浅析
UI图集的压缩Sprite Packer 在 Unity 2020.1 及更高版本中已弃用,并且将不再作为 Sprite Packer 模式的选项提供。已经使用 Sprite Packer 的现有项目仍然可以继续使用它,但是在 2020.1 之后创建的任何新项目都将默认使用 Sprite Atlas 打包纹理。
如果是UI图片,设置了相同PackingTag的Sprite会合并在一个图集,游戏中有一些图,比如说背景图或者大头像图,由于它们本身可能不是2的幂次方或者正方形图,所以我们可以自动给它们设置成唯一的PackingTag,这样它们也可以进行压缩了。
需要注意的是,某些大图因为需要设置成了RGBA32或者RGBA16,并且本身不是2的幂次 ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
自动打包
Unity编辑器提供了手动打包的功能,但还是很麻烦。每次策划人员需要游戏包了,都要过来找程序员打包。为了方便,可以考虑让策划人员来打包,或者每天凌晨自动打包。但是打包也不是那么容易的,通常需要在打包前后自动执行一些特殊代码,例如Logo、图标、编译选项、复制和第三方库的依赖等。
打包前后事件打包时,我们需要监听一些事件,比如打包前设置版本号、游戏名和图标等,打包后可能需要复制或者压缩游戏包等
我们可以监听打包前和打包后的事件:
12345678910111213141516171819202122using UnityEngine;using UnityEditor;using UnityEditor.Build;public class ListeningBuildingEvents : IPreprocessBuildWithReport, IPostprocessBuildWithReport{ int IOrderedCallback.callbackOrder{ get{ return 0;//返回回调的 ...
配置错误
在游戏开发中,常见的经典错误如下:
策划人员把表配错了,程序运行报错。
美术人员制作的模型缺少规定的挂载点,或者起名不规范,程序运行后,找不到就报错了。
想要彻底解决这类问题,需要给美术或策划人员提供资源检查工具
主动检查工具程序人员开发一套工具来检查资源的规范性,策划人员或者美术人员在需要提交资源之前,运行此工具,如果资源不符合规范,就会输出错误日志,接着修改好后再重复检查,直到没问题后再提交资源。
被动检查工具被动检查工具就是依赖Unity监听资源导入事件、程序来动态分析资源的合理性。这种检查方法比主动检查工具更安全了,因为资源只要拖入就会自动检查,不需要使用者主动操作,这样就不会有遗漏检查的情况。
导出类检查工具无论是主动检查还是被动检查,其实最核心的问题是,策划人员和美术人员可以跳过检查直接提交SVN。理论上,各种资源都可能被提交。所以要想彻底解决这个问题,程序员就不能直接使用他们提交的资源,而采取间接使用的方式。
程序提供一个导出工具,即根据美术资源来自动生成一个新资源(程序用的资源),导出的同时做资源检查,如果资源不符合规范,那么提示错误并且不生成新资源。因为程序使用的 ...
资源导入
游戏中的资源是海量的,这就带来了新的问题,大量的资源格式需要设置,比如贴图格式、模型格式、音频格式和文件格式等。我们需要结合自动化来管理资源。另外,游戏打包这一步也需要自动化。例如,每次打包前,需要对包体做一些修改,如果全都手动操作,就非常麻烦了。这一章学习Unity自动化接口。
资源导入在Unity中导入资源后,都可以通过设置参数来直接修改它的格式,而引擎会重新压缩资源。游戏中的大量资源都是美术人员或者策划人员导入的,这个过程很容易设置成错误的资源类型,或者由于没有设置成默认的效率不高的资源类型。为了避免出现这种低级错误,我们要做的就是帮他们手动设置。
监听导入事件资源导入后,Unity会根据设置信息自动压缩。而导入事件又分两种:压缩前的时间和压缩后的事件。如果需要修改导入参数,那么就可以监听压缩前的事件来修改它,后面就会自动执行导入操作了。如果想等导入结束后生成点什么对象,可以监听导入后事件。
继承AssetPostprocessor后,就可以监听它们的事件了
相关参考,拓展编辑器一监听资源事件:Unity游戏开发拓展编辑器1
123456789101112131415161 ...
资源管理实例
特殊内置的文件夹特殊文件夹名称 - Unity 手册 (unity3d.com)
Assets文件夹:游戏资源的顶层文件夹。AssetDataBase方法可以访问里面的任意资源。注意AssetDataBase连Packages文件夹也能访问,所以其中的一些函数需要将Assets文件夹作为路径名的一部分添加。
Editor文件夹:编辑模式下的代码需要放在这里。可以有多个。Editor文件夹中的Resources文件夹内容会被EditorUtility.Load函数来加载。打包以后,会自动剥离它。
Editor Default Resources文件夹:编辑器资源文件夹,可以被EditorUtility.Load函数来加载,编辑模式下的编辑器需要的资源尽可能放在这里。此文件夹只能有一个,且必须放在项目的根目录(Assets文件夹)中,可以在其中有子文件夹,在EditorUtility.Load函数中调用时明确其路径即可。
Gizmos文件夹:Gizmos是一个拓展Scene视图的类,注意它和Debug.DrawLine等Debug类的区别,在Gizmos文件夹中可以放置一些图标,这 ...
优化工具
Unity Profiler可以查看每一帧游戏的渲染、加载和内存,并且它可以精确到耗时资源本身。
Frame Debugger工具用来查看渲染DrawCall顺序,进一步查出为什么DrawCall没有合并。
重复无用资源在游戏开发过程中,经常会换UI、模型和资源等,时间长了就会积累出很多无用的资源,其中有些资源已经废弃了但还被用着,或者资源发生了重复,重复的资源还分别被有些对象所依赖。所以需要做一个工具来自动找出这些不合理的资源,统一处理掉。
我们新建两个材质,这些材质都引用相同的贴图,但是我们把贴图复制成了两份,两个材质分别引用其中一份。
我们新建两个Cube的Prefab,这两个Cube分别引用了其中一份材质,将这两个Prefab都放在Resources文件夹下
新建CheckRepetitive脚本
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647using System.Collections;using System.Collections.Gener ...
游戏对象
GameObject是一个壳子,它关联着所有资源以及组件的引用。GameObject也有自己的一套资源管理方式,Unity提供了丰富的接口来操作它。下面我们逐一总结GameObject的创建、删除、修改和查询方法。
创建GameObject
通过将资源读取在内存中,然后使用Instantiate方法实例化创建资源副本。比如使用Resources方法、AssetBundle方法、AssetDatabase方法等
使用new GameObject创建,接着在后面挂脚本或者设置参数等。
我们可以使用以下脚本在运行时创建一个Camera
12345678910using UnityEngine;public class TestScript : MonoBehaviour{ void Start() { GameObject myCamera = new GameObject("MyCamera",typeof(Camera)); myCamera.transform.position = Vector3.one ...