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

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);
    }
}

优化建议

如果需要更高效的分配逻辑(适合建筑数量更多的场景),可以跳过校验主动保证至少存在两种状态:

  1. 先随机选取两个不同的状态,分配给两个不同的建筑
  2. 剩余建筑可完全随机分配状态,无需校验是否全相同

若要避免字符串拼写错误、提升状态匹配效率,可将状态定义改为枚举类型:

public enum BuildingState
{
    Cold,
    Burnt,
    Nothing
}

替换后将Building脚本中CurrentState的类型改为BuildingState,GameManager中States的类型改为List<BuildingState>即可。

内容的提问来源于stack exchange,提问作者DavidA_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:06:03