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

Unity2D交互式4x4网格创建方法求助(游戏开发新手)

嘿,作为刚入门游戏开发的新手,碰到交互式网格的问题太正常了!我来一步步帮你理清思路~

网格创建:编程生成 vs 手动放置精灵

两种方式各有优劣,完全取决于你的需求:

  • 编程生成:适合需要动态调整网格大小(比如以后想改成5x5)的场景,代码复用性高,不用手动拖放几十次对象。你可以用Unity的GameObject.CreatePrimitive(快速创建基础形状)或者预制体实例化,通过循环生成4x4的格子并自动排列位置。
  • 手动放置精灵:如果就是固定的4x4网格,原型阶段用这个更快上手,不用写太多代码。把精灵拖到场景里排列整齐,给每个格子加个BoxCollider2D(2D场景)或者Collider(3D场景),就能实现点击检测。

小建议:如果只是做固定4x4的Demo,两种都可以;如果以后可能扩展功能,优先选编程生成,后期维护更省心。

跟踪Active单元格:数组是核心,Unity有辅助工具但需自己整合

你说的用数组跟踪是完全正确的思路!Unity没有直接内置“一键跟踪激活单元格”的方法,但可以结合基础组件轻松实现:

  1. 用二维数组存储所有格子:GameObject[,] gridCells = new GameObject[4,4];,这样通过坐标(x,y)就能快速定位到对应的单元格。
  2. 用Vector2Int activePosition记录当前激活的位置,比如初始设为(0,0),然后给这个格子加高亮效果(比如改颜色、缩放)区分状态。

给你举个简单的代码示例,分两个脚本实现逻辑分离:

1. GridCell.cs(每个格子挂载的脚本)

using UnityEngine;

public class GridCell : MonoBehaviour
{
    public Vector2Int gridPosition; // 记录当前格子的坐标
    public GridManager gridManager; // 引用网格管理器

    private Renderer _cellRenderer;
    public Color normalColor = Color.white;
    public Color activeColor = Color.blue;

    void Start()
    {
        _cellRenderer = GetComponent<Renderer>();
        SetNormalState();
    }

    // 鼠标点击检测(3D或2D带碰撞体都能用)
    void OnMouseDown()
    {
        gridManager.TryMoveToCell(gridPosition);
    }

    // 设置激活状态
    public void SetActiveState()
    {
        _cellRenderer.material.color = activeColor;
    }

    // 设置普通状态
    public void SetNormalState()
    {
        _cellRenderer.material.color = normalColor;
    }
}

2. GridManager.cs(管理整个网格的脚本,挂在空对象上)

using UnityEngine;

public class GridManager : MonoBehaviour
{
    public GameObject cellPrefab; // 格子预制体
    public int gridSize = 4;
    public float cellSpacing = 1.1f; // 格子之间的间距,避免重叠

    private GameObject[,] _gridCells;
    private Vector2Int _currentActivePos;

    void Start()
    {
        GenerateGrid();
        // 初始激活(0,0)位置的格子
        _currentActivePos = new Vector2Int(0, 0);
        _gridCells[_currentActivePos.x, _currentActivePos.y].GetComponent<GridCell>().SetActiveState();
    }

    // 编程生成4x4网格
    void GenerateGrid()
    {
        _gridCells = new GameObject[gridSize, gridSize];

        for (int x = 0; x < gridSize; x++)
        {
            for (int y = 0; y < gridSize; y++)
            {
                // 计算每个格子的生成位置
                Vector3 spawnPos = new Vector3(x * cellSpacing, y * cellSpacing, 0);
                GameObject cell = Instantiate(cellPrefab, spawnPos, Quaternion.identity);
                cell.transform.parent = transform;

                // 给格子绑定坐标和管理器引用
                GridCell cellScript = cell.GetComponent<GridCell>();
                cellScript.gridPosition = new Vector2Int(x, y);
                cellScript.gridManager = this;

                _gridCells[x, y] = cell;
            }
        }
    }

    // 处理移动逻辑:判断是否相邻,更新激活状态
    public void TryMoveToCell(Vector2Int targetPos)
    {
        int xDiff = Mathf.Abs(targetPos.x - _currentActivePos.x);
        int yDiff = Mathf.Abs(targetPos.y - _currentActivePos.y);
        // 判断是否是上下左右相邻的格子
        bool isAdjacent = (xDiff == 1 && yDiff == 0) || (yDiff == 1 && xDiff == 0);

        if (isAdjacent)
        {
            // 取消之前激活格子的状态
            _gridCells[_currentActivePos.x, _currentActivePos.y].GetComponent<GridCell>().SetNormalState();
            // 更新激活位置
            _currentActivePos = targetPos;
            // 设置新格子的激活状态
            _gridCells[_currentActivePos.x, _currentActivePos.y].GetComponent<GridCell>().SetActiveState();
        }
    }
}
补充小细节
  • 如果用UI的Image做格子,就把OnMouseDown换成IPointerClickHandler接口(记得场景里要有EventSystem对象)。
  • 高亮效果除了改颜色,还可以用发光材质、轻微缩放等,提升玩家的视觉反馈。
  • 数组的坐标可以根据你的需求调整,比如想让y轴向下排列,只需要修改生成时的spawnPos.y为-y * cellSpacing就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:11:28