Unity 3D C# 如何为列表内随机对象分配列表中的随机状态值
随机分配建筑状态实现方案
现有定义的字段可直接复用,完整实现逻辑如下:
前置准备
首先给每个建筑对象挂载状态存储脚本,避免分配的状态无存储位置:
// 挂载到每个建筑GameObject上 public class Building : MonoBehaviour { // 后续可替换为枚举类型提升性能和可维护性 public string CurrentState; }
核心分配逻辑
以下实现自带全相同状态校验,满足你要求的「所有对象状态不完全相同」规则,代码简洁且9个对象的场景下几乎不会产生重复生成的性能损耗:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { public List<GameObject> Buildings = new List<GameObject>(9); // 可直接初始化状态,也可在Inspector面板自定义修改 public List<string> States = new List<string>() {"Cold", "Burnt", "Nothing"}; private void Start() { // 游戏启动时自动执行分配 RandomAssignStates(); } private void RandomAssignStates() { bool allStatesSame; // 若生成结果全相同则重新分配 do { string firstState = null; allStatesSame = true; for (int i = 0; i < Buildings.Count; i++) { string randomState = States[Random.Range(0, States.Count)]; Buildings[i].GetComponent<Building>().CurrentState = randomState; if (i == 0) { firstState = randomState; } else if (randomState != firstState) { allStatesSame = false; } } } while (allStatesSame); } }
优化建议
如果需要更高效的分配逻辑(适合建筑数量更多的场景),可以跳过校验主动保证至少存在两种状态:
- 先随机选取两个不同的状态,分配给两个不同的建筑
- 剩余建筑可完全随机分配状态,无需校验是否全相同
若要避免字符串拼写错误、提升状态匹配效率,可将状态定义改为枚举类型:
public enum BuildingState { Cold, Burnt, Nothing }
替换后将Building脚本中CurrentState的类型改为BuildingState,GameManager中States的类型改为List<BuildingState>即可。
内容的提问来源于stack exchange,提问作者DavidA_
相关产品推荐
相关产品推荐

