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
相关产品推荐
相关产品推荐

