unity2d对象都挤在一起

消消乐游戏中制作阵列出现了网格都挤在一起的问题

img

相关代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Gridarry : MonoBehaviour
{
    public GameObject gridObj;
    // Start is called before the first frame update
    void Start()
    {
        for (int rowIndex = 0; rowIndex  < GlobalDef.ROW_COUNT; ++rowIndex )//生成网格整行
        {
            for (int columIndex = 0; columIndex  < GlobalDef.COLUM_COUNT; ++columIndex )//生成网格整列
            {
                //实例化网格物体
                var obj = Instantiate(gridObj);
                obj.transform.SetParent(gridObj.transform.parent, false);//当第二个参数为false时,Cube在设置父物体前后就会有所改变
                obj.transform.localPosition = new Vector3((columIndex  - GlobalDef.COLUM_COUNT / 2f) * GlobalDef.CELL_SIZE + GlobalDef.CELL_SIZE / 2f, (rowIndex  - GlobalDef.ROW_COUNT / 2f) * GlobalDef.CELL_SIZE + GlobalDef.CELL_SIZE / 2f, 0);
            }
        }
        gridObj.SetActive(false);
    }

    // Update is called once per frame
    void Update()
    {

    }
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7583242
  • 除此之外, 这篇博客: Unity2d 游戏计时中的 相关知识 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
  • 您还可以看一下 洪青霞老师的丑小鸭历险记——趣味玩转unity2d游戏开发(下)课程中的 背景设置原理解析小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    针对消消乐游戏中出现的网格挤在一起的问题,可以尝试以下优化方案:

    1. 对网格进行间隔设置,可以通过创建一个网格生成器(Grid Generator)的脚本,实现在指定的区域内生成一定数量的网格,并设置网格之间的间隔。

    示例代码:

    using UnityEngine;
    
    public class GridGenerator : MonoBehaviour
    {
        public GameObject gridPrefab;
        public int gridSize = 8;
        public float gridSpacing = 1f;
    
        void Start()
        {
            for(int i = 0; i < gridSize; i++)
            {
                for(int j = 0; j < gridSize; j++)
                {
                    Vector3 gridPosition = new Vector3(i * gridSpacing, j * gridSpacing, 0);
                    Instantiate(gridPrefab, gridPosition, Quaternion.identity, transform);
                }
            }
        }
    }
    
    1. 使用Unity自带的2D Renderer(Sprite Renderer)而不是3D Renderer。2D Renderer可以更好地渲染2D图像,并支持批量渲染,减小性能开销。

    2. 将网格生成和消除逻辑分离,可以使用对象池(Object Pooling)技术,提高内存使用效率。当需要消除网格时,不是直接销毁游戏对象,而是将其返回对象池中,以便下次复用。

    示例代码:

    using System.Collections.Generic;
    using UnityEngine;
    
    public class GridManager : MonoBehaviour
    {
        public GameObject gridPrefab;
        public int gridSize = 8;
        public float gridSpacing = 1f;
    
        private List<GameObject> grids = new List<GameObject>();
        private Stack<GameObject> gridPool = new Stack<GameObject>();
    
        void Start()
        {
            // Create grids
            for(int i = 0; i < gridSize; i++)
            {
                for(int j = 0; j < gridSize; j++)
                {
                    Vector3 gridPosition = new Vector3(i * gridSpacing, j * gridSpacing, 0);
                    GameObject grid = Instantiate(gridPrefab, gridPosition, Quaternion.identity, transform);
                    grids.Add(grid);
                }
            }
        }
    
        public void RemoveGrid(GameObject grid)
        {
            // Return grid to pool
            grid.SetActive(false);
            gridPool.Push(grid);
        }
    
        public void ClearGrids()
        {
            // Clear all grids
            foreach(GameObject grid in grids)
            {
                grid.SetActive(false);
                gridPool.Push(grid);
            }
            grids.Clear();
        }
    
        public GameObject GetPooledGrid()
        {
            // Get a grid from pool
            if(gridPool.Count > 0)
            {
                GameObject grid = gridPool.Pop();
                grid.SetActive(true);
                return grid;
            }
            else
            {
                // Create a new grid
                return Instantiate(gridPrefab);
            }
        }
    }
    
    1. 使用协程(Coroutine)实现动画效果,而不是直接修改transform属性。协程可以提高代码的可读性和可维护性,并且可以精确控制动画的执行时间和顺序。

    示例代码:

    using System.Collections;
    using UnityEngine;
    
    public class Grid : MonoBehaviour
    {
        public float moveSpeed = 5f;
        public float destroyDelay = 0.5f;
    
        public void MoveTo(Vector3 targetPosition)
        {
            StartCoroutine(MoveCoroutine(targetPosition));
        }
    
        private IEnumerator MoveCoroutine(Vector3 targetPosition)
        {
            while(Vector3.Distance(transform.position, targetPosition) > 0.1f)
            {
                transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
                yield return null;
            }
    
            // Destroy grid after delay
            yield return new WaitForSeconds(destroyDelay);
            Destroy(gameObject);
        }
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^