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

Unity中C#随机值存储问题:如何复用同一随机数

解决方案:Unity中让两个数组复用同一随机索引

情况1:仅在单次鼠标点击事件内复用索引

你当前的代码逻辑其实是正确的——在Input.GetMouseButtonDown(0)触发时,只生成了一次随机数number,sameNumber只是它的副本,所以FallCube[number]和AllCube[sameNumber]会访问同一个索引的元素。你感觉到的“每次调用生成新随机数”是因为每次点击都会重新生成一个新的随机数,这完全符合你“点击时生成随机数”的需求。

情况2:生成一次随机数后,后续多帧/多次操作复用索引

如果你的需求是生成一次随机数后,在后续的逻辑(比如其他输入事件、帧更新逻辑)中重复使用这个索引,需要把随机数变量声明为类的成员变量,而不是点击逻辑内的局部变量:

修改后的完整代码

using UnityEngine;

public class FloorController : MonoBehaviour
{
    public Material RedGlow;
    public Material OriginColor;
    public Material GreenGlow;

    public GameObject cube0;
    public GameObject cube1;
    public GameObject cube2;
    public GameObject cube3;
    public GameObject cube4;
    public GameObject cube5;
    public GameObject cube6;
    public GameObject cube7;
    public GameObject cube8;

    public GameObject fallcube0;
    public GameObject fallcube1;
    public GameObject fallcube2;
    public GameObject fallcube3;
    public GameObject fallcube4;  
    public GameObject fallcube5;
    public GameObject fallcube6;
    public GameObject fallcube7;
    public GameObject fallcube8;

    // 成员变量:保存随机索引,供全局复用
    private int currentRandomIndex;

    GameObject[] AllCube = new GameObject[9];
    GameObject[] FallCube = new GameObject[9];

    void Start()
    {
        // 初始化数组
        AllCube[0] = cube0;
        AllCube[1] = cube1;
        AllCube[2] = cube2;
        AllCube[3] = cube3;
        AllCube[4] = cube4;
        AllCube[5] = cube5;
        AllCube[6] = cube6;
        AllCube[7] = cube7;
        AllCube[8] = cube8;

        FallCube[0] = fallcube0;
        FallCube[1] = fallcube1;
        FallCube[2] = fallcube2;
        FallCube[3] = fallcube3;
        FallCube[4] = fallcube4;
        FallCube[5] = fallcube5;
        FallCube[6] = fallcube6;
        FallCube[7] = fallcube7;
        FallCube[8] = fallcube8;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // 点击时生成随机数并保存到成员变量
            currentRandomIndex = UnityEngine.Random.Range(0, 9);
            Debug.Log("当前随机索引:" + currentRandomIndex);

            // 重置所有立方体材质
            for(int i = 0; i < 9; i++) 
            {
                AllCube[i].GetComponent<MeshRenderer>().material = OriginColor;
                FallCube[i].GetComponent<MeshRenderer>().material = OriginColor;
            }

            // 复用同一索引操作两个数组
            FallCube[currentRandomIndex].GetComponent<MeshRenderer>().material = RedGlow;
            AllCube[currentRandomIndex].GetComponent<MeshRenderer>().material = RedGlow;
        }

        // 示例:右键点击时复用同一索引修改材质
        if (Input.GetMouseButtonDown(1))
        {
            AllCube[currentRandomIndex].GetComponent<MeshRenderer>().material = GreenGlow;
        }
    }
}

额外优化建议

  • 简化数组初始化:把GameObject[] AllCube和GameObject[] FallCube改为public GameObject[] AllCube;、public GameObject[] FallCube;,直接在Unity编辑器的Inspector面板中拖拽对应的立方体到数组中,省去Start里的手动赋值代码。
  • 缓存组件提升性能:提前在Start中缓存所有立方体的MeshRenderer组件,避免每次修改材质时重复调用GetComponent:
    private MeshRenderer[] allCubeRenderers;
    private MeshRenderer[] fallCubeRenderers;
    
    void Start()
    {
        // 初始化数组后,缓存渲染组件
        allCubeRenderers = new MeshRenderer[AllCube.Length];
        fallCubeRenderers = new MeshRenderer[FallCube.Length];
        for(int i = 0; i < AllCube.Length; i++)
        {
            allCubeRenderers[i] = AllCube[i].GetComponent<MeshRenderer>();
            fallCubeRenderers[i] = FallCube[i].GetComponent<MeshRenderer>();
        }
    }
    
    后续修改材质时直接使用allCubeRenderers[i].material = ...即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:23:14