CSGO非线性关卡地图制作教程
Da0lang
2021年09月01日 15:00

    引言

    看到这个标题也许你会很疑惑,什么叫做线性关卡?什么又是非线性关卡?线性关卡就是指地图关卡的设计是一条直线从头到尾的,是一个房间到另一个房间,或是一个场景到另一个场景,有且仅有一种顺序地进行游戏。而非线性关卡更类似于一种收集类,或者是达成目标类,只需要达成对应的几个目标,就可以完成整个关卡,而不需要在意进行收集或达成目标的顺序,这为kz、bhop、surf亦或是mg,都提供了更多的作图可能性。

    大部分kz玩家可能都有遇到过,例如kz_bhop_badges3,亦或是kz_module,而surf中也有一个图叫做surf_enlightened,不懂是什么的可以先看看下面的这两个视频。

    为什么要制作非线性关卡?

    非线性关卡意味着,不仅仅局限于一种可能,通过作者对地图的特化制作,可以从作者为玩家固定一种路线转变为由玩家不断地探索优化路线,对于玩家而言更有趣味性。

    如何制作非线性关卡?

    我认为非线性关卡一共只有两类,一类是仅仅达成一个目标的,另一类则是两个或以上的目标,仅仅达成一个目标的我更愿意称之为吃钥匙,而两个或以上目标的更类似于收集任务所需道具。

    1、如何制作吃钥匙

    首先,要想制作吃钥匙关卡,必须先理解,什么是过滤器。在本人制作的CSGO如何拆解密道的视频中有对过滤器进行详细的介绍,吃钥匙的原理是一模一样的,详情请看以下视频的P5,对于过滤器有教学如何理解。

    请理解好过滤器之后再阅读以下内容。

    那么现在我们要制作一个吃钥匙关卡。首先我们需要一把钥匙,钥匙不一定是真正的钥匙,它可以是硬币,模型,亦或是固体拼接的特殊物品。这里我采用一个固体拼接的钥匙。

钥匙固体

    那么我们所要做的就是在钥匙周围套上一层trigger_multiple,并且在旁边放上一个ambient_generic,达到提示玩家已经吃到钥匙的效果。同时,放下一个filter_activator_name作为过滤吃到钥匙的玩家的过滤器,trigger_multiple的Output如图

套着钥匙的multiple以及其output

    filter_activator_name如图

filter_activator_name

    如何理解以上trigger_multiple,第一个Output,OnStartTouch意为接触到这个trigger后,第二个Key_Sound_1为ambient_generic的实体名称,PlaySound意为播放声音,用于提示玩家已经获得了钥匙。第二个同理,接触到这个trigger后,!activator意为作用目标为触发者,即接触到这个触发的玩家,targetname意为为玩家设置过滤器,此处不再解释,具体请看上文视频。

    这样制作之后,就可以在某些关卡的连接处放上一个传送,仅仅只有吃了钥匙的玩家才能不被这个传送传走,或者放上一个push,只有吃了钥匙的玩家才不会被推开。

    注意,钥匙必须转换为func_illusionary或者func_brush并调整为无碰撞状态,否则将影响玩家体验

    进阶玩法:单次板上的钥匙

    常见于kz地图,例如kz_spacemario_h,kz_angina_final,kz_unmake等,这里以kz_angina_final为例介绍如何制作单次板上的钥匙。注:这是本人自己制作的系统,逻辑不清晰请勿轻易尝试。

     首先,你需要明白如何制作一个单次板,详情请见老年鸡的文章。

     如何制作一个吃钥匙的单次板,我的逻辑如下。

普通单次板系统给予玩家普通单次板标记→钥匙单次板系统给予钥匙标记→玩家回到原来的单次板,但是他所触发的是仅仅拥有钥匙标记的玩家才能触发的单次板系统→该系统再给予玩家一个标记,作者通过这个标记筛选出吃了钥匙的玩家。

    这样层层嵌套即可以制作钥匙单次板,但是较为复杂,具体可以拆图理解,这里只是展示我个人的一个理解。想学的请拆图自己琢磨。

    2、如何制作两个或以上的目标收集系统

    以前做的时候可能会想着用math_counter,计算玩家所达成的目标个数,但是这样仅仅在单机适用,若用于多人游戏,则需不断增加math_counter的数量,非常复杂。

    这里我推荐大家适用Danzay所写的基于vscript的non—linear系统。具体内容请于github下载,链接如下 https://github.com/danzayau/VScripts/tree/master/scripts/vscripts/danzay

    下载的文件如下

脚本文件

    乍一看好像非常多文件,需要调整的参数好像很多,实际上,使用这个脚本非常简单。下面将以bhop_daolang2为例介绍如何使用这个脚本介绍非线性地图关卡。在下载完脚本文件后,请把他们放在一个文件夹中命名为danzay(你喜欢的名字),并且放在csgo目录下scripts\vscript下。

    所达成的效果如视频所展示,请烦劳点下视频看一下理解我想达到的效果。

    首先,我在起点放上了一圈触发trigger_multiple,并在entity scripts上浏览脚本文件,选择nonlinear_reset.nut,意为当玩家碰到这个触发之后,会清除所有玩家已经收集到的目标。

起点的触发

    然后,在需要收集的目标周围套上一个触发trigger_multiple,并在entity scripts处填上nonlinear_objective.nut,意为当玩家碰到这个触发后所收集的目标数+1,我所制作的目标是这样的方块。(不用担心重复计数,照着使用就可,danzay的脚本较为完善)

需收集的目标的触发

    而我的地图一共有5个需收集的目标(有一个由于视角缘故无法截到)。

需收集的目标

    如视频所示,我地图的最终目的地是需要进入一个隧道的,现在,在隧道的入口放上一个封死的trigger_multiple,并在entity script上浏览,选择nonlinear_gate_rebound.nut,意为非线性关卡终点的触发,若收集不足,则会将玩家弹开。

    注意,这里的触发命名规则,非常重要。5是什么?5是所需收集的物品个数。danzay的高明之处就在这里,把所需收集的目标个数作为触发的名称,因此,这个触发必须命名为你所需收集的目标的个数,用阿拉伯数字,而不是照搬我的5。

终点的触发

    而仅仅做了这一些不一定是足够的,玩家可能通过引擎bug或者地图漏洞无意间越过这一个触发,这样会导致地图被破坏,因此,我在里面外加了一个trigger_multiple,在entity script浏览文件选择nonlinear_gate_teleport.nut,意为非线性关卡的传送,用于防止玩家卡bug。同样,触发必须命名为你所需收集的目标的个数,用阿拉伯数字,而不是照搬我的5。

防止卡bug传送触发

    这样,一个非线性关卡就完成了,此外有一些额外的参数可以调整。

nonlinear_resource

    脚本文件中nonlinear_resource.nut中可以调整收集到目标之后在玩家屏幕上显示的提示文字以及目标不足时前往终点所提示的文字。如把星星改为方块,则会在游戏里显示,you already got this 方块,(打不出符号,理解就好)。

    注意,地图做完之后,打包地图时,请手动将脚本文件打包进地图,使用自动打包会使地图脚本文件丢失,该系统就无效了,打包的文件必须是整个文件夹打包,即打包如下文件。

打包的文件

    本系统的优点在于,操作简单,清晰明了。同时由于是运用脚本制作的系统,可以无视玩家的标记进行运作,因而可以在本系统上外加各种各样的标记系统,例如ze中的神器系统,亦或是上文所说的钥匙系统。有兴趣的可以运用到自己的地图中。(使用请标明Vscript by Danzay)

    此外,还有一个纯实体制作的非线性关卡系统,作者为tonymontana,较为复杂,我个人不喜欢。网址:https://gamebanana.com/mods/2153。想用的自己钻研,起源系统不做评价。