目录
前期准备
项目官方教程地址
项目特点
下载并导入项目
1 创建玩家
1.1 创建玩家和场景
Unity中2D素材的使用
1.2 了解精灵渲染器 Sprite Renderer
1.3 精灵的静态和动态
2 移动玩家
2.1 尝试创建一个移动脚本
关于Unity中移动的距离单位
游戏中的控制方式
Unity输入系统中的输入设置
2.2 键盘输入控制移动
实现水平控制
实现垂直控制
调整时间和帧率
以单位/秒表示移动速度
前期准备
项目官方教程地址
Ruby's Adventure:2D 初学者 - Unity Learn
项目特点
可以让我们:
- 学会使用2D资源
- 学习简单的2D RPG 游戏制作
- 学习创建并控制角色(Script)
- 学习设置sprite
- 学习制作一些简单特效
下载并导入项目
使用到的资源保存地址
2D Beginner: Tutorial Resources | 教程 | Unity Asset Store
下载并在Unity中导入即可。
下面就开始正式的学习。
1 创建玩家
主角和第一个脚本 - Unity Learn
1.1 创建玩家和场景
进入官方第一节教程,并下载玩家主角Ruby的图片,下载的格式是PNG。由于我们的项目是2D的,需要将Texture Type改成Sprite(精灵),才能被Unity所使用。
新建一个场景命名为MainScene,并将修改类型后的Ruby图片拖入MainScene场景中。
Unity中2D素材的使用
刚刚做的一个简单的导入图片的过程,其实就是一次使用2D素材的过程,Unity中2的素材的使用通常要经过以下过程
PNG(2D图片格式) ----> Sprite ----> GameObject
1.2 了解精灵渲染器 Sprite Renderer
Ruby这个游戏对象除了初始的Transform变换组件,还会有一个Sprite Renderer组件。
我写了另一篇介绍其属性的博客:【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer
1.3 精灵的静态和动态
我们现在通过导入一个PNG转换成sprite后,得到的Ruby是一个静态精灵,教程中老师还介绍了动态精灵,这个后续再了解。
2 移动玩家
Untiy移动的话应该是基于Transform组件进行操作的,这时候就需要挂一个移动脚本了!再在脚本中给创建的Ruby添加运动。
2.1 尝试创建一个移动脚本
给刚刚创建的游戏对象Ruby新建一个RubyController脚本。
先尝试挂一个在x轴自动移动的脚本,看看情况。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
// 每帧都会执行一次Update函数
void Update()
{
//transform获取当前游戏对象的transform组件的值
Vector2 position = transform.position;
position.x += 0.1f;
//再赋值给游戏对象的transform
transform.position = position;
}
}
关于Unity中移动的距离单位
设置游戏对象时,经常会有“设置对象位置为x轴XX个单位,y轴XX个单位”,Unity中并没有规定具体多长是1米/1厘米,根据需要自己规定就行。
游戏中的控制方式
- 鼠标键盘
- 手机触屏
- 手柄游戏
- 体感游戏(水果忍者
- 可穿戴设备:VR
- 声控
本次创建的游戏将通过键盘输入来控制玩家移动,此时就需要使用到Unity的输入系统。输入系统包括输入设置和输入代码。
Unity输入系统中的输入设置
输入设置就是Unity中定义键盘的按键的作用,可以由Edit -> Project Settings -> Input Manager查看默认设置。
关于Input Manager官方介绍文档:Input Manager - Unity 手册
对于Input Manager和Input类我进行了简单的学习总结:【Unity入门计划】基本概念(7)-Input Manager&Input类
2.2 键盘输入控制移动
这里不再是跟之前那样,让Ruby逐帧自己移动了,现在通过调用API的方式实现键盘输入控制Ruby的移动。
实现水平控制
需要修改脚本中的Update函数:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
// 每帧都会执行一次Update函数
void Update()
{
//声明新变量
//获取水平轴并储存在新变量中
float horizontal = Input.GetAxis("Horizontal");
Debug.Log(horizontal);
Vector2 position = transform.position;
//对x轴移动距离做了细微的更改
position.x += horizontal * 0.1f;
transform.position = position;
}
}
这里实现了:
- 按下左键,轴为-1,则Ruby向左移动0.1f
- 按下右键,轴为1,则Ruby向右移动0.1f
- 不按任何键,轴为0,Ruby原地不动
实现垂直控制
对于y轴也添加相应操作:
void Update()
{
//声明新变量
//获取水平轴并储存在新变量中
float horizontal = Input.GetAxis("Horizontal");
//获取垂直轴
float vertical = Input.GetAxis("Vertical");
Vector2 position = transform.position;
//对x轴移动距离做了细微的更改
position.x += horizontal * 0.1f;
//对y轴也做相应更改
position.y += vertical * 0.1f;
transform.position = position;
}
调整时间和帧率
可以通过调整是否开启垂直同步以及限制帧率的方式提升/降低游戏帧率FPS。
关于帧率设置可以参考以下文章:
Unity3d 帧率设置 及在游戏执行时显示帧率 - lcchuguo
以单位/秒表示移动速度
目前,由于是在Update()函数中更新的Ruby的位置信息,因此当前Ruby的移动速度是单位/帧,如何让他以单位/秒的速度运行呢?
需要将速度再乘以Unity渲染一帧所需时间来更改移动速度,例如:如果当前Unity以每秒10帧速度渲染,则每帧耗时0.1秒,乘以0.1秒后移动速度就成了单位/秒。
Unity中Time.deltaTime这个API能帮助我们获得从最后一帧到当前帧(只读)的间隔时间,其中deltaTime是Time中的一个变量,表示增量时间。
加上后:
void Update()
{
//声明新变量
//获取水平轴并储存在新变量中
float horizontal = Input.GetAxis("Horizontal");
//获取垂直轴
float vertical = Input.GetAxis("Vertical");
Vector2 position = transform.position;
//对x轴移动距离做了细微的更改
position.x += horizontal * 0.1f*Time.deltaTime;
//对y轴也做相应更改
position.y += vertical * 0.1f*Time.deltaTime;
transform.position = position;
}
运行游戏,会发现Ruby的移动速度变慢了!因为我们把速度改成了单位/秒,也就是说当前我们每秒仅移动了0.1个单位,这当然会很慢。如果将0.1f改成3.f,移动速度将会快很多。