之前实现了简单的飞船炮塔,但贫穷的特效令人毫无感觉,我翻了翻商店,可惜并没有找到能入眼的免费资源,所以就使出氪金大法,购买了这个Sci-Fi Effects,FORGE3D也是家眼熟的资源商了,东西都还不错。
当我打开资源的时候,我是非常郁闷的……因为人家也做了个炮塔,原理和我的一样,还写的比我高级,emmmm……我只能说欢迎大家阅读资源代码了....
好多武器效果1人家还给了个编辑器脚本进行可视化调整……emmmm
特效挺多,基本囊括了武器的表现形式了,还是很值这30刀的。既然人家都做的很全了,那我就借花献佛,结合常见的几种飞船武器讲讲需求和实现吧。
以下实现在工程目录的~/_Project/Example/Sci/TurretCtrl/NormalTurretCtrl/路径下。
射弹武器
射弹武器顾名思义,就是指指发射炮弹的武器。这类武器具有发射飞行物,飞行物具有飞行时间,形成弹道,延迟到达目标等特性,如我们开始实现的简单炮塔就是。
对于这类武器的效果,我们可以分为三个部分:炮口的焰火,飞行物,以及撞击后的效果。当执行开火函数后,会在炮口位置通过生成焰火和子弹,同时也会生成对应的音效,各自有生命周期,到期后回收,这里为了表现机枪的速射感,调成了0.05,实际开发请尽量避免过于高频使用,容易造成各种奇奇怪怪的BUG。为了增加表现感,还可以在生成时对焰火和子弹有一定的随机缩放,音效的音量音频等也如此.....嗯……也是跟人家资源商学的……
然后是子弹的碰撞检测,不同飞弹检测方式也可以不一样,不过一般都采用帧间射线检测的方式,这里是子弹,就用Physics.Linecast对两帧间移动的点进行检测,在碰撞的时候产生碰撞的特效音效并回收子弹:
最终效果还不错:
再往下还可以根据命中物体的属性材质播放生成不同特效音效,子弹也可以根据飞行时间,速度重力风向等形成不同的弹道等等...具体看需求和性能。
上图为另一种表现形式的射弹武器,发射球状子弹,进行Physics.SphereCast球形检测,碰撞后进行一次范围检测,给符合条件的目标添加力。
光束武器
光束武器会沿炮口指向发射一条射线或类似表现形式,具有即时到达目标,持续伤害,需要持续瞄准,弹道笔直的性质。
光束的表现依然分为三部分:炮口火焰,光束主体和碰撞效果,但因为光束是持续性显示,所以不需要使用对象池反复创建,光束上挂有一个循环播放的音效,但开火和结束开火的时候可以进行单独的音效播放。
这里直接将三部分组成一个子弹,在运行时通过射线光束指向,光束拥有最大射程,射线检测到目标则显示末端的碰撞效果,光束主体是一条LineRender,根据目标点设置长度,同时还可以设置光束材质的Tiling和Offset,展现一个动态的向前喷涌的光束的感觉。
此类武器由于是持续性射击,一般进行间隔伤害结算,此处设置了一个伤害间隔,如果射线检测到目标则开始每隔XX时间调用一次结算。
最终效果:
又细又小又无力的艾玛激光炮
又粗又长的泯灭之圣光,合众国的公民们,欢呼吧!
脉冲武器
脉冲武器算是射弹和激光的结合,主要用于狙击类高伤单发技能表现,发射一束不断向前增长的激光,但实际上只有激光的前端有攻击判定,开炮的时候锁定炮塔旋转,命中后有消散特效,是不是很熟悉?Excalibur!
由于是单发伤害,在命中时就会进行回收,所以在近距离的时候会出现效果一闪而过,这样就很违和了,所以对于此类效果还需要加入一个收尾特效,在命中后执行,此处简单延迟了liner的隐藏时间,并对贴图透明度进行过渡,表现出逐渐消失的效果。
导弹
导弹是一种特殊的射弹武器,发射出的飞行物具有跟踪和预判的特性,一般常见的导弹发射方式有直射,跟踪和预判三种。
实现在工程目录的~/_Project/Example/Sci/Missile/路径下。
直射最简单,发射的时候给定一个方向,直直的射出去就行:
跟踪稍微复杂,需要根据目标位置对自身进行旋转,所以需要给导弹添加一个旋转速度,需要注意的是如果目标相对于导弹的角速度超过了导弹自身的旋转速度,或者导弹速度比目标慢,则会出现导弹跟不到目标的情况。
跟踪效果:
最麻烦的是预判了,预判需要计算目标的提前量,这里采用简单的方式进行计算,通过记录目标上一帧和本帧的位置算出目标当前的飞行方向和速度,然后求出预计飞向目标的时间,速度*时间就得出提前量了。
最终效果:
范围类武器
提起范围武器,就想起立体炸弹,想起立体炸弹,就想起作者某年某月喝多了开着8炸弹台风在吉他炸门,团灭新人无数,第二天醒酒挨个打钱赔偿...黑历史啊
范围武器实现比较简单,在指定位置检测指定范围内的目标进行相应处理即可,一般都是以自身为起始点,进行周期性范围检测,也作为放置类武器,陷阱啊什么的……这里就不做实现了(PS:自爆也算哟...XD)
需要单独说明的是,Buff也算范围武器,但正经开发中,buff的复杂性决定了buff需要单独实现为一套系统,但是换一种思路来看,又有什么效果不算是buff呢?还是看具体解耦方式了~参考:方便扩展的被动技能,Buffer系统
飞船护盾
实现在工程目录的~/_Project/Example/Sci/Shield/路径下。
护盾的实现就需要编写shader了,写是不可能写的,一辈子都不可能碰shader代码的,那怎么办?官方出了Shader Graph,也在B站有教程:Unity Shader Graph第二期:制作能量护盾看了下实现很简单,可惜是基于LWRP的,得把之前的材质全换了,人懒就不想动,于是默默掏出Amplify Shader Editor开始玩连连看:
原理很简单,将基础颜色和菲涅尔效果进行叠赋给材质的emission加得到边缘渐变勾边效果,再将网格纹理和菲涅尔效果叠加赋给材质的opacity得到网格透明效果。
在此之上我们还可以进行更深一步实现,给护盾增加一个打击效果:
这个效果是我从ASE里抄来的,ASE自带还有非常多的效果,有空可以看看实现,这里主要是在前面简单护盾的基础上进行了一个叠加,根据传入的位置取到mesh的顶点,然后将坐标范围内的颜色改为被击效果,由外部脚本传入位置,并通过update里进行被击颜色的消减。
跃迁和跳跃
跃迁引擎已启动!在之前购买的资源包中提供了一个跳跃的效果和虫洞的效果,这里也顺带实现了下。
实现在工程目录的~/_Project/Example/Sci/Warp_Jump/路径和Warp_Tunnel/路径下。
首先看跳跃,资源包中提供的效果由一整套多个粒子效果组成,粒子主要控制一下速度和大小,方便后续编辑,同时在跳跃的过程中飞船模型会有一个缩放的效果,先拉伸再缩小,同时位移,跳入则是反向操作。
所以美术好才是真的好,搞什么gameplay啊唉……
实际上对于这样多个特效多种变化组成的效果,非常建议用线性编辑器来编辑,比如官方的Timeline,第三方插件Slate等等,会给与极好的用户体验。比如在上图中,飞船拉伸的同时应该有小量往前位移,以实现尾部不动,头部拉伸的效果,类似这样的效果用代码控制会比较麻烦,编辑改动也很烦,这时候所见即所得的线性编辑器就很爽了。由于作者长期使用Slate,Timeline并不熟,就截个Slate的图给大家看看好了:
早期随便调节的动画
可以看出,相对于代码控制的跳跃,可以更容易的调节表现。
跃迁的实现采用EVE式的跃迁,以扭曲虫洞的表现,跃迁过程分为三段,起始加速,中间匀速直线运动,结束减速到达指定位置,这里的飞船位移就需要进行造假了,一开始作者去计算匀变速公式,但始终会因为距离较长而产生误差,所以直接采用dotween进行过渡:
在表现上的细节则应该有起始阶段逐渐视觉扭曲,中间的通道旋转扭曲变化,以及结束的退出扭曲效果:
至此,常见的飞船相关的攻击,防护,移动方式就讲述完毕。具体的实现请跟着需求来,下一篇将会把武器、模块等实装到飞船,完善战斗系统Demo。
工程地址:https://github.com/evesgf/SpaceGame
作者:杨定鹏
专栏地址:https://zhuanlan.zhihu.com/p/72858575
|