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

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

内容简介:前面文章介绍实现制作子弹和发射子弹,也达到相应效果,但是你也许看到代码里,还有一些不明白的地方,本文就来解决这个问题。比如代码里有这么一行: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)子弹发射的几个函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Introduction to Graph Theory

Introduction to Graph Theory

Douglas B. West / Prentice Hall / 2000-9-1 / USD 140.00

For undergraduate or graduate courses in Graph Theory in departments of mathematics or computer science. This text offers a comprehensive and coherent introduction to the fundamental topics of graph ......一起来看看 《Introduction to Graph Theory》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具