![Unity3D网络游戏实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/295/847295/b_847295.jpg)
2.2 行走控制
采用1.1节“最最简单的游戏”中所介绍的方式,创建一个名为Test.cs的文件编写代码,控制立方体向左移动。坦克移动的过程与立方体移动的过程相似,也需要创建组件,新建名为Tank.cs的脚本,把它附加到坦克模型上面(如图2-5所示)。
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0047_0002.jpg?sign=1739139085-dYlToZ2ZQIpwTRT6llPJsKx1MR4hTJZy-0-f35f029bd4d50ec940eb8a0cbd40ba4f)
图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类的常用方法
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1739139085-EIDN6KEUxb6yFv2hG2XHPPNDypYifdHQ-0-94bbb19007d6a0e87b326d511c4e87da)
3. 坐标变换
场景中的每个物体都包含Transform组件,用于调整物体的位置、旋转和缩放。每一个Transform都可以有一个父级,便于分层次地调整上述属性。Transform类常用的属性和方法如表2-2所示。
表2-2 Transform类常用的属性和方法
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0049_0002.jpg?sign=1739139085-REU0d5U39jz6QmVx8kgZy1XYI2G9rMWY-0-8326c0c51acdc9845bba6e0e9d96565e)
2.2.2 上下左右移动
了解了上述三点后,便可以编写控制坦克的代码了。在如下的代码中,通过Input.GetKey ()判断玩家按下了哪个按键,在按下“下”键之后,就会通过transform. eulerAngles = new Vector3 (0, 180, 0)使坦克调头,然后通过transform.position +=transform.forward * speed改变坦克的位置。
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0050_0002.jpg?sign=1739139085-dUXGtnP7YgcFq7sPTieMFWS0GDZKy9zs-0-c6f616f95bdcf55f1b31efd88412fe9d)
点击运行按钮,测试游戏效果。如果视角太小,可以调整Camera的角度。如果程序正确,玩家可以通过上下左右4个按键控制坦克的移动(如图2-6所示)。
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0051_0002.jpg?sign=1739139085-DigI6QzKo6Gv0mNSet5vNwMlKAGndmAR-0-299c1b7465203aa0eefd1c1ba2b4d22f)
图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所示。
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0052_0001.jpg?sign=1739139085-sgfeJbnRjAcwDdI9ePcOBfGZr5JEKD6S-0-fd8bea91b26a7ab19fb8e3ed421c2767)
图2-7 物体自身坐标系
现在修改2.2.2节实现的Tank类,将Update方法替换成如下代码。
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1739139085-06ej09oa3MA3UMLsToxZtIpdKwbG36ip-0-90f8f3a26d11aefc76c12be71ce30608)
运行游戏后,玩家便可以通过左右键控制坦克的方向,上下键控制坦克前进或后退了(如图2-8所示)。
![](https://epubservercos.yuewen.com/FABC1B/6158700004756901/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1739139085-3vAG0YR9gfkojIyPQ8TW95c9mEbkRBtP-0-2820dd434939dd4f7950f5afee8e5538)
图2-8 控制坦克旋转和前进后退
虽然这种行走模式与真实的坦克还有些差距,但我们先不急着去处理。第三人称视角的游戏,相机会跟随游戏主体移动。坦克游戏也是第三人称视角的游戏,下面需要实现相机跟随的功能。