如何根据指定变量值创建对应数量的公共游戏对象数组
Unity中按指定数量创建公共游戏对象数组实现方案
核心注意点:不要在字段声明阶段直接用howManyGroupsOfEnemies初始化数组,C#字段初始化执行时机早于Unity序列化赋值流程,此时读取到的howManyGroupsOfEnemies永远是int默认值0,会导致数组长度错误。
完整可运行代码
using UnityEngine; public class EnemyGroupManager : MonoBehaviour { [Header("敌人分组数量")] public int howManyGroupsOfEnemies; [Header("敌人分组容器数组")] public GameObject[] enemyGroups; private void Awake() { // 运行时初始化指定长度的敌人分组数组 enemyGroups = new GameObject[howManyGroupsOfEnemies]; } // 可选:编辑器下修改分组数时自动适配数组长度 private void OnValidate() { // 拦截负数输入,避免数组长度为负报错 howManyGroupsOfEnemies = Mathf.Max(0, howManyGroupsOfEnemies); // 同步数组长度,尽可能保留已经赋值的元素 if (enemyGroups == null || enemyGroups.Length != howManyGroupsOfEnemies) { GameObject[] tempArr = new GameObject[howManyGroupsOfEnemies]; if (enemyGroups != null) { int copyLength = Mathf.Min(enemyGroups.Length, howManyGroupsOfEnemies); for (int i = 0; i < copyLength; i++) { tempArr[i] = enemyGroups[i]; } } enemyGroups = tempArr; } } }
关键说明
- 数组初始化逻辑放在
Awake()生命周期方法中执行,这个时机可以正确读取到你在Inspector面板设置的howManyGroupsOfEnemies值,不会出现读不到自定义值、数组长度恒为0的问题 OnValidate()方法是可选的编辑器侧优化:在Unity编辑器里修改分组数量时,数组会自动同步调整长度,之前已经拖入赋值的分组对象会尽可能保留,不需要每次改完分组数都手动重置数组- 如果你需要自动生成每个分组对应的游戏对象,而不是手动拖入赋值,可以在
Awake()的数组初始化代码后追加循环生成逻辑:
for (int i = 0; i < enemyGroups.Length; i++) { // 按序号生成分组父物体 enemyGroups[i] = new GameObject($"敌人分组_{i+1}"); // 将生成的分组设为当前脚本挂载物体的子物体,方便层级管理 enemyGroups[i].transform.SetParent(transform); }
内容的提问来源于stack exchange,提问作者fourarms
相关产品推荐
相关产品推荐

