unity入门学习
前言
这是M_Studio的《勇士传说》游戏制作教程的个人学习笔记,供参考,b站上的视频链接:【安装Unity引擎和代码编辑器|Unity2022.2 最新教程《勇士传说》入门到进阶|4K】 https://www.bilibili.com/video/BV1mL411o77x/?share_source=copy_web&vd_source=4175708e3d0d482d0df075930a6bbbdf
Unity中的面板及组件脚本:
Unity的5大面板
Hierachy:层级面板,游戏场景中的资源,比如UI、模型
Scene:场景面板,用于管理游戏场景中的各种游戏物体
Game:游戏场景面板,实际的玩家视角
Project:项目面板,用于管理项目中的所有资源
Inspector:检查面板,可以理解为属性窗口,查看 Hierachy 或 Project 中资源的属性
组件的基本介绍
在Unity中,游戏物体实际上是不具备任何功能的,若想为其添加功能,则需要为它添加相关的功能组件。在Unity的“检查器”面板中,我们可以看到物体拥有的组件,使用的组件可以是引擎内部的组件脚本或是自己编写的组件脚本。也就是说,一个游戏物体往往具有多个组件,而每个组件又是一个组件脚本,我们通常会使用C#语言来编写组件脚本
如图,我们可以通过检查器面板看到创建的一个立方体已经包含了Transform组件、Mesh Filter组件、Mesh Renderer组件和Box Collider组件等,这里简单介绍这四个重要的组件
Transform: 描述一个物体在3D世界中的位置、旋转和缩放信息,它是每一个游戏物体都具有的组件,也是不能被删掉的必备组件
Mesh Filter: 规定了该物体使用哪种网格显示
Mesh Renderer: 包含了该物体与渲染相关的属性
Box Collider: 设定了该物体在物理世界中的碰撞样式及大小
添加组件的方法很简单,选择需要添加的游戏物体,然后单击“检查器”面板下方的“添加组件”按钮,在弹出的组件菜单中选择需要添加的组件,也可以通过输入组件名称来搜索组件,这种方法个人觉得挺方便的。不仅如此,在任意组件的右上角还能看到“更多”按钮(也就是3个竖直排列的·),单击该按钮便会弹出该组件的其他操作,如调整该组件在控制面板中的位置、移除组件和复制组件等,具体的功能用法不再一一赘述
脚本的基本介绍
组件脚本创建很简单,只需在“项目”面板中右键执行“创建>C#脚本”便可创建一个脚本,双击该脚本文件便能打开编辑器,看到该脚本的代码。在该脚本代码中,我们可以看到它自动生成了一个与文件名相同的类。如果我们需要对该文件进行重命名,那么也需要在文件内部对类进行重命名,以保证名称的一致性,否则会报错。并且脚本中的类都是继承自MonoBehaviour类的,只有继承了MonoBehaviour类的C#脚本才是一个组件脚本,如果删掉父类或者修改父类为其他的类,那么这个脚本就只是一个普通的C#脚本而不是组件脚本
如上图所示,除了能看到脚本继承的类外,我们还能看到Start方法和Update方法,这两个方法是常用的组件生命周期方法,除了这两个方法外,Unity还提供了其他的生命周期方法,并且这些方法都是在游戏开发的过程中经常用到的
【P1】基础设置
1.素材导入和整理
第一步就是获得需要的游戏素材资源,然后将素材文件直接拖到项目(Project)面板中的Asset文件夹下即可
找到需要用上的人物素材(这里使用char_blue_1),通过预览我们可以看到该素材是一个图集并且图像有点不清晰的,所以我们需要在检查器(Inspector)中对其进行调整使其锐化,然后再对图集进行一定比例的切割
调整
1.在Sprite Mode中选择Multiple,因为我们选择的图集中里面包含多个人物素材,需要进行切割
2.在Pixels Per Unit中填16,因为使用的素材的像素比例为16。Pixels Per Unit 意思是,每个Unity单位显示多少个像素(也就是Scene面板里每一个正方形格子中所包含的像素个数)。默认100,也就意味着每1个Unity单位显示100像素。一般的美术素材中都会标注当前的图像是多少像素x多少像素的,我们可以根据这个来设置图像的大小
3.Filter Mode中选择Point,这样可以保证我们的像素不会产生模糊,像素的锯齿感更清晰
4.Compression中选择None,这样可以让图像的质量最高,不会被压缩
5.设置完后要选择Apply 使上面的设置生效
切割
在检查器中点击Sprite Editor进入切割页面
1.Type选择Grid By Cell Count这样可以根据每一行每一列的图片个数来进行切割
2.通过数个数我们可以按照每行8 个,每列11个人物素材进行等比例切割,所以设置为8和11
3.Pivot即轴心,代表着模型的真实位置,
transform.position
获取的就是pivot ,是模型旋转、缩放的参考点,每个物体的轴心一般默认为Center。我们希望轴心在图片的底部,这样方便我们做后续的判断是否接触到地面等逻辑处理,所以设置为Bottom4.切割完后记得点击Slice,然后点击右上角的Apply使得切割生效
2.场景绘制和叠层设置
场景绘制
找到需要切割的场景素材Forest-1,然后在检查器中按照对人物素材char_blue_1的设置一样进行调整。然后点击Sprite Editor进入切割页面
点击 Slice
Type选择Grid By Cell Size,这样就是根据单元占像素量分割,这里选择以每16x16的格子为一个单位来进行切割
Pivot即轴心,这里设置轴心在图片的中心位置,这样方便我们绘制地图
最后记得点击Slice
点击右上角的Apply使得切割生效
接下来使用Unity内置的2d场景绘制工具,选择Windows - 2d - Tile Palette,打开后会出现瓦片调色盘的窗口,可以将其拖拽到Editor上固定的位置,比如Hierarchy(层级)旁边,在一开始可以看到是没有任何可用的调色盘的,所以需要新建一个。选择create new polot新建一个调色盘,并取名为Forest1,这时会弹出一个窗口询问要创建在哪里,在弹出的窗口中我们可以看到该窗口跟Unity中的Project窗口显示的文件是一致的,我们使用的所有素材资源都要放在Assets。在目前的窗口中新建一个Tilemap(瓦片地图)文件夹,为方便规划管理,在Tilemap文件夹下创建一个Palette(调色盘)文件夹,然后选择该文件夹。这样便在Palette里创建出第一个调色盘Forest1,然后将Project里的场景素材Forest-1拖拽添加到Tile Palette中,这时会弹出窗口询问用户要将这些瓦片存在哪里使用,双击Tilemap文件夹,在该文件夹目录下新建一个Tiles(瓦片)文件夹,再在Tiles文件夹下新建文件夹Forest1进行分类,然后点击选择,这样素材Forest-1的所有瓦片便会进行加载,加载完后调色盘便会出现素材的瓦片地图
除此之外,我们还需要添加一个可用目标,让它可以绘制瓦片地图。在Hierarchy界面右键空白处,选择2D Object - Tilemap - Rectangular,然后返回调色盘窗口,便能看到此时的调色盘窗口显示拥有一个活动目标(这里我将Grid中的Tilemap重命名为Platform),这样我们便能开始使用调色盘进行游戏场景绘制了
在调色盘单击一个瓦片便能进行单个瓦片绘制,长按鼠标左键便能多选进行绘制,效果如下图
叠层设置
在游戏中有时需要人物、场景、道具等的遮挡关系,那么我们要如何使用 Unity 来完成这些相互遮挡的效果呢,这个时候就需要用到叠层的概念,在 Unity 中我们可以添加自定义的 Sorting Layer,下面的操作就会用到叠层的概念
在人物素材char_blue_1的检查器中找到组件Sprite Renderer,可以看到Sorting Layer显示默认,我们可以在这里创建多个Layer来进行叠层排序,还可以在Order in Layer进行调整叠层的顺序
- 先看Sorting Layer——选择图层,越往下,越在前,可以手动添加Layer
- 当选择同一个Sorting Layer时,则看Order in Layer,数字越大,越在前
对Sorting Layer进行设置,创建3个Layer并分别命名为Back、Middle和Front,后续便能对素材的Sorting Layer进行选择
对Order in Layer进行设置,在Hierarchy界面选择Grid下的Platform ,然后使用快捷键 Ctrl+D复制6个出来并进行重命名
1.可以按住Shift点击Back1然后点击Back3来实现多选
2.把3个Back的Sorting Layer全调整为Back
3.然后在Order in Layer中设置与后缀相应的数字
4.用同样的方式给下面的Front也进行调整,注意Platform设置为Middle
如此我们便能实现对象之间的遮挡效果,这里以草地与人物为例,选择在Back3这一层来单独绘制草地的部分。此时我们注意到Scene窗口中,不同层没有进行区分,我们不能很好的看到当前层有什么内容,于是我们可以按照下图的方式进行操作,只显示当前层的内容并在该层进行绘制
1.在Scene窗口中找到Tilemap Focus
2.选择Tilemap(瓦片地图),此时的Scene就会只显示当前选中的Tilemap的瓦片
3.在调色盘中通过选择不同的活动目标来显示当前层并进行绘制(这里我选择的是Back3)
绘制完成后,在Tilemap Focus选择None,然后点击游戏窗口便能看到游戏场景的样子了
3.规则瓦片和动态瓦片
规则瓦片(Rule Tile)
在Unity中制作游戏场景,除了通过手动的方式进行绘制,我们还能通过使用Rule Tile(规则瓦片)来实现快速场景绘制,也就是说让瓦片按照一定的规则来自动生成大面积的游戏场景,这个方法相对于手动来说效率会更高
首先在Project窗口中的Assets - Tilemap - Tiles文件夹下新建一个Rule Tiles文件夹,然后右键该文件夹选择Create - 2D - Tiles - Rule Tile并命名为Ground1,然后在Ground1的检查器中选择Select,选择一个默认素材
我们希望在绘制平台的时候,平台的左上边缘为1,右上边缘为5,左下边缘为10,右下边缘为14,平台的组成部分2-4随机出现。还希望平台的左侧为6和8随机出现,右侧为7和9随机出现,平台的底部为11-13随机出现,平台内部ABCD随机出现。为方便使用我们可以在Forest-1的Sprite Editor里面给每个素材逐一进行更名,这里我给1-14更名为Ground1+编号
回到刚刚创建的规则瓦片Ground1,在检查器中的Tiling Rules点击+号来添加规则瓦片,以平台左上角瓦片和平台进行随机填充的瓦片的规则为例,这里的九宫格,除了中间的方格我们都可以点击,点击第一次的时候会出现绿色的箭头,代表这个瓦片的这个位置是有其他瓦片存在的,再次点击会出现红色的叉,代表此处不能有其他瓦片(只限于同一个 Tilemap 中)出现,再次点击会取消限制,恢复默认
设置可随机出现的瓦片
- 选择默认的瓦片图片Ground1-2
- Output项一定要选择Random
- 我们把size改为 3 ,然后Enter,并在下面的框中选择需要随机填充的图片(Ground3-4)
- 注意这里的瓦片规则,因为是平台上层的瓦片,所以它的左右和下面一定是有其他瓦片的,但是上面就不应该有瓦片了,可以按照下图的办法设置
Tip:这里的 Noise 其实是改变随机的种子,可能会有不一样的随机效果,这里可以根据喜好来调整随机数
最后的设置如下图,值得注意的是,在下面的瓦片排列顺序代表了生效的优先级,越靠前的会越优先生效,这个是我自己用的一套规则,你也可以根据自己的喜好来定制自己喜欢的规则,制定好规则后,将Project界面中将设置好的规则瓦片Ground1拖拽到Tile Palette中,便能使用调色盘中的第四个工具进行绘制场景(绘制画笔右边的工具),长按便可以采用矩形绘制的方式来大面积地绘制游戏场景(效率很高)
动态瓦片(Animated Tile)
普通的瓦片是静态的,在游戏运行后并不会有任何的变化,但是游戏场景中有时需要动态场景来丰富游戏的视觉效果,比如会有瀑布水流之类的动态场景,我们需要让这些场景动起来,这个时候就可以使用动态瓦片,动态瓦片在游戏运行后可以按帧播放动画,实现瀑布、水流等的流动效果
在 Tiles 文件夹下创建新的文件夹 Animated Tiles ,然后右键该文件夹选择Create - 2D - Tiles - Animated Tile,并命名为Waterfall Left,再复制另外两个出来,分别命名为WaterFall Middle和WaterFall Right
这里先对Waterfall Left进行操作(为方便查找可以对瀑布的瓦片重命名,这里不再赘述)
- 选择其中一个动态瓦片
- 在Number of Animated中填4,因为我们4个瀑布瓦片为一组
- 选择对应的图片,因为这里选择的是 Left 的动态瓦片,对应的图片名字后缀就是1、4、7、10
- 设置速度,这里可以自定义
- 按照同样的方式对其他的两个动态瓦片进行设置
打开Tile Palette界面,将刚刚完成的动态瓦片依次拖拽到Tile Palette里,然后便能采用矩形绘制的方法来绘制瀑布了
【P2】Player人物创建
1.设置人物及基本组件
为了让角色拥有物理效果和能够与场景发生交互,我们还需要为人物角色添加组件Rigidbody 2D和碰撞体
在Hierarchy窗口中选择Player,然后在Inspector中选择Add Component添加组件RigidBody 2D,Rigidbody 2D的一些相关默认设置可以在Edit - > Project Setting -> Physics 2D -> General Settings中进行查看和更改,其中Gravity(全局重力)的默认值为y轴上的-9.81,也就是和现实世界的重力加速度一样,在游戏开发过程中,我们可以通过这里更改游戏中的重力值,而Rigidbody 2D中的Gravity Scale则是该对象受重力影响的程度,官方文档描述如下
Gravity Scale’s Description
The degree to which this object is affected by gravity.
In 2D physics, the gravity is a global setting in the Physics2D class but you can also control the proportion of that gravity applied to each object individually using gravityScale. For example, it may be easier to implement a flying character by turning off its gravity rather than simulating the forces that keep it aloft.
给角色添加了Rigidbody 2D后我们还需实现角色与场景的碰撞效果,先为Player添加Capsule Collider(胶囊碰撞组件),然后人物周围会出现绿色线圈,点击Edit Collider旁边的键后可以看到在Scene界面中角色周围的绿色圈的上下左右会出现4个点,可以直接拉动拖拽这4个点修改胶囊碰撞器的大小(可以鼠标长按绿色点,然后按住Alt键再拖拽四个点来实现以中心轴进行调整),也可以直接在Inspector中修改碰撞器的参数
按照上面的方式给Platform添加组件Tilemap Collider 2D、Composite Collider 2D(Rigidbody 2D会在添加了Composite Collider 2D后默认添加)。其中Tilemap Collider 2D是为了给瓦片地图添加碰撞体,这样可以让瓦片地图和人物可以进行碰撞,Composite Collider 2D是为了让瓦片地图的碰撞体成为一个整体
在Tilemap Collider 2D组件的Inspector中,将Used By Composite进行勾选,此时瓦片地图会成为一整个碰撞体。打开平台的Rigidbody 2D组件,设置Type为Static ,否则瓦片地图也将会进行物理模拟(如重力等),我们希望地图保持不动,所以设置为静态。为了防止人物在移动的时候发生翻转(类似摔倒),还需将Player中的组件Rigidbody 2D的Constaints下勾选上Freeze Rotation,此外,人物以后还会实现爬墙、滑铲等其他动作,当动作多的时候,为确保检测更加精准,将Collision Detection改为Continuous
简述Rigidbody的一些性能
Mass: 对象的重量
Freeze Rotation: 控制物理是否会改变对象的旋转
Collision Detection: 物理引擎用于检查两个物体是否发生碰撞的方法
更多Rigidbody 2D的相关知识可通过查询官方手册:Rigidbody2D - Unity 脚本 API
2.创建及配置新输入系统
为实现游戏中各种需求,写脚本是必不可少的,为方便管理,在Assets下创建一个文件夹Scripts用来存放后续编写的所有脚本
在Scripts下创建子文件夹Player用来存放控制角色的脚本,然后在该文件下右键选择Create -> C# Script新建一个脚本并命名为PlayerController,然后给Hierarchy中的Player(也就是游戏人物)添加该脚本组件
在正式编写代码前,我们要将Unity的输入系统更新到最新版本,选择Edit -> Project System ->Player,然后更改Api Compatibility为.NET Framwork,将Active Input Handing* 改为 Input System Package (New) ,然后选择Apply,Unity会提示需要重启,重启后选择Windows -> Package Manager,在此窗口搜索Input,然后选择Install下载Input System,完成后便可使用最新的输入系统
Input System官方说明文档:Input System | Input System | 1.6.3 (unity3d.com)
在Assets下的Settings文件夹(没有的话新建)里新建子文件Input System,在Hierarchy为Player添加组件Player Input,然后在该组件下选择Create Actions来在Input System文件夹下创建一个默认的输入系统并重命名为PlayerInputControl,生成后就能看到Unity已经配置好的默认操作,为方便区分在Action Map中将Play重命名为GamePlay
手动添加方法:在该文件夹下右键选择Create -> Input Action新建添加一个输入系统
接下来就是写代码,选择PlayerInputControl,然后为它勾选上Generate C# Class并Apply来生成一个与它同名的C#脚本
打开脚本PlayerController,在该脚本下可通过语句using UnityEngine.InputSystem;
来调用InputSystem的相关内容
3.实现移动和翻转
实现代码如下:
1 | using System.Collections; |