2.1 玩家的坦克
在为玩家的坦克编写脚本之前,我们先看看如何设置PlayerTank游戏对象。我们的坦克对象基本上是一个带有刚体组件和盒碰撞器组件的简单网格(Mesh)。坦克对象不是一个单独的网格,而是由坦克和炮塔两个网格组成。为了允许炮塔对象根据鼠标运动独立转动,我们将炮塔设为坦克的子对象。同时,因为它是坦克的子对象,所以无论坦克去哪,它都会一直跟随坦克。然后创建一个空游戏对象作为SpawnPoint转换。当我们射出一颗子弹时,这将会作为一个位置参照点。我们还需要给坦克对象赋一个Player标签。以上就是坦克实体的设置方法。接下来将学习控制器类。
坦克实体
2.1.1 PlayerTankController类
这个类将成为玩家控制坦克对象的主要手段。我们将使用W、A、S和D键移动与操纵坦克,用鼠标左键瞄准与射击炮塔对象。
Unity只知道如何在标准QWERTY键盘布局下工作。对于我们这些使用不同类型键盘的玩家,所要做的就是模拟使用QWERTY键盘的情况,然后一切问题迎刃而解。本书默认使用QWERTY键盘和鼠标左键为主按键的两键鼠标。
2.1.2 初始化
我们的TankController类的属性如下。首先,建立Start函数和Update函数。
PlayerTankController.cs 文件如下所示:
坦克实体的第一个子对象是炮塔对象,炮塔对象的第一个子对象是bullet-SpawnPoint。Start函数找到这些对象,然后将它们赋值到各自对应的变量。在我们创造子弹对象之后,就赋值子弹变量。同时我们还会包含Update函数,并在其中调用即将创建的UpdateControl函数和UpdateWeapon函数。
- 射击子弹
每当玩家点击鼠标左键时,我们都会检查自上次射击到现在过去的时间是否超过了武器的射击速率。如果是,那么在SpawnPoint变量的位置创建一个新的Bullet对象。通过这种方法,我们可以避免没有任何限制的连续射击行为。 - 控制坦克
游戏中玩家要使用鼠标控制炮塔(Turret)对象的旋转,这个部分有点棘手。我们的摄像机(Camera)将会俯视战场。随后,我们将基于mousePosition对象在战场上的位置,使用光线投射的方法来确定要转动的方向。
通过光线投射来使鼠标瞄准
它的工作流程如下:
1)设置一个平面,与玩家的坦克相交于一个向上的法线。
2)在屏幕空间中以鼠标位置发射一条射线(在上图中假设我们俯视着坦克)。
3)找到这条射线与平面的交叉点。
4)最后,找到从当前位置到该交点所要旋转的角度。
然后检查按键输入,并据此相应地移动或旋转坦克。