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

栏目: 后端 · 发布时间: 5年前

内容简介:前面文章介绍实现制作子弹和发射子弹,也达到相应效果,但是你也许看到代码里,还有一些不明白的地方,本文就来解决这个问题。比如代码里有这么一行:Invoke("Kill", life);这行代码,对于你也许很陌生,因为没有看到这个函数Invoke(),这个函数定义如下:

前面文章介绍实现制作子弹和发射子弹,也达到相应效果,但是你也许看到代码里,还有一些不明白的地方,本文就来解决这个问题。比如代码里有这么一行:

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;

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

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


以上所述就是小编给大家介绍的《游戏制作之路(16)子弹发射的几个函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Where Wizards Stay Up Late

Where Wizards Stay Up Late

Katie Hafner / Simon & Schuster / 1998-1-21 / USD 16.00

Twenty five years ago, it didn't exist. Today, twenty million people worldwide are surfing the Net. "Where Wizards Stay Up Late" is the exciting story of the pioneers responsible for creating the most......一起来看看 《Where Wizards Stay Up Late》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具