如何基于SpawnEligibility枚举构建字典或高效随机筛选最优出生点?
解决方案:SpawnEligibility字典构建与高效随机选点
嘿,针对你的两个需求,我整理了直接可用的实现方案,确保每个出生点只计算一次适配性,避免不必要的性能消耗:
1. 构建Spawn为键、SpawnEligibility为值的字典
我们可以利用LINQ的ToDictionary方法,一次性遍历所有出生点并计算适配性,生成对应的字典:
// 每个出生点仅调用一次GetEligibility,生成键值对字典 protected Dictionary<Vector3, SpawnEligibility> GetSpawnEligibilityDict() { return _spawns.ToDictionary(spawn => spawn, spawn => GetEligibility(spawn)); }
这个方法会遍历_spawns列表一次,为每个出生点计算适配性后存入字典,后续你可以直接通过字典快速查询任意出生点的适配等级。
2. 不重复调用GetEligibility,随机选择最高适配性的出生点
核心思路是先一次性计算所有出生点的适配性,再筛选出等级最高的候选池,最后从候选池中随机选取一个:
public override Vector3 FindSpawn(BasePlayer player) { // 一次性计算所有出生点的适配性,存储为包含位置和等级的集合 var spawnEligibilityPairs = _spawns .Select(spawn => new { SpawnPos = spawn, Eligibility = GetEligibility(spawn) }) .ToList(); // 确定当前最高的适配性等级 var highestRank = spawnEligibilityPairs.Max(pair => pair.Eligibility); // 筛选出所有达到最高等级的出生点 var topTierSpawns = spawnEligibilityPairs .Where(pair => pair.Eligibility == highestRank) .Select(pair => pair.SpawnPos) .ToList(); // 随机返回一个最高等级的出生点(兜底处理空列表情况) return topTierSpawns.Count > 0 ? topTierSpawns[UnityEngine.Random.Range(0, topTierSpawns.Count)] : _spawns.FirstOrDefault(); }
为什么这样做?
- 每个出生点仅调用一次
GetEligibility,避免了原代码中OrderByDescending可能带来的多次重复计算(原代码排序时会多次调用该方法) - 先筛选出最高等级的候选池再随机,保证了选择的公平性,而不是固定选排序后的第一个
内容的提问来源于stack exchange,提问作者Jacob Stein
相关产品推荐
相关产品推荐

