如何使用循环简化Unity中按键触发生成GameObject的代码
Unity游戏对象生成逻辑优化方案
核心优化思路
你的代码中所有重复生成的对象都有明确的坐标规律,完全可以通过嵌套循环替代重复代码,同时把零散的单对象变量改为数组/二维数组存储,既降低代码冗余,也方便后续对生成对象的统一管理:
- 3*3的立方体组:X轴范围57,步长1;Y轴范围0.52.5,步长1;Z轴固定为0
- 3组共18个圆柱体组:Z轴范围-55,步长5;Y轴范围111,步长2;X轴固定为0
优化后完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class game_Objects: MonoBehaviour { // 用数组存储生成后的对象,方便后续调用 public GameObject[] cubes; // 二维数组:第一个下标对应列(col1/col2/col3),第二个下标对应高度层(P1~P6) public GameObject[,] cylinders; void Start () { // 初始化数组容量 cubes = new GameObject[9]; cylinders = new GameObject[3,6]; } void Update () { if (Input.GetKeyUp (KeyCode.G)) { // 生成立方体 int cubeIndex = 0; for (float y = 0.5f; y <= 2.5f; y += 1f) { for (float x = 5f; x <=7f; x += 1f) { GameObject newCube = GameObject.CreatePrimitive(PrimitiveType.Cube); newCube.transform.position = new Vector3(x, y, 0f); cubes[cubeIndex] = newCube; cubeIndex++; } } // 生成圆柱体 int colIndex = 0; for (float z = -5f; z <=5f; z +=5f) { int heightIndex = 0; for (float y = 1f; y <=11f; y +=2f) { GameObject newCylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder); newCylinder.transform.position = new Vector3(0f, y, z); cylinders[colIndex, heightIndex] = newCylinder; heightIndex++; } colIndex++; } } } }
可进一步改进的方向
- 把生成的参数(起始坐标、步长、生成数量、对象类型)提取为公有序列化变量,直接在Inspector面板调整,不需要修改代码
- 生成逻辑可以封装为独立方法,比如
GenerateCubeGrid()、GenerateCylinderColumns(),代码结构更清晰,复用也更方便 - 如果需要频繁触发生成/销毁逻辑,建议引入对象池复用对象,避免频繁创建销毁带来的性能开销
- 可以在循环中统一给生成的对象设置父物体、挂载组件、修改材质等操作,不需要逐个单独配置
内容的提问来源于stack exchange,提问作者Cryst4l B34st
相关产品推荐
相关产品推荐

