学它丫的游戏引擎
前言
做此笔记,记录一下Unity的学习过程,也算是一种变相的监督。
Unity简介
一个跨平台的游戏引擎,使用C#编写游戏逻辑,内置物理引擎(碰撞、刚体、布料)。
资金或年收入20w美金以下的开发者(企业)使用personal版本是免费的。
竞品有最近比较火热的开源引擎Godot。
Unity官方有不少免费教程(或者收费教程也有),这里我将学这个入门 Ruby’s Adventure:2D 初学者

专有名词
- Texture Type:纹理类型,比如Sprite(2D and UI)就是一种纹理类型
- Sprite:精灵,通常是一张图片经由Unity处理后得到的一个可绘制的对象
主要组成
编辑器
- Scene:实时的场景编辑器,支持拖拉拽。
- Hierarchy:与Scene联动,它将Scene中的所有游戏对象以目录树方式展现出来。
- Project:管理当前项目中的所有Resource,包括图像、音频、scene、C#脚本等。
- Console:看运行日志的地方。
- Game:可以理解为预览,玩家视角。
- Inspector:管理游戏对象、Resource等的属性的面板。
- Animator:在这里编排动画
Sprite
精灵是在游戏中绘制的图像。Unity 无法使用你直接为 Ruby 导入的 .png 图像文件,而是需要将此文件转换为可使用的格式。
精灵可以选择sprite mode,用single或者multiple(还有个polygon不知道是啥),选multiple的时候可以在Sprite Editor中自由裁剪图像而产生多个sprite
Input Manager
Unity帮忙封装了一下input,将键盘、鼠标、手柄等设备输入的信号封装成可以直接使用的UnityEngine.lnput对象。
核心概念:
输入轴(Input Axes)
将物理输入(如键盘按键、手柄摇杆)映射为逻辑上的“轴”,输出一个 [-1, 1] 范围内的值,渐进的
输入类型
按键 Key:键盘上的物理键,比如空格键、shift键
按钮 Button:手柄、触摸屏上的按键
鼠标/摇杆轴 Mouse/:连续输入
Tilemaps - 瓦片地图
世界设计。瓦片地图将世界作为一个网格,你可以在其中为每个网格单元格设置不同的精灵。
Tile Palette
美taɪl 美ˈpælət
瓦片调色板,一个可视化工具,管理瓦片,可以用它来绘制Tilemap。
可以根据自己喜好,调整Tile Palette的布局(即绘制调色板,注意不是绘制tilemap)
Order in Layer
层显示优先级
可以通过修改sprite renderer的该属性来控制game object的显示优先级,数值越大,优先级越高,与其他低优先级的game object重叠时覆盖在上方。
如果game object的layer order相同呢?
这时候根据Camera Settings来决定谁覆盖谁,比如下面配置是根据game object的y轴(垂直方向)来绘制,也就是谁y属性值更小,谁更应该在“前方”。
那么问题又来了,这个y属性值怎么来的,它的参考系是?
有两种方案,一个是取sprite的center,另一个是取sprite的pivot(轴心)
pivot默认是取底部中心,当然也可以自定义pivot位置。通过sprite editor可以直接修改。
预制件
Game Object也可以拖到Assets里,作为预制件。即一个Game Object模板,可以快速创建同类型的对象。
如果需要批量修改,只需要编辑这个预制件就行!所有Game Object会一起更改!
比如我修改了预制件的scale,三个Game Object都一起变肥了。
物理系统
Rigidbody
- Mass 质量
- gravity 重力
- Linear Drag 线性阻力(空气阻力),直线运动阻力
- Angular Drag 角阻力,旋转运动阻力
Box Collider 2D
定义一个长方形碰撞器,刚体!
也可以设置Is Trigger,碰撞时只产生事件不产生碰撞效果,以此达到陷阱效果。
甚至连Tilemap也可以添加Box Collider!
Animator
用于控制Game Object的动画,给Game Object添加Animator组件后,可以让其获得动起来的能力。
关系:Game Object → Animator Component → Animator Controller → Parameters & Blend Tree → Motion(Animation Clips) → 可以用Sprite制作由一帧帧图片组成的动画
还可以在C#脚本中,获取animator组件对象,并且修改其定义的Parameters,以此控制动画。
1 | animator = GetComponent<Animator>(); |
Parameter控制Blend Tree
在Blend Tree(状态树)中,可以有多个Motion(运动),2D的Animation里有Pos X和Pos Y两个坐标,可以选取自定义的Parameter与之绑定,如下图:
定义过渡(转变时机)
可以在Animator中定义不同Blend Tree之间转换时的过渡动画,即下方白色的箭头线。
比如C#中控制Game Object由Idle转变为Moving状态时,会经历一次Idle→Moving的过渡动画。
或者直接在过渡动画中用Parameters设定Conditions,当满足条件时,会触发Blend Tree切换。如果Conditions是空,那应该会直接切换。
Cinemachine
普通的Camera对象是一个静态摄像机,如果需要镜头追随,则需要使用Cinemachine包。
在Scene中添加新的Cinemachine后,会自动给Main Camera添加一个CinemachineBrain组件,并关联到Cinemachine对象。
可以添加多个Cinemachine对象(其实都是virtual camera),然后设定其Status为Live或standby。
Cinemachine可以设置边界(绑定一个Collider 2D对象),需要注意给它设置一个不会跟其他Game Object冲突的Layer层。
C#
跟Java很类似,都是面向对象编程。
public暴露的参数,除了基础类型的变量,也可以传入Game Object,比如给玩家sprite传入一个武器prefab,然后在脚本中就可以直接动态实例化该prefab了。
controller
UnityEngine
- transform:对应游戏对象的Transform组件,可以控制对象的位置
MonoBehaviour
- Start():仅在首次调用Update方法前调用。
- Awake():创建对象时会立即调用。
- Update():每一帧都会调用
- FixedUpdate():调用的时间频率是固定的(默认0.02秒一次),独立于帧率。
- OnCollisionEnter2D:当此碰撞器/刚体开始接触时调用(仅限 2D 物理)
对象销毁
Destroy方法