游戏制作之路(16)子弹发射的几个函数

前面文章介绍实现制作子弹和发射子弹,也达到相应效果,但是你也许看到代码里,还有一些不明白的地方,本文就来解决这个问题。比如代码里有这么一行:
Invoke("Kill", life);
这行代码,对于你也许很陌生,因为没有看到这个函数Invoke(),这个函数定义如下:
public void Invoke(string methodName, float time);
这个函数返回值为空,输入两个参数,第一个参数methodName是一个函数的名称,这个函数不能有参数;第二个参数time是延时多长时间后调用。上面这行语句,它的意思就是延时life时间之后调用Kill()函数,也就是5秒钟之后把对象删除掉。
使用Invoke方法需要注意以下三点:
1、它应该在Start,Update,FixUpdate,LateUpdate,还有OnGUI中被调用
2、Invoke中传递的方法不能是含有参数的方法、
3、当Time.ScaleTime = 0时,Invoke()无效,调用不到Invoke方法

如果想重复调用一个函数,可以使用下面的函数
public void InvokeRepeating(string methodName, float time, float repeatRate);
前面两个参数与上面的函数是一样的,最后面的参数repeatRate是表示间隔多少秒再执行一次。
InvokeRepeating("SendMessage",2,3);
表示在“2s”以后开始调用第一次,之后每隔“3s”重复调用一次。

接着下来,我们看这一句语句:
if (Input.GetButtonDown("Fire1") && Time.time > lastFireTime + reloadTime)
这是一个条件判断语句,第一个条件是获取鼠标的左键是否按下,第二个条件就是冷却时间是否到达,如果两个条件满足了,就可以克隆一个子弹,发射出去。Input.GetButtonDown函数是用来获取参数里的虚拟按键是否按下,为什么要使用虚拟按键呢?因为unity的游戏代码是可以通用PC、手机等不同平台,在PC上有鼠标作为输入,在手机上就是触屏或者按键了。在这里参数名称为Fire1,这是在输入管理器里定义的。比如我这里缺省定义如下图:

游戏制作之路(16)子弹发射的几个函数

在这里可以看到,左Ctrl键,或者鼠标左键都可以当作开火键,同时也可以是游戏手柄,这样更加通用化。

接着来看一下时间,Time.time:(只读)表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。当上一次发射子弹的时间加上冷却时间还大于当前时间时,就不能发射子弹出去。

在大括号内,就是克隆和发射代码了。首先使用GameObject类型定义一个对象go,保存克隆出来的子弹对象,而克隆的过程,就是使用函数Instantiate(),它是从预制件rocketPrefab里来复制出来,并且设置go的位置和方向。因此来查看一下函数Instantiate()的定义:

public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);

original是表示被克隆的对象,position是表示新对象所在的位置,rotation是表示新对象角度方向。有这些知识,可以理解下面这行代码:

 GameObject go = (GameObject)Instantiate(rocketPrefab, rocketBarrel.position, Quaternion.LookRotation(rocketBarrel.forward));

rocketBarrel.position的位置,就是头所在的位置,因此子弹是从头部进行发射出去。rocketBarrel.forward的方向,就是双眼睛向前的方向。在这里有一个新函数Quaternion.LookRotation,它的定义如下:

Quaternion LookRotation(Vector3 forward, Vector3 upwards);
这个函数就是根据对局部坐标轴的描述, 构造对应的代表旋转程度的四元数。
forward:向前向量, 即z轴的朝向。但是仅仅有z轴的朝向是不够的, 因为对象还可能绕着z轴旋转, 所以需要upwards来约束。
upwards:向上向量, 注意, 此向量不需要是精确的y轴的朝向(即不需要与forward垂直), 但是, 此向量应该处于z轴、y轴平面上。

在这里Quaternion.LookRotation(rocketBarrel.forward),就是根据头的旋转角度来构造一个四元数,以便新创建的子弹是朝着眼睛的方向远离而去的。至于四元素有什么作用,以及怎么使用四元素,这个需要学习更多相关数学的知识。

也可以查看这个文章:

https://blog.csdn.net/caimouse/article/details/55505233

在创建完子弹之后,调用Physics.IgnoreCollision函数,这个函数是让两个物理碰撞器之间忽略碰撞,在这里第一个参数是获取脚本绑定的角色对象,后面go对象,也就是让角色与子弹之间不要计算碰撞关系。

Physics.IgnoreCollision(GetComponent<Collider>(), go.GetComponent<Collider>());

最后一行代码:

lastFireTime = Time.time;

这行就是记录子弹最后发射出去的时间,以便计算冷却时间。

到这里就把这个例子的代码解释清楚了,可见要开发一个简单的游戏,就需要深入领会向量、四元数、碰撞系统等知道。

Arduino入门基础
http://edu.csdn.net/course/detail/4931
Unity5.x游戏基础入门
http://edu.csdn.net/course/detail/4810
TensorFlow API攻略
http://edu.csdn.net/course/detail/4495