下载 App
程序上班!讲讲我们的技术开发日志
2024/10/2812 浏览
这次 GameJam 项目中,我的角色拥有一项手电蓄力攻击的技能,用来净化敌人。这个技能需要一个 2 秒的蓄力时间,并在蓄力结束后对手电光锥范围内的敌人造成伤害。为了实现这种效果,我选择用协程来管理蓄力过程以及攻击效果的触发。
问题出现
问题1:蓄力过程重复启动
一开始,我编写了一个简单的协程来控制蓄力时间。在技能触发后,协程开始计时 2 秒,然后净化范围内的敌人。然而,在测试中,我发现快速多次点击技能按键后,蓄力攻击会被多次触发,导致一次蓄力后,敌人被多次净化,甚至造成了技能冷却和攻击范围判定的混乱。
我加了 Debug.Log 检查协程的执行情况,结果发现蓄力协程被多次启动,导致每个协程都执行了一次完整的蓄力和净化判定,等于“叠加”了攻击效果。
问题2:协程中断导致净化攻击失效
更麻烦的是,切换场景或暂停游戏时,协程会被提前中断,导致蓄力攻击被意外取消,敌人无法被净化。这样一来,玩家在一些关键场景中会出现技能触发后没有任何效果的情况,极大影响了游戏体验。
解决方案
方案1:使用标志位防止协程重复启动
为了解决蓄力过程的重复启动问题,我增加了一个标志位 isCharging。当蓄力协程开始时,将 isCharging 设置为 true,并在协程结束时重置为 false。这样在技能触发时,先检查 isCharging 是否为 true,以防止协程在蓄力期间被多次启动。
方案2:封装协程并手动控制中断
为了防止协程在暂停或场景切换时意外中断,我决定将协程逻辑封装在一个管理脚本中,使用 StopCoroutine 和 PauseCoroutine 方法来手动管理协程的生命周期。这样在场景切换或游戏暂停时,可以确保蓄力过程的稳定性,让技能的蓄力和净化判定能够在任何状态下可靠地执行。
最终效果与反思
通过标志位和协程封装,手电的净化蓄力效果终于稳定了下来。标志位有效防止了协程重复启动的问题,而封装协程让它在场景切换和游戏暂停时也能平稳运行。这次调试让我深刻意识到协程的生命周期管理在技能效果中的重要性,未来还可以进一步优化协程管理逻辑,让技能的流畅度和效果控制得更为精准。












