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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:10:27