版本:unity 5.6.1 语言:C#
总起:
Unity2D,说是说2D,其实是在3D的基础上进行的扩展,点击Scene窗口上的2D按钮就能让Scene的摄像机在2D和3D之间切换。
个人推荐刚开始做的新手小团队就制作2D好了,我之前网上组织的一个项目就用的2D,工作量小,表现力其实也不差。
游戏的表现形式:
♦ 完全3D
3D游戏通常使用的是3维的模型,材质和贴图会在游戏实体上渲染,相机可以在空间中自由移动,阴影和灯光会通过Shader写实的表现出来,3D游戏一般使用的是透视相机,远小近大的这种感觉。所以在Unity中所有的3D游戏都应该是用3D模式。(直接使用官方图片了)
♦ 正交3D
有时候游戏会使用3维模型,但是相机是正交的,以一种上帝的视角来表现,有时候会被叫做2.5D(这点在我看来有点争议的,我理解中的2.5D应该是游戏中2D的图片却来源于3D模型各个面的截取,类似《空之轨迹》),制作这类游戏应该使用Unity的3D模式,但相机设置为正交。
♦ 完全2D
很多2D游戏使用平面的图形,一般叫做Sprite精灵。制作这类游戏Unity设置为2D模式,并且相机应该使用正交。
♦ 3D的表现形式2D的玩法
有一些2D游戏使用3D的模型,但游玩的时候只有两个轴提供给玩家操控。比如相机只能在一个面上滚动,而且玩家只允许在上下左右进行控制,但是游戏本身的表现是3D的。这类游戏也归于2.5D。游戏的玩法设置应该2D的,但应该选择Unity的3D模式进行编辑。有名的比如《三位一体》,最近新出的《尼尔》有些关卡设置上采用的就是这种玩法。
♦ 2D的玩法和图形,但使用透视相机
这是另一种2D游戏的表现形式,但是使用透视相机达到一种视差滚动的效果,即离相机近的前景移动的快,远的背景移动的慢。跟2D游戏唯一不同的是相机设置为透视。现在很多横版游戏都采用这种方式,个人比较喜欢的《胧村正》、《奥日与黑暗森林》都采用这种方式来表现。
这边要说一下,如果你进入编辑器时选用的是3D模式,但你开发的游戏是2D的,这时就要手动将3D的编辑模式调整为2D的,具体设置在Edit/Project Settings/Editor中寻找。
♦ 2D模式:
1.导入图片自动设置为Sprite;
2.光照系统中实时GI、烘培GI、自动创建都会被关闭;
3.天空盒默认没有、环境光来源设置为颜色、相机默认为正交。
♦ 3D模式:
1.导入图片自动设置为Texture(并且初始选用的Shader不带有Alpha通道,这一点要注意);
2.实时GI、烘培GI、自动创建会被打开;
3.天空盒为默认天空盒、环境光来源于天空盒,相机默认为透视。
Unity Sprite处理的三大工具:
♦ Sprite Creator
这个东西看起来很重要,其实是给玩家在没有图片时创建一些测试图片,在Project窗口中右键Create -> Sprites就可以选择创建一些基本的图形。选中创建的文件,可以看到Sprite Mode是Polygon。
这里有个神奇的用法,在场景中随便拖一张图片,然后找到图片的源文件,将Sprite Mode从Single变为Polygon,在点击Sprite Editor填入创建需要多少条边(我这边是6边形),以下是效果:
上面的是原图,下面是选择Polygon,注意该效果只能用于Sprite Renderer中,UGUI中是无效的。具体的原理我会在下一节中提到,在这里先卖个关子。
♦ Sprite Editor
首先介绍一下Inspector窗口下,Sprite资源的导入设置:
Texture Type:这边选择的是Sprite,用于2D和UI,默认Shader自带Alpha通道,而3D模型贴图默认不带有Alpha通道;
Texture Shape:直译过来就是图片的形状,这边默认是2D,一般图片和贴图都是2D。还有个可能的选项是Cube,用于天空盒、发射探针,由6个2D图片组成。值得一提的是图片类型还有一种叫做体纹理的东西,它由体素组成,是真正的3D图片,常用于医疗CT扫描;
Sprite Mode:Single,一张图片一个Sprite。Multiple,一张图片可以设置多个Sprite;
Packing Tag:用于Sprite的打包,相同Tag的Sprite会打包在一起;
Pixels Per Unit:世界坐标的一个单位代表图片的多少个像素点;
Mesh Type:确定生成Mesh时,使用Full Rect直接一个矩形,还是Tight根据透明通道配置;
Extrude Edges:在Mesh中会留下多少的透明度;
Pivot:Sprite锚点;
Sprite Editor按钮:打开Sprite Editor窗口,编辑当前的图片,下面会提到;
sRPG:非HDR的图片应该勾选该选项;
Alpha Source:Alpha通道值的来源。None,不需要。Input Texture Alpha,由图片的Alpha通道指定。From Gray Scale,RGB的平均值;
Alpha IsTransparency:Alpha是否代表透明通道;
Non Power of 2:定义纹理大小不是2的幂,导入后的行为(纹理会自动填充至2的幂,但是该选项具体用处还不是很明白);
Read/Write Enabled:是否允许读写,类似方法Texture2D.SetPixels、Texture2D.GetPixels,勾选之后会产生纹理的副本,会消耗两倍的内存;
Generate Mip Maps:生成Mip Maps,勾选了之后,GameObject离得越远,显示的越模糊。勾选的图片会多消耗一些内存,以保存分辨率低的图片,这点需要注意,一般用于3D游戏的资源优化,在底下的窗口可以调节以下Slider,查看生成的Mip Maps;
Wrap Mode:图片平铺之后的行为,主要用于Shader中获取超出边缘值时的行为:Repeat,重复;Clamp,边缘值;(例如获取1.5的值是,Repeat获取到的是1.5%1=0.5,而Clamp获取到的是最大值1)
Filter Mode:Texture的过滤方法:Point不过滤,Billnear双线性过滤,Trillinear三线性过滤(效果和双线性差不多)。对比一下就知道了,在创建类似Minecraft游戏时,请选择Point(左边Point效果,右边过滤效果):
Sprite Editor有两个功能(Unity版本尽量选择5.6或者2017,Unity5老的版本对Sprite操作的支持不完全):
1.编辑图片的切片和九宫格属性;
2.编辑图片的Outline,也就是显示图片时所用的Mesh。
九宫格,九妹这个功能我就不多说了,用于血条之类的显示。
切片,在左上角选择Sprite Editor模式后,右边有个Slice按钮,有三种模式来切割当前的图片(要支持此功能,图片导入设置Sprite Mode必须选择Multiple):
1.Automatic,按照透明度,程序自动分割图片;
2.Grid By Cell Size,根据设置的每个Sprite大小,来尽量的分割图片;
3.Grid By Cell Count,根据设置的横纵数量来分割。
使用后两种方法可以使用Padding和Offset来设置间隔。分割好的每一个切片,同样可以设置九宫格和锚点,或者重新调整切片。所以可以用上面的方法,大致切好切片,然后再仔细调整。
Editor Outline,在左上角选择该模式后,就可以设置Mesh了。点击现有的线条可以新建顶点,选中线条后按delete可以删除顶点。在Sprite Renderer中就可以按照编辑的效果来显示了:
看到这个效果大家可能猜到了,上一节中提到了Polygon模式,正是因为这个原理可以显示图片的部分,Mesh当然是影响不了UI的,所以在UGUI中无效。
至于Collider可以选择Polygon Collider 2D,但它不会适应自定义的Mesh,需要的话可能要自己来调整。
♦ Sprite Packer
在Window -> Sprite Packer可以打开该编辑器,点击Pack就可以游览当前会被打包到一起的图片集了,当然只有设置了Tag的Sprite有效。
2D模式下,该功能是自动打开的,如果是3D模式,请在Edit -> Project Settings -> Editor中找到Sprite Packer Mode设置为Always Enabled。
官方文档中,有针对每种打包方针的代码,在这边就不仔细研究了。
Sorting Group组件:
在一堆Sprite Renderer渲染的精灵的父类可以设置该组件,作用是渲染的时候一同渲染其子节点,因为这个特性可以和别的层(即使z轴值差不多)分离出来。
然后新版的Unity有一个特性,就是即使几个Sorting Group设置相同,但Sprite也会分组进行渲染,避免组之间的Sprite混杂在一起。
新出的Unity 2017新增的两个特性:
1.Sprite Mask组件,用一个Spirte的Mesh来抠出别的显示的Sprite,需要注意的是层次要设置相同,并且Sprite Renderer的层次要在Sprite Mask的Front和Back之间;
2.Sprite Atlas,上面还介绍了Sprite的打包,在2017中已经成为过去式了,在Project窗口中可以新建一个图片集,并在其中添加需要打包的Sprite,然后在代码中可以通过SpriteAtlas.GetSprite获取到图片。需要注意的是启用该功能的时候,以前打包系统就不能用了,这点需要注意。
篇幅有点长了,下一篇文章着重介绍2D物理。
PS. Edit Physics Shape
查看Unity2017新特性的时候发现Sprite Editor多了一个编辑碰撞盒的选项,但仔细一看,这玩意我感觉就是,Edit Outline的代码复制粘贴到里面,然后保存的时候保存成物理碰撞数据。
就不能提供一个什么按钮,Generate From Outline吗?由Mesh生成碰撞盒很困难吗?真心跪,希望后续版本有改进。
个人:
为了避免影响文章的观感,现在把文章无关的心情遭遇放到文章的最后,虽然这些东西一般都是最初写的。最近……最近,发生了很多事情,也淡忘了很多事情,忙忙碌碌却找不到什么目标。