c# - 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);
}
解决方案
推荐阅读
- java - 即使在设置 server.servlet.contextPath 之后,弹簧执行器也会出现 404 Not found 错误
- regex - 需要从 perl 中最后捕获的字符串返回捕获组的值
- javascript - 为什么我的画布游戏代码从 Javascript 中的构造函数的模块返回“未定义”?
- python - 如何从python字典中删除一些值
- c - MSP432 LaunchPad 按钮初始化
- excel - 将验证列表复制到新书时如何保留另一张纸上的验证列表
- reactjs - 尝试使用 UseEffect 在 react.js 中创建倒计时(日:小时:分钟:秒)
- python - Pandas:如何在 Dataframe 中添加表示 2 个属性交集的列
- api - 在 DocuSign 中,信封状态报告(在控制台 -> 报告部分)我们得到一个字段总页数;如何通过 DocuSign API 获得相同的?
- node.js - 如何从前端保存和发送 JWT 令牌