Unity中如何扩展数组并将GameObject添加至新元素?
解决Unity中扩展区块数组并添加选中区块的问题
你的现有代码仅完成了给选中对象的Wmasss组件赋值Chunk的操作,但没有将这些区块添加到World类的存储数组中。下面是完整的实现方案,包含数组/列表两种存储方式的处理:
1. 优化World类的存储结构
数组长度固定,动态扩展需要频繁创建新数组,推荐用List<GameObject>代替数组,更适合动态添加元素:
public class World : MonoBehaviour { // 用List存储区块,支持动态添加/删除 public List<GameObject> chunks = new List<GameObject>(); }
如果必须保留数组,可以在后续逻辑中转换为List处理。
2. 修正WriteInWorld脚本
完善区块添加逻辑,包含实例查找、空值校验、重复添加判断:
public class WriteInWorld { [MenuItem("Assets/Add To World")] public static void SetAsWmass() { GameObject[] selectedWmass = Selection.gameObjects; if (selectedWmass.Length == 0) { Debug.LogWarning("未选中任何区块对象"); return; } // 获取场景中的World实例(确保场景中存在且唯一) World world = FindObjectOfType<World>(); if (world == null) { Debug.LogError("场景中未找到World组件"); return; } foreach (var chunkObj in selectedWmass) { Wmasss wmassComp = chunkObj.GetComponent<Wmasss>(); if (wmassComp == null) { Debug.LogWarning($"对象「{chunkObj.name}」缺少Wmasss组件,跳过"); continue; } // 给Wmasss组件赋值Chunk wmassComp.Chunk = chunkObj; // 避免重复添加区块到World if (!world.chunks.Contains(chunkObj)) { world.chunks.Add(chunkObj); Debug.Log($"已将「{chunkObj.name}」添加到世界区块列表"); } else { Debug.LogWarning($"「{chunkObj.name}」已存在于世界区块列表中"); } } } [MenuItem("Assets/Add To World", isValidateFunction: true)] public static bool SetAsWmassValidator() { // 验证所有选中对象都包含Wmasss组件,且至少选中一个对象 if (Selection.gameObjects.Length == 0) return false; foreach (var obj in Selection.gameObjects) { if (obj.GetComponent<Wmasss>() == null) return false; } return true; } }
3. 若必须使用数组存储的兼容处理
如果World类坚持使用数组,可通过List中转实现动态扩展:
// 在SetAsWmass方法的foreach循环内替换区块添加逻辑: List<GameObject> tempChunkList = world.chunks != null ? world.chunks.ToList() : new List<GameObject>(); if (!tempChunkList.Contains(chunkObj)) { tempChunkList.Add(chunkObj); world.chunks = tempChunkList.ToArray(); // 转换回数组 }
内容的提问来源于stack exchange,提问作者SOOBATON
相关产品推荐
相关产品推荐

