C# 根据溢出伤害值获取敌人死亡生成列表对应层级的敌人类型
Unity 敌人死亡溢出伤害穿透生成逻辑修复
核心逻辑修正思路
原有代码主要存在三个错误:
- 层级穿透逻辑判断错误,没有正确对应溢出伤害和穿透层数的关系
- 多DeathSpawn场景下没有做溢出伤害的分配处理
- 无下级Spawn时的终止条件逻辑错误,导致总是触发不生成判定
我们先明确规则映射:
- 敌人默认生命值为1,溢出伤害值 = 收到的总伤害值 - 1
- 每1点溢出伤害可穿透1层下级敌人生成链
- 多DeathSpawn场景下,溢出伤害优先逐个分配给每个Spawn做穿透,用完为止
- 穿透过程中如果某一级敌人没有配置DeathSpawn,直接终止,当前Spawn不生成
修正后完整代码
public override void OnDeath(int dmg) { // 计算可穿透层数:总伤害扣掉自身1点生命值,剩下的就是溢出层数 int penetrationCount = dmg - 1; foreach(DeathSpawn ds in death_spawns) { for(int i = 0; i < ds.Amount; i++) { EnemyType currentType = ds.EnemyType; int remainingPenetration = penetrationCount; bool canSpawn = true; // 逐层穿透,直到穿透次数用完或者没有下级Spawn while(remainingPenetration > 0) { EnemyData currentData = EnemyDefinitions.Instance.EnemyData.Find(c => c.EnemyType == currentType); // 当前层级没有下级Spawn,无法继续穿透,直接判定不生成 if(currentData.DeathSpawns == null || currentData.DeathSpawns.Count == 0) { canSpawn = false; break; } // 取第一个DeathSpawn作为下一级类型(如果有多Spawn的穿透规则可以在这里调整) currentType = currentData.DeathSpawns[0].EnemyType; remainingPenetration--; } // 最后校验最终要生成的类型是否有效 if(canSpawn) { EnemyData finalData = EnemyDefinitions.Instance.EnemyData.Find(c => c.EnemyType == currentType); // 配置缺失防护 if(finalData != null) { Debug.Log($"Will spawn Enemy Type: {currentType.ToString()}"); SpawnManager.Instance.Spawn(currentType, this.transform, this.gameObject.GetComponent<AIMotor>().GetDestination(), 0); } } else { Debug.Log("Will not spawn"); } // 多Spawn分配溢出伤害:取消下面这行注释即可匹配Enemy5受2点伤害生成1个Enemy3+1个Enemy2的场景 // penetrationCount = Mathf.Max(0, penetrationCount - 1); } } LevelManager.Instance.resources += max_hitpoint; UIManager.Instance.DrawBuildResource(); SpawnManager.Instance.DestroyEnemy(this.gameObject); }
效果验证
- Enemy3受到2点伤害:穿透层数=1,初始生成类型为Enemy2,穿透1层后得到Enemy1,最终生成Enemy1,符合需求
- Enemy2受到2点伤害:穿透层数=1,初始生成类型为Enemy1,Enemy1无下级Spawn,判定不生成,符合需求
- Enemy5受到2点伤害:取消代码中穿透次数分配的注释后,2个Enemy3 Spawn分别被穿透1次和0次,最终生成1个Enemy2和1个Enemy3,符合补充场景需求
内容的提问来源于stack exchange,提问作者Deathcriw
相关产品推荐
相关产品推荐

