Tile地图
Unity提供全套的Tile工具来编辑2D地图。使用Tile编辑地图,可以极大地减少内存的占用。美术人员只需要小格式地图,并且保证可以相互拼接接口,策划人员最终将这些小格子元素编辑在一起。灵活的拼接可以生成很多不同的2D地图。使用Tile之前请确保安装Tilemap Editor包
创建Tile创建tile之前,需要确认Tile的大小,一般是32和64。
首先要将需要使用的tile按照大小设置Pixel Per Unit,然后按照Multiple Sprite Mode切分,还要把Filter Mode改为Point,把Compression设为None
在Hierarchy视图中创建TileMap游戏对象。选择Create——2D Object——TileMap命令。
此时场景中将出现一个Grid对象并且它下面套着TileMap对象。Grid就是Tile的画布,它可以设置画布每个单元的大小。由于前面Pixels Per Unit已经设置成32,所以这里默认填1就好了。Cell GAP可以设置每个单元之间的间距,一般都设置成0就好。最后的Cell Swizzle用于设置Grid布局的 ...
Sprite和Sprite动画
UGUI并不适合开发2D游戏,因为角色移动的话,他所在的canvas每一帧都会进行Mesh合并操作,这是没有必要的。
Unity提供了Sprite Renderer组件,它可以配合Animator组件来控制播放2D精灵动画。此外还有2D物理和碰撞事件
SpriteSprite Renderer是2D游戏开发最基础的组件。使用的是将类型标记为Sprite的图片资源。
Sprite Renderer和UI一样,都可以使用Atlas进行图集合并。
将图片资源选择为Sprite后,一共有3个模式可以选择
Single:表示它是一张单张图
Multiple:可以把一张图分拆成多个Sprite。可以自动分拆,也可以手动在Sprite Editor中编辑出每个sprite的区域。
Polygon:自定义Sprite的多边形形状,例如,在不需要美术人员修改的情况下,可以让它变成圆形
Sprite中可能有部分是透明的,如果按矩形渲染的话,会需要多余的渲染资源来渲染透明部分,所以我们把Mesh Type改为Tight,这样Unity会自动把这张图生成网格后再渲染,减少需要渲染的透明像素。Extrude ...
UGUI典型实例
置灰UI置灰是指某个图标按钮变成灰色。置灰图片的效果还可以,但是置灰文字就不太好了。因为文字类型比较多,例如描边、渐变和阴影等。直接置灰的效果未必好,可以整体修改文字的颜色。如果需要置灰文字,可以和美术人员商量一种颜色。例如将所有的文字改成白色,不过依然得考虑文字描边、阴影的情况。
如下图所示,在UI节点的顶层上挂上UIGray脚本,可以在编辑模式下勾选isGray复选框来预览效果
给当前节点下所有UI元素换成一种带置灰的Shader,还原置灰就是把这些Shader取消即可。
这里我们直接修改Unity默认的材质并设定自定义的shader,省去了在工程中另外设置置灰专用的材质的步骤
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869using UnityEngine;using UnityEngine.UI;#if UNITY_EDITORusing UnityEditor;# ...
Canvas组件和Altas
Canvas组件canvas组件是UI的基础画布,所有的UI元素都必须放在Canvas对象下面,Canvas是可以互相嵌套的
Canvas支持3种绘制方式——Overlay(永远显示在最上层)、Camera和World Space(世界内3D布局),其中用的最多的是Camera(绑定特定的UICamera),可以把正交摄像机投影出来的UI元素绘制在Canvas面板上。注意添加UI Camera时一定要删除它的Audio Listener
自适应屏幕每一个Canvas都绑定一个Canvas Scaler组件,此组件确定游戏UI的缩放方式,一般UI Scale Mode选择Scall with Screen size,然后Reference Resolution选择1136*640,这是一个比较适中的16:9分辨率,然后Screen Match Mode选择Expand。
这里对应的Screen Match Mode有三种,我们在game窗口设定Free Aspect,然后调整窗口来观察UI的排布变化
Match width or Height
根据屏幕高度或宽度的对应比例来调整UI ...
UGUI事件系统
事件系统操作事件是非常庞大的。鼠标、键盘和手势能产生很多事件。
不同的UI操作事件不太一样,例如按钮,单击事件、按下事件和抬起事件都各不相同。
unity添加任意一个UI组件后,都会自动添加一个全局EventSystem对象,运行起来后,在面板中可以查看操作的详细信息。
事件系统不仅会抛出点击一类的事件,还可以取到最基本的操作信息。例如鼠标在屏幕中的坐标,滑动开始的坐标以及滑动结束的坐标等。
新版的EventSystem不仅供UI使用,3D游戏对象也可以使用它,并且使用方法都比较接近。
UI事件UI事件依赖于Graphic Raycaster组件,它必须绑定在Canvas组件上,表示这个Canvas下所有UI元素支持的事件。
游戏中同时有很多Canvas,如果想让游戏中某些UI不可接收点击事件,可以考虑把部分Canvas的Graphic Raycaster设置enable = false,或者直接删掉Graphic Raycaster。
Button、Toggle、Slider等都是属于Unity预先封装好的带UI元素事件的组件,但是一些基础的组件Image、Text等是没有事件封装 ...
UGUI基础元素
基础元素UI提供了Rect Transform组件,用来设置锚点以及对齐方式,每一个基础元素都要设置Rect规则
Text文本需要使用TTF字体,汉子字库一般非常庞大,有大多数无用的字符,可以使用Font Creator等软件来精简一下字库。
有些文本文字数字和中文需要两种不同的字体,可以将两种字体合并,这样使用一个Text组件就可以同时显示中文加数字了。
UGUI的Text有很多缺点,推荐使用TextMeshPro组件可以省去很多麻烦
在“第三章——拓展Hierarchy视图——重写菜单”中,有取消新建的UI的Raycast Target方法
UGUI的事件系统会遍历所有Raycast Target组件。不需要交互的元素需要关闭Raycast Target以节省性能
UGUI默认的材质是无法修改的,但是可以重写,只需要将新的材质拖入Material处即可
描边和阴影在Text游戏对象上添加Outline和Shadow,即表示支持文本的描边和阴影。
描边是在原有文字组件的基础上上下左右各画了一遍。效率是很低的
阴影比描边好很多,只画一遍。
动态字体动态字体是根据传入的字体以及字体的大小 ...
脚本编译和调试
脚本编译编译规则在编辑器下,每次修改完代码后,就会自动开始编译,最终所有的代码都将编译成DLL文件,在项目工程文件夹/Library/ScriptAssemblies目录下,称为预定义程序集
其中有四个主要的程序集,他们有固定的编译顺序,先编译的脚本无法访问后编译的脚本(如果没有符合编译阶段的脚本,Unity不会创建对应的程序集),程序集的创建是根据特殊文件夹内的脚本决定的。
阶段
程序集名称
文件夹规则
1
Assembly-CSharp-firstpass
在 Standard Assets、Pro Standard Assets 和 Plugins 文件夹内的脚本。
2
Assembly-CSharp-Editor-firstpass
名为 Editor 的文件夹(位于名为 Standard Assets、Pro Standard Assets 和 Plugins 的顶级文件夹中的任意位置)中的 Editor 脚本。
3
Assembly-CSharp
不在名为 Editor 的文件夹中的所有其他脚本。
4
Assembly-CSharp-Editor
位 ...
脚本序列化
脚本序列化自己编辑的脚本,其中的可以序列化的部分(比如public访问标识符下的),会被单独储存。
如果脚本已经在Hierarchy窗口中挂载,那么在inspector窗口中修改的脚本内容,会被保存在对应的场景.unity文件;如果脚本在一个prefab里面,那么在prefab编辑模式下修改的内容会被保存在.prefab文件;如果是在场景中修改了prefab参数,需要点击“override in prefab”。
查看数据在Edit——Project Settings——Editor——Asset Serialization里面,可以选择序列化对象的保存方式
默认force text会让编辑模式下查看资源结构更方便
可以把.prefab或.unity文件直接丢进文本编辑器中来查看序列化的数据。prefab中还会保存对象的实例ID,这样反序列化的效率就会提高
私有序列化数据的编辑器拓展使用SerializeField特性来序列化脚本中的私有字段。
这个时候想用拓展编辑器来编辑数据的话,可以使用SerializedObject和SerializedProperty来设置数据
关于脚本拓展 ...
脚本模板生命周期多脚本
创建脚本脚本要创建在除Editor文件夹以外的任意目录或子目录下
脚本模板脚本模板的位置:C:\Program Files\Unity\Hub\Editor\2020.3.6f1c1\Editor\Data\Resources\ScriptTemplates(视Unity安装位置而定),前面的数字代表菜单栏的顺序
拓展脚本模板使用这种方法,在本地工程文件内添加自己的模板,而不是去修改Unity安装目录下的模板
在工程的Editor文件夹中,新建ScriptTemplates文件夹,放入C# Script-MyNewBehaviourScript.cs.txt文件,文件的内容如下
1234567891011using System.Collections;using System.Collections.Generic;using UnityEngine;public class #NAME# : MonoBehaviour{ void MyFunction() { }}
模板文件编辑完毕后,在Windows情 ...
Unity游戏开发拓展编辑器3
Unity编辑器的源码例子:查找ManagedStaticReference()静态引用在Profiler里面,有的时候会看到某个资源一直无法GC,其原因可能是被static静态引用了。
首先在Assets里面新建Resources文件夹,在里面放一个hierarchy的游戏对象,命名为“prefab”,然后在Scripts文件夹里新建一个名为HardReferenceResourse脚本并挂载在场景中的某个物体上
12345678910using UnityEngine;public class HardReferenceResourse : MonoBehaviour{ public static GameObject prefab; private void Start() { prefab = Resources.Load<GameObject>("prefab"); }}
运行游戏后,使用下面的脚本在Unity中使用反射来递归查询这个资源被代码哪里static强 ...