You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 根据溢出伤害值获取敌人死亡生成列表对应层级的敌人类型

Unity 敌人死亡溢出伤害穿透生成逻辑修复

核心逻辑修正思路

原有代码主要存在三个错误:

  • 层级穿透逻辑判断错误,没有正确对应溢出伤害和穿透层数的关系
  • 多DeathSpawn场景下没有做溢出伤害的分配处理
  • 无下级Spawn时的终止条件逻辑错误,导致总是触发不生成判定

我们先明确规则映射:

  1. 敌人默认生命值为1,溢出伤害值 = 收到的总伤害值 - 1
  2. 每1点溢出伤害可穿透1层下级敌人生成链
  3. 多DeathSpawn场景下,溢出伤害优先逐个分配给每个Spawn做穿透,用完为止
  4. 穿透过程中如果某一级敌人没有配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:15:03