2.2 行走控制
采用1.1节“最最简单的游戏”中所介绍的方式,创建一个名为Test.cs的文件编写代码,控制立方体向左移动。坦克移动的过程与立方体移动的过程相似,也需要创建组件,新建名为Tank.cs的脚本,把它附加到坦克模型上面(如图2-5所示)。
图2-5 新建名为Tank.cs的脚本,把它附加到坦克上面
添加Tank.cs后,程序将自动生成如下代码(代码说明请参加1.1.3节),接着便可以修改这段代码,以实现操控坦克的功能。
using UnityEngine; using System.Collections; public class Tank : MonoBehaviour { void Start() { } void Update() { } }
2.2.1 基础知识
循序渐进的学习过程,是从简单到复杂,逐步改进的过程。最简单的坦克控制,莫过于按下方向键后,坦克沿着对应的方向前进。只要充分了解下面的3项知识,便能够轻松实现对坦克的操控。
1.C#语言
Unity3D支持C#、JavaScript、BOO三种语言格式的代码,由于C#被广泛使用,因此本书也采用C#来编写坦克游戏。如果读者对C#不是很熟悉也没有关系,跟着本书的进度逐步学习即可。推荐阅读笔者的另一本书《手把手教你用C#制作RPG游戏》,该书以开发一款完整的2D RPG游戏为例,介绍RPG游戏中角色、队伍、界面、战斗、物品、商城等系统的原理和实现方法,从而帮助读者更好地理解C#语言和游戏机制。
2. 获取输入操作
最基本的游戏交互莫过于键盘和鼠标,Unity3D提供的Input类封装了键盘、鼠标、触摸屏等多种输入方法,常用的方法如表2-1所示。
表2-1 Input类的常用方法
3. 坐标变换
场景中的每个物体都包含Transform组件,用于调整物体的位置、旋转和缩放。每一个Transform都可以有一个父级,便于分层次地调整上述属性。Transform类常用的属性和方法如表2-2所示。
表2-2 Transform类常用的属性和方法
2.2.2 上下左右移动
了解了上述三点后,便可以编写控制坦克的代码了。在如下的代码中,通过Input.GetKey ()判断玩家按下了哪个按键,在按下“下”键之后,就会通过transform. eulerAngles = new Vector3 (0, 180, 0)使坦克调头,然后通过transform.position +=transform.forward * speed改变坦克的位置。
点击运行按钮,测试游戏效果。如果视角太小,可以调整Camera的角度。如果程序正确,玩家可以通过上下左右4个按键控制坦克的移动(如图2-6所示)。
图2-6 通过上下左右4个按键控制坦克移动
2.2.3 转向和前后移动
接着尝试另一种操作模式。玩家按下“左”或“右”键时,坦克不会移动,只是改变方向,再按下“上”或“下”键时,坦克前进或后退。在实现这种操作模式前,先来看以下3个知识点。
❑获取轴向:Input.GetAxis("Horizontal")为获取横轴轴向的方法,也就是说按下“左”键时,该方法返回-1,按下“右”键时该方法返回1。Input.GetAxis ("Vertical")为获取纵轴轴向的方法,按下“上”键时,该方法返回1,按下“下”键时该方法返回-1。
❑Time.deltaTime:指的是两次执行Update的时间间隔。因为“距离=速度×时间”,所以坦克每次在Update中的移动距离应为“距离=速度*Time.deltaTime”。
❑速度的方向:transform的right、up和forward分别代表物体自身坐标系x、y、z这3个轴的方向,其中forward代表z轴,即坦克前进的方向。由于速度是矢量,因此“速度= transform.forward * speed”指的是在坦克前进的方向上,每秒移动速度值(speed)指定的距离,如图2-7所示。
图2-7 物体自身坐标系
现在修改2.2.2节实现的Tank类,将Update方法替换成如下代码。
运行游戏后,玩家便可以通过左右键控制坦克的方向,上下键控制坦克前进或后退了(如图2-8所示)。
图2-8 控制坦克旋转和前进后退
虽然这种行走模式与真实的坦克还有些差距,但我们先不急着去处理。第三人称视角的游戏,相机会跟随游戏主体移动。坦克游戏也是第三人称视角的游戏,下面需要实现相机跟随的功能。