目录

前期准备

项目官方教程地址

项目特点

下载并导入项目

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
  • 学习制作一些简单特效

下载并导入项目

unity的global volume教程 unity ventures_帧率

使用到的资源保存地址

2D Beginner: Tutorial Resources | 教程 | Unity Asset Store

下载并在Unity中导入即可。 

下面就开始正式的学习。


1 创建玩家

主角和第一个脚本 - Unity Learn

1.1 创建玩家和场景

进入官方第一节教程,并下载玩家主角Ruby的图片,下载的格式是PNG。由于我们的项目是2D的,需要将Texture Type改成Sprite(精灵),才能被Unity所使用。 

unity的global volume教程 unity ventures_c#_02

 新建一个场景命名为MainScene,并将修改类型后的Ruby图片拖入MainScene场景中。

unity的global volume教程 unity ventures_c#_03

Unity中2D素材的使用

刚刚做的一个简单的导入图片的过程,其实就是一次使用2D素材的过程,Unity中2的素材的使用通常要经过以下过程

PNG(2D图片格式) ----> Sprite ----> GameObject

1.2 了解精灵渲染器 Sprite Renderer

Ruby这个游戏对象除了初始的Transform变换组件,还会有一个Sprite Renderer组件。

unity的global volume教程 unity ventures_c#_04

我写了另一篇介绍其属性的博客:【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查看默认设置。

unity的global volume教程 unity ventures_c#_05

关于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,移动速度将会快很多。