【个人案例分享】动态注册事件与创建触发器
02/19246 浏览案例分享
废话阶段:
一般我们刚接触星火的时候,使用触发编辑器里的触发器都是直接通过新建触发器来创建,然后往里面添加预先设置好的事件。

通常创建触发器与事件的方式
虽然能做出游戏,但这样子的触发器是全局的,后面想添加新的玩法或者内容可能会因为之前的全局触发器导致影响后面的新玩法或者内容。可能会有人想到用打开/关闭触发器或者移除触发器来控制,但这样子仍然不是很方便,所以有没有什么方法可以让某个触发器在必要的时候出现,不必要的时候不在。所以我找到了星火提供的一个方法:从函数创建触发器。
一、动态添加事件
首先需要了解的是动态添加事件。
虽然创建了触发器,但是没有事件触发器就不会执行,而星火也提供了给触发器添加事件这样子的方法,可以让我们在程序执行过程中给某个触发器添加事件,可以通过这种方式也可以实现触发器在必要的时候使用,不必要的时候不用的情况。
假设我要自己做一个功能,需要在消灭30个任意单位后出现BOSS单位,那么就可以通过这种方式来给触发器添加单位死亡的事件,然后记录单位死亡的数量,数量达到后就创建BOSS单位。
首先我们创建一个触发器,这个触发器用来处理单位死亡,然后我们需要添加一个单位死亡的事件,但是要把事件注释掉,这里是为了方便拿到事件里面的参数。

添加一个处理单位死亡的动作
然后我们就简单处理一下单位死亡召唤BOSS的功能,这里用一个变量来记录单位死亡的数量,然后在这个触发器里面统计数量,在数量达到10之后,就在地图上创建BOSS单位。

用来创建BOSS的触发器
然后我们做一个创建小怪的触发器,同时这里需要给上面的触发器添加事件,并且死亡的单位需要具体到这个创建单位的实例,这样子每次创建小怪的时候,这个触发器都会多一个单位死亡的事件(触发器可以拥有多个事件)

用来创建小怪的触发器

这样子的预期效果就是我们每次按下Q键都会创建小怪,同时给触发器添加事件,每次小怪死亡都会触发事件,然后记录死亡数量并判断是否召唤BOSS。效果如视频演示:

悄咪咪创建了BOSS单位
可以看到击杀完野猪后创建了另外一个单位。说明动态添加事件是成功的
二、动态创建触发器
上面说了给触发器动态添加事件,那接下来就该了解一下动态创建触发器(从函数创建触发器),也是这个帖子的主要内容。
从函数创建触发器可以让某些触发器只在某个阶段产生,例如我做了一个闯关类的游戏,每个关卡有不同的机关以及不同的功能,那么我每个关卡可能就有不同的触发器与事件,如果我按照正常做法去创建全局触发器,那么不同关卡的触发器可能会互相影响从而出现难以控制的BUG。
所以就需要在进入关卡后才创建触发器,同时添加事件。
这里用上面的功能来演示从函数创建触发器的用法:
1. 创建一个全局触发器,为了模拟进入关卡需要触发的动作,这里用游戏开始时(事件)来模拟进入关卡时触发的事件。

创建一个全局触发器
2. 在这个全局触发器里动态创建触发器,记录单位死亡一定数量后创建BOSS单位(模拟上面的例子)。
3. 在这个全局触发器里动态创建第二个触发器,然后添加按下按键的事件(模拟上面的例子),按下按键后创建怪物,同时给第一个触发器添加事件。
创建第一个触发器(记录单位死亡),记录单位死亡后创建BOSS单位

使用从函数创建触发器的方法
从函数创建触发器需要的参数(图里的空值)是一个函数变量,这里直接用星火提供的匿名函数:


这样子就创建了一个触发器,然后触发器需要拿到事件里的参数。这里需要给函数添加两个参数,第一个参数的类型是任意,第二个是简单表<字符串,任意>,这两个参数必须设置,第一个是参数是this:void,这里不用去管他是什么意思(因为能用就行),而且也用不上,第二个才是我们需要用的,也就是事件的参数,如下图所示:

添加两个参数
这样子就创建好一个触发器,后面只需要给这个触发器添加事件,然后从事件参数里拿到事件传来的参数就可以执行动作了。那么怎么知道事件参数里的key值呢?
我们需要在触发编辑器的左下角勾选显示依赖库

例如这里我们需要拿到单位死亡的事件,那么就在上面的搜索框搜索“死亡”,找到单位-死亡的事件

这里我们可以看到事件参数的Key值分别代表什么东西,例如死亡单位是unit,杀手单位是killer。

如果我们需要用到这些事件参数,那么就直接从简单表里获取,并输入对应的key就可以了(不过本次的例子用不上,所以就直接打印)

然后用与刚刚相同的动作,记录单位死亡数量,同时判断死亡数量是否能够创建BOSS单位,这里为了方便区分,把触发器的变量名改成与刚刚上面的例子相同的名字(把第一个触发器的变量名改成记录单位死亡):

第一个触发器的完整图片
创建第二个触发器(按下按键创建怪物),用来创建小怪
按照与第一个触发器相同的方式,我们直接不废话,创建第二个触发器:


这样子第二个触发器也创建好了,同时也给第一个触发器添加了事件,到这还没结束,我们也需要给第二个触发器添加事件:

这样子就完成了,演示效果如下:
上面忘记移除触发器,所以创建了两次BOSS单位,但也证明这个触发器是可行的,同时也能看到下面打印了死亡单位与杀手单位。
这种方法结合类,可以将功能与功能所需要的触发器放到类里,在需要的时候new这个功能类,就可以实现功能与触发器的整合。