概述
弹幕系统是一种使用专用执行动作“发射弹幕(FireBarrageBullet)”来发射极轻量、仅具备最基本功能的子弹的系统。
该系统可同时发射数百发子弹,但功能非常有限,无法为子弹设置视觉脚本或使其进行动画。
关于弹幕的碰撞检测,仅可通过专用条件“与弹幕碰撞(CollideWithBarrageBullet)”进行检测,无法通过传统攻击判定或墙壁判定检测碰撞。
如需实现复杂运动轨迹的子弹,请使用传统的“发射子弹”动作。
使用“发射弹幕”可实现的功能
- 可选择发射类型:全方位、连射、散弹。
- 可指定发射位置。
- 可指定发射目标。
- 可选择发射后运动方式:直线、曲线、转向、分裂、追踪。
- 可指定子弹的精灵图。
- 子弹默认以0度(右侧)为正面,并根据移动方向自动旋转。
- 可指定子弹速度,发射后也可设置加减速。
- 可指定判定尺寸和碰撞层。
- 可指定子弹攻击力和属性(但伤害处理不会自动执行,需手动设置)。
“弹幕模式”生成示例
“花朵图案”
同时生成多个“全方位”+“曲线弹”,设置曲线角度时,可将一个设为+0.3度,另一个设为-0.3度,形成对称图案。
若加入旋转效果,可形成类似洗衣机的视觉效果。
“网格图案”
设置多个“连射”+“直线弹”,并调整发射点的偏移量。也可尝试加入转向或分裂效果,增加趣味性。
“追踪玩家”
将目标设为玩家,若同时设置偏移量,可形成“擦边弹”;若设置追踪效果,则可形成“预判弹”。
弹幕与脚本
弹幕系统生成的子弹无法直接附加脚本。
因此,需通过“与弹幕碰撞”条件,在“碰撞对象”的脚本中实现各种行为。
使用“与弹幕碰撞”可实现的功能
- 可检测对象的“HitArea”与弹幕判定区域的碰撞。当“HitArea2D”的层掩码与“弹幕”的层匹配时,即可触发检测。
- 可消除碰撞的弹幕,适用于炸弹或被击中时的处理。
- 消除弹幕时,可按指定概率将其转换为其他对象或Godot场景,主要用于炸弹效果。
- 可将碰撞弹幕的攻击力和属性存储为指定变量。
使用“与弹幕碰撞”的实用示例
“炸弹”
创建一个带有“HitArea”的游戏对象,其层掩码需与弹幕层匹配(虽然略显复杂,但因无法通过AttackArea检测碰撞)。
在爆炸时机,通过视觉脚本使“HitArea”激活并随后消失,并设置“与弹幕碰撞”条件,启用“消除碰撞弹幕”选项。
- 若希望炸弹消除弹幕时掉落得分道具:
设置掉落物品,注意转换处理与普通游戏对象生成负载相同,若同时生成过多可能导致性能下降,建议将掉落率设为10%等较低值。
- 若希望炸弹同时对敌人造成伤害:
正常执行伤害处理,设置“AttackArea2D”和攻击力即可。
“擦弹”
创建专用游戏对象作为子节点,用于处理擦弹逻辑。
- 擦弹对象设置:
设置比父对象更大的HitArea。
在视觉脚本中,当“与弹幕碰撞”时,触发擦弹动画、粒子效果或增加得分等处理。
“弹幕伤害/属性处理”
由于无法使用常规伤害系统,需手动设置。
将“弹幕伤害”存入变量A,“弹幕属性”存入变量B。
- 若仅需简单造成伤害:
在伤害处理状态中,设置“HP减少变量A的值”。
- 若需根据属性改变效果:
在过渡链接条件中,设置“变量B等于指定值”以实现分支处理。
使用GDScript生成弹幕
通过将设置子弹运动和行为的类传递给弹幕管理器的API,可以生成弹幕。
示例:发射后5秒消失的子弹,每隔36度向全方位发射的弹幕
# 创建子弹命令列表(5秒后消失)
var vanish_command = BarrageBulletVanishCommand.new()
var wait_command = BarrageBulletWaitCommand.new()
wait_command.wait_time = 5
# 将命令列表设置到子弹动作数据中
var bullet_action_data = BarrageActionData.new()
bullet_action_data.command_list = [wait_command, vanish_command]
# 创建子弹数据
var bullet_data = BarrageBulletData.new()
bullet_data.action_list = [bullet_action_data]
bullet_data.image_path = "res://〇〇.png"
bullet_data.speed = 100
# 创建向全方位发射的弹幕数据
# 发射命令
var fire_command = BarrageBulletFireCommand.new()
fire_command.bullet_data = bullet_data
# 方向数据
var direction_data = BarrageBulletDirectionData.new()
direction_data.direction_type = 3 # 参考前一次发射的角度(相当于BulletML中的SEQUENCE)
direction_data.angle = 36 # 子弹之间的间隔
# 设置到发射命令中
fire_command.fire_direction_data = direction_data
# 创建传递给重复命令的动作数据
var repeat_command_action = BarrageActionData.new()
repeat_command_action.command_list = [fire_command]
# 创建重复10次的重复命令
var repeat_command = BarrageBulletRepeatCommand.new()
repeat_command.action_data = repeat_command_action
repeat_command.repeat_num = 10
# 创建弹幕发射命令列表
var barrage_command_list = [repeat_command]
# 传递给管理器的动作数据
var action_data = BarrageActionData.new()
action_data.command_list = barrage_command_list
# 传递给弹幕管理器
BarragesManager.fire_barrage([action_data])