首页 > 解决方案 > C#给定一个数字,在列表嵌套的那个级别获取值

问题描述

抱歉标题我想不出该怎么说清楚

鉴于以下课程

[System.Serializable]
public class EnemyData
{
    public EnemyType EnemyType;
    public float Speed = 0.25f;
    public float SpeedMultiplier;
    public Material Material;
    public int Hitpoints;
    public List<DeathSpawn> DeathSpawns;
}

[System.Serializable]
public class DeathSpawn
{
    public EnemyType EnemyType;
    public int Amount;
}

public class EnemyDefinitions: MonoSingleton<EnemyDefinitions>
{
    public List<EnemyData> EnemyData = new List<EnemyData>();
}

假设我们有一个敌人 Enemy1

Enemy1 没有 DeathSpawns,所以当他死时他就死了

Enemy2 有 1 个 DeathSpawn 并生成 Enemy1

所以

Enemy1 -> Death

Enemy2 -> Enemy1 -> Death

Enemy3 -> Enemy2 -> Enemy1 -> Death

所以如果所有敌人都有 1 生命值

鉴于某物对 Enemy3 造成 2 点伤害,它应该去

Enemy3 -> Enemy1 -> Death

或者如果某物对 Enemy2 造成 2 点伤害

Enemy2 -> Death

这是我目前正在使用的代码

if (dmg > 0)
    {
      EnemyData enemy_data = EnemyDefinitions.Instance.EnemyData.Find(c => c.EnemyType == 
    enemy_type);
      if (enemy_data.DeathSpawns.Count > 0)
      {
      
      }
      else
      {
        return;
      }
    }

所以这里发生的事情首先是检查是否有额外的伤害,如果有,我正在检查当前的敌人是否有任何死亡产生,如果没有,我们就简单地返回;

我有点迷茫的地方是,如果我们让 DeathSpawns 根据提供的伤害获得正确的 DeathSpawn,我该如何在 if 语句中说。我已经尝试了几种不同的代码迭代,这些迭代对我来说毫无意义,我似乎无法解决这个问题

编辑:

我虽然还应该补充一点,例如,一个敌人可能有不同的产卵

Enemy5 -> x2 Enemy3

Enemy3 -> Enemy2 -> Enemy1 -> Death

在这种情况下,应该说 Enemy5 有 1 生命值并收到 2 dmg

Enemy5 -> x1 Enemy3 x1 Enemy2

Enemy3 -> Enemy2 -> Enemy1 -> Death

Enemy2 -> Enemy1 -> Death

编辑:

这就是我的 OnDeath 函数目前的样子,它不起作用它总是默认为“不会生成”我似乎无法理解正确的逻辑以在这里使用

public override void OnDeath(int dmg)
    {
        foreach(DeathSpawn ds in death_spawns)
        {
            for(int i = 0; i < ds.amount; i++)
            {
                bool will_spawn = false;
                EnemyType spawn_type = EnemyType.White;
                EnemyType new_enemy_type = ds.enemy_type;

                for(int d = 0; d <= dmg; d++)
                {
                    Debug.Log($"for damage entered {d}");
                    EnemyData enemy_data = EnemyDefinitions.Instance.EnemyData.Find(c => c.EnemyType == new_enemy_type);

                    if(enemy_data.DeathSpawns.Count > 0)
                    {
                        if (d != dmg)
                        {
                            new_enemy_type = enemy_data.DeathSpawns[0].enemy_type;
                        }

                        if (d == dmg)
                        {
                            spawn_type = enemy_data.DeathSpawns[0].enemy_type;
                            will_spawn = true;
                        }
                    }
                    else
                    {
                        Debug.Log("Will not spawn");
                        will_spawn = false;
                    }
                }

                if (will_spawn)
                {
                    Debug.Log($"Will spawn Enemy Type: {spawn_type.ToString()}");
                    SpawnManager.Instance.Spawn(spawn_type, this.transform, this.gameObject.GetComponent<AIMotor>().GetDestination(), 0);
                }
            }
        }

        LevelManager.Instance.resources += max_hitpoint;
        UIManager.Instance.DrawBuildResource();
        SpawnManager.Instance.DestroyEnemy(this.gameObject);
    }

标签: c#unity3d

解决方案


推荐阅读