在前面介绍了怎么样使用脚本来定时控制物体移动,接着下来我们来实现玩家控制物体移动的功能,意味着需要键盘里获取输入,然后再更新物体的位置。这种手法是非常见的,比如RPG游戏里,就是控制角色在移动,与这里介绍的原理是一样的。其实移动,就是改变三维世界里物体坐标的位置,由于三维世界是三个坐标表示,因此采用向量来计算,至于向量是什么,如果不懂,赶紧补习高数,查看空间解析几何部分。由此看来,游戏开发是一个培训数学应用的好项目,好方法。赶紧让你的小孩子来创建游戏,这样会逼着他们去学习数学的,就不会问学习数学有什么用了。
在unity里,使用类Vector3来表示空间的一个点,也是一个向量,因此它有三个坐标轴(x,y,z)。这三个坐标轴的方向如下:
详细可以查看unity的文档: https://docs.unity3d.com/ScriptReference/Vector3.html
// x = 0,y = 1, z = 0
Vector3.up; // 表示世界坐标系中 Y 轴正方向上的单位向量
// x = 0,y = -1, z = 0
Vector3.down; // 表示世界坐标系中 Y 轴负方向上的单位向量
// x = -1,y = 0, z = 0
Vector3.left; // 表示世界坐标系中 X 轴负方向上的单位向量
// x = 1,y = 0, z = 0
Vector3.right; // 表示世界坐标系中 X 轴正方向上的单位向量
// x = 0,y = 0, z = 1
Vector3.forward; // 表示世界坐标系中 Z 轴正方向上的单位向量
// x = 0,y = 0, z = -1
Vector3.back; // 表示世界坐标系中 Z 轴负方向上的单位向量
Vector3.zero; // 表示原点
在前面的项目里,你测试时,如果发现它运行太慢,怎么办呢?这时就需要给它一个变量,这变量用来改变它的速度。在代码里添加一个变量如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BasicMovement : MonoBehaviour {
public float speed = 10.0f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.position += Vector3.right * Time.deltaTime;
}
}
可以看到这行代码:
public float speed = 10.0f;
这行代码使用公共访问public,数据类型为浮点数float,变量名称为speed,它的初始速度为10.0f。当你在代码写完这个变量,如果没有出错,会在inspector界面多一个属性设置,如下图:
修改这个地方,也可以改变物体运行的速度。在这里要注意一点,公共属性,没有设置隐藏的类成员变量都会在这里显示,在这里显示的变量,都是会序列化的。也就是说脚本里定义第一次的值,只起到拷贝到序列化的作用,后面要修改这个值的初始化值,要从这里来修改。如果要隐藏一个公共变量不在这里显示,可以使用别的方法来隐藏。
接着下来,我们要构造一个手动输入变量,以便可以通过输入来控制物体的移动。写下面这行代码:
Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
在这行代码里,可以看到使用Input对象,它代表里unity里所有输入交互接口,比如鼠标、键盘、游戏手柄、手机触屏等等,在这里使用函数GetAxisRaw("Horizontal")来获取水平方向移动,GetAxisRaw("Vertical")获取垂直方向移动,相当于键盘的WASD,或者方向键的四个方向。由于input当按下时,就会构造一个三维向量,根据这个三维向量的值,就可以随着时间判断运行方向了。
这时完整的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BasicMovement : MonoBehaviour {
public float speed = 10.0f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
transform.position += input * speed * Time.deltaTime;
}
}
当你再次点下运行按钮,然后按下键盘的方向键,就可以控制物体向四个方向运动了,这就是游戏里的角色控制功能。
本课就到这里结束,现在可以愉快地玩这个物体移动了。