下载Unityhub,下载合适的引擎版本
跟着社区学习教程做一个简单的2D游戏Ruby's Adventure:2D 初学者 | Unity 中文课堂 (u3d.cn)
使用2D核心模版创建项目,在资源商店将教程资源添加到"我的资源",在Unity的package manager窗口导入资源进项目,注意因为版本的原因可能需要在package manager里更新一些插件.
窗口
默认窗口
顶部菜单栏
File:可以新建/打开/保存场景/项目,设置Build选项
顶部工具栏
运行/暂停/运行一帧
Project
- 显示项目所有资源
- 可以在这里创建对象
- 预制件,将对象存为预制件,可以在运行中动态的实例对象
Inspect
- 显示选中对象的组件/属性
- 下方Add Component按钮添加组件,也可以输入脚本名创建脚本
- 拖入脚本添加脚本组件
Hierarchy
- 打开一个Scenes,在此显示所有对象,通过缩进表示对象间的层级关系
- 左键选择对象
- 右键Create或者拖入资源添加默认位置的游戏对象
Scene
- 场景布局
- 右上2D可控制视图模式,此处应保持按钮亮起
- 左侧工具栏,飞跃/对象移动/旋转/缩放/矩形工具/变形
- 左键选中对象,右键飞跃
- 拖入资源,在拖入位置生成对象
Game
- 游戏运行预览窗口
- 更改摄像机属性调整显示区域
Console
- 游戏信息显示窗口,可以点击弹出浮动窗口,游戏内检测到的错误都会在这里显示,也可以显示自定义信息
- 顶部按钮Collapse:折叠重复信息
可添加窗口
Package Manager
- 顶部菜单栏Windows下拉列表点击Package Manager打开
- 更新导入包,包括素材包
Tile palette
- 顶部菜单栏Windows下拉列表2D > Tile palette打开
- Create New Palette:新建面板
- 拖入精灵生成瓦片对象
- 工具栏:选择/移动/绘制/填满箱子/吸管/擦除/填满
- 选中瓦片并使用绘制工具,可以在Tilemap上绘制地图
Sprite Editor
- 选中图片文件,Inspect窗口点击Sprite Editor按钮打开
- Slice:切割图片
Animation
- Create创建新动画
- Add Property添加属性
- 也可以直接拖入精灵创建连续帧
Animator
- Parameters:添加各种属性来控制动画
- Blend Tree:混合树
系统模版对象
2D Object->Tilemap:瓦片地图
精灵
- 由Unity支持的图像文件可以生成精灵,默认剪辑全部范围生成一个精灵
- 拖动精灵到Scene或Hierarchy窗口生成有Sprite Renderer组件并引用此精灵,位置为拖入位置或者默认位置的对象
- Sprite Mode:Single整体生成一个精灵,Multiple切割多个精灵
- Pixels Per Unit:每单位像素
- Mesh Type:填充类型
- Sprite Editor:打开Sprite Editor窗口,对图片与精灵做多样操作
组件
- Transform:x/y/z方向的位置和比例和大小
- Sprite Renderer:在对象位置处绘制一个精灵,Sprite Sort Point设置锚点是对象中心还是精灵锚点,Draw Mode绘制模式
- RigidBody2D:物理系统,Gravity Scale重力,Freeze Rotation禁用旋转,Sleeping Mode静止时是否休眠
- BoxCollider2D:矩形碰撞体,当两个碰撞体层级有碰撞且不为Trigger时,可以发生碰撞事件,勾选Is Trigger可以发生触发事件,Auto Tiling随精灵变化改变
- Tilemap Renderer:瓦片地图,Order in Layer设置在指定层的渲染顺序
- Tilemap Collider 2D:方便的为瓦片地图添加碰撞
- Composite Collider 2D:整合碰撞体,减少计算
- Animator:动画播放组件
- Particle System:粒子系统
- Audio Listener:接收声音
- Audio Source:播放声音
- 脚本:脚本名一定要和类名相同
脚本
- 继承MonoBeHaviour表示这是一个组件类型的类,默认引用了挂载脚本的对象
- Awake(void):被创建时调用
- Start(void):仅执行一次,如果对象运行开始时处于活动状态,则在Awake->OnEnable后调用,运行后再激活则比OnEnable先执行
- OnEnable(void):每次激活时都会调用
- Update(void):每帧执行一次
- FixedUpdate(void):以固定的时间间隔执行
- Vector2:有x/y两个成员,一般用于表示位置/向量/宽高
- transform
transform.position;//Transform组件的位置信息 transform.position.magnitude;//位置举离世界中心距离
- Input
Input.GetAxis(string);//返回玩家对指定控件操作的值 Input.GetKeyDown(KeyCode);//接受指定键的按下指令
- Debug
Debug.Log(string);//在Console窗口输出string
-
QualitySettings
QualitySettings.vSyncCount;//游戏刷新频率与显示器刷新频率垂直同步设置
-
Application
Application.targetFrameRate;//帧率
-
Time
Time.deltaTime;//实时帧渲染时间
-
GetComponent<Type>():获取组件引用
-
RigidBody2D
RigidBody2D.MovePosition(Vector2);//移动到指定位置,发生碰撞则停止 RigidBody2D.AddForce(direction * force);//根据方向和力使物体运动 RigidBody2D.simulated;//物体系统模拟状态
-
Mathf
Mathf.Clamp(int value, int min, int max);//返回value值,如果value超出范围,则范围最大/小范围值 Mathf.Approximately(float, float);//屏蔽浮点存储的不精确判断两个值是否相等
-
OnTriggerEnter2D(Collider2D)//Collider与Trigger开始接触时执行
-
OnTriggerStay2D(Collider2D)//Collider与Trigger接触时执行
-
OnCollisionEnter2D(Collision2D)//Collision与Collision开始接触时执行
-
Animator
Animator.SetFloat(string, float);//设置Parameters对应浮点数的值 Animator.SetTrigger(string);//设置Parameters对应逻辑数的值
操作
操作顺序
- 拖动素材里Art->Sprites文件下RubySheet文件生成的精灵RubyRunDown1到Scene窗口里,生成人物对象,为对象设置name:Ruby.
- 在资源文件夹Assets下新建Scripts文件夹用于保存脚本,并创建新脚本RubyController,然后将脚本拖动到对象Ruby上.
- 编写脚本,使用方向键盘控制Ruby的(Transform)坐标移动,使用Time.deltaTime保持不同帧率下的移动速度一致.
- 在Hierarchy窗口为场景添加Tile Palette对象,编辑瓦片组件,先将地形素材切割成精灵,然后打开Tile Palette面板,新建Palette,将需要的精灵放入,然后使用绘制功能用瓦片填充地图
- 使用Environment里的素材精灵生成一个对象,然后将对象拖入素材文件夹生成预制体,使用这些预制体装饰地图
- 将瓦片地图的层级改为Default,值-10,然后在Edit>Project Setting>Graphics里将Transparency Sort Mode的值改为Custom Axis,让游戏以Y轴顺序渲染.
- 修改角色和预制体的Sprite Sort Point属性为Pivot,并设置精灵的Pivot到脚部或根部,为角色和预制体添加合适形状的Collider 2D组件,并细调碰撞框,使碰撞看起来合理.为人物添加RigidBody 2D,设置重力为0,勾选Constraints下的Freeze Rotation.
- 更改脚本RubyController里移动方法,使用RigidBody的Move方法,在固定帧率下物理计算完成后再移动位置,避免物理系统造成抖动.
- 为Tilemap添加Tilemap Collider 2D组件,选中所有非水的瓦片,将Collider Type设置为None,然后再添加Composite Collider 2D组件,然后设置Tilemap Collider 2D组件的Used By Composite开关勾选上,将瓦片碰撞箱视为一个整体,并把自动添加的RigidBody 2D组件的的RigidBody Body Type属性设置为Static,减少物理运算.
- 在RubyController脚本里添加maxHealth、currentHealth和speedX、Y属性,并将maxHealth、speed设置为public,这样以后更改最大生命值和速度就可以不用打开脚本直接在Unity的Inspector面板更改
- 声明一个ChangeHealth函数,用于更改生命值并编写定义生命值变动触发的事件,使用Mathf.Clamp(action, min, max)确保生命值变化不会超出范围
- 添加Canvas,再给Canvas添加Image子对象Health,并拖入UIHealthFrame的精灵,设置锚点为左上角,并为其添加Image子对象,精灵设置为CharacterPortrait并设置锚点为四角,再为Health添加一个子对象Mask,设置大小位置刚好覆盖完血条,并添加Image子对象,精灵设置为UIHealthBar,设置锚点和大小能刚好填充Mask,然后为Mask添加Mask组件,取消Show
- 为Health添加脚本UIHealthBar,声明一个public Image并引用Mask,编写一个SetValue函数通过传入的血量比例来控制Mask的宽度
- 编辑CollectibleHealth预制体和Damageable预制体,添加Collider组件并设置为Trigger,为Damageable设置平铺
- 为两个预制体编写脚本,在碰撞事件检测到Ruby时调用RubyController脚本的ChangeHealth函数和UIHealthBar脚本的SetValue函数,CollectibleHealth要在进入碰撞阶段判断是否满血,然后回血并且自动销毁,Damageable要在保持碰撞阶段持续使Ruby扣血,但是要设置一个冷却时间,每隔多久触发一次
- 编辑Robot预制体,添加RigidBody和Collider组件,模仿Ruby设置属性
- 为Robot添加RobotController脚本,控制Robot按预定速度进行移动,模仿Damageable编写Ruby发生的碰撞事件触发Ruby的ChangeHealth,添加计时改变移动方向功能
- 为Robot添加Animator组件,新建Controller文件Robot,并拖入Animator中调用,打开Animation窗口,利用MrClockworkSheet的精灵图集制作4个方向的行动动画,使用混合树控制动画的切换
- 为Ruby添加Animator组件,并拖入素材中的Controller,编写Ruby和Robot的脚本,控制Animator的Parameters的值的改变
- 使用CogBullet的精灵创建预制体,添加RigidBody和Collider组件,取消重力,设置碰撞框,设置层Character,为Ruby设置Player层,为瓦片地图设置Ground层,设置里取消Character层对Player和Ground层的碰撞
- 为预制体CogBullet添加脚本,在Awake函数里设置定时销毁,定义Launch函数给RigidBody添加力,编写碰撞函数来销毁CogBullet和更改碰撞到的物体的状态
- 编写Ruby脚本,接受键盘输入来触发发射齿轮事件,实例化CogBullet预制体并施加运动,添加Robot的Fixed动画,更改Robot脚本,添加Fixed属性用于被CogBullet碰撞时修改,当Fixed为True时转为Fixed动画并停用RigidBody
- 下载Cinemachine包,新建虚拟摄像机,设置跟随Ruby,新建空对象添加Collider,设置碰撞范围为地图边界,并设置层Confiner,取消与其它层的碰撞,为虚拟摄像机添加CinemachineConfiner并使用刚才创建的碰撞体
- 创建Particle System对象SmokeEffect并保存为预制体,设置相应的属性和精灵,使粒子达到理想效果,然后打开Robot预制体,添加子对象SmokeEffect,编写Robot脚本,定义public ParticleSystem变量引用SmokeEffect,并在Fixed事件执行其Stop方法
- 使用Jambi的三个精灵自动生成动画并创建对象,存为预制体,添加Collider,设置NPC层,添加Canvas子对象创建对话框,添加Image子对象,设置UIDialogBox精灵,添加Text-TextMeshPro子对象,设置文本
- 为Jambi编写NonPlayerCharacter脚本,编写启用子对象Canvas的方法,并在Start和Update中设置Canvas的取消启用功能,编写RubyController脚本,监听键盘按下"Q"事件,使用射线检测Jambi,并触发Canvas启用方法.
- 将摄像机的Audio Listener移除,为摄像机添加子对象Listener,设置Position的Z值为10,并添加Audio Listener组件.创建一个空对象BackgroundMusic,添加Audio Source组件,引用2D MUSIC LOOP并勾选Loop选项,为Ruby和Robot添加Audio Source组件
- 编辑Ruby,Robot和CollectibleHealth的脚本添加public AudioClip属性,并引用相应的音频,编写方法,在适当时机使Ruby和Robot播放相应音频
- 在Player Setting里设置Build的文件夹位置,配置相关设置,然后Build