You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity新手求助:如何以网格模式放置GameObject(类似Tilemap)?

高效创建网格状随机生成GameObject的方法(Unity)

嘿,作为Unity新手能想到用网格模式批量生成物体,这个思路超棒!手动复制粘贴确实太麻烦了,我给你几个高效的解决方案,绝对能帮你省超多时间:

方法一:编写简单生成脚本(最灵活高效,首推!)

这是最适合你的方式,既能自定义每个tile的生成逻辑,又完全自动化,步骤也很简单:

  1. 先创建一个空GameObject,命名成GridGenerator就行,作为整个网格的父物体方便管理
  2. 给它加个C#脚本,把下面的代码粘进去:
using UnityEngine;

public class GridGenerator : MonoBehaviour
{
    // 这些参数都能在Unity编辑器里直接调整,不用改代码
    public GameObject tilePrefab; // 拖入你做好的单个tile预制体
    public int gridWidth = 10; // 网格的横向数量
    public int gridHeight = 10; // 网格的纵向数量
    public float tileSpacing = 1f; // 每个tile之间的间距(根据你的物体大小调)
    public float spawnProbability = 0.7f; // 每个位置生成物体的概率(0是不生成,1是必生成)

    void Start()
    {
        // 游戏启动时自动生成网格
        CreateGrid();
    }

    // 把生成逻辑单独拿出来,方便后续扩展
    void CreateGrid()
    {
        // 遍历网格的每一行每一列
        for (int x = 0; x < gridWidth; x++)
        {
            for (int z = 0; z < gridHeight; z++)
            {
                // 计算当前tile的生成位置
                Vector3 spawnPosition = new Vector3(x * tileSpacing, 0, z * tileSpacing);
                
                // 用随机数判断是否生成这个位置的物体
                if (Random.value <= spawnProbability)
                {
                    // 生成预制体,并且把它设为GridGenerator的子物体
                    Instantiate(tilePrefab, spawnPosition, Quaternion.identity, transform);
                }
            }
        }
    }

    // 额外加个编辑器快捷功能:不用运行游戏,右键脚本就能生成网格
    [ContextMenu("Generate Grid Now")]
    void GenerateInEditor()
    {
        // 先清空已有的物体,避免重复生成
        foreach (Transform child in transform)
        {
            DestroyImmediate(child.gameObject);
        }
        CreateGrid();
    }
}
  1. 回到Unity编辑器,把你的单个tile预制体拖到脚本的tilePrefab字段里,然后根据需要调整网格尺寸、间距和生成概率
  2. 要么运行游戏自动生成,要么右键GridGenerator的脚本组件,点Generate Grid Now直接在编辑器里生成,超方便!

新手友好的扩展小技巧:

  • 如果想随机生成不同类型的物体,把tilePrefab改成public List<GameObject> tilePrefabs,然后在生成时用tilePrefabs[Random.Range(0, tilePrefabs.Count)]来随机选一个预制体
  • 要是想调整生成的高度,把spawnPosition里的0改成你需要的Y值就行

方法二:用Tilemap扩展实现(适合2D场景)

如果你做的是2D游戏,Unity内置的Tilemap也能实现类似功能:

  • 先创建一个Tilemap(菜单栏选2D -> Tilemap
  • 写一个自定义Tile脚本,在脚本里添加随机生成GameObject的逻辑
  • 不过这种方法相对复杂一点,更适合纯2D项目,3D场景还是首推第一种方法

方法三:编辑器插件辅助(可选)

要是暂时不想写代码,可以去Unity Asset Store找免费的网格生成插件,比如Grid Brush这类工具,能可视化地刷出网格物体,但灵活性肯定不如自己写脚本高,而且新手写点简单脚本也能快速熟悉Unity的基础用法~

内容的提问来源于stack exchange,提问作者Lykon

火山引擎 最新活动