如何在Unity中更容易加载大型2d tilemap

时间:2016-12-31 07:07:56

标签: optimization 2d render game-engine unity5

我在Unity游戏引擎中创建一个小游戏,游戏地图是从2d tilemap生成的。然而,tilemap包含如此多的tile,对于像手机这样的设备来说非常难以全部渲染它们,因此帧速率会下降。地图是完全静态的,因为游戏中唯一移动的东西是主角色精灵和跟随它的相机。地图本身没有移动的对象,它非常简单,必须有一种方法只渲染它所需的部分,或者只是一次渲染地图。我在研究这个主题时发现的一点是,使用Unity网格类将tilemap转换为网格可能是一个很好的方法。我无法弄清楚如何用2d tilemap做到这一点,我无法看到它如何有利于渲染时间,但是如果有人能指出我正确的方向来渲染大的2d tilemaps那将是太棒了。感谢。

瓷砖系统: 为了使瓷砖地图工作,我将每个单独的瓷砖作为预制件放入我的预制文件夹中,其中属性已更改为2d盒式对撞机和缩放尺寸。我将瓷砖的每个单独的预制件归因于RGB刻度上的某种颜色,然后导入一个png文件,该文件具有我想要的预制件的相应颜色,如下所示:

enter image description here

然后我编写了一个脚本,将每个预制件放在其相关颜色所在的位置。对于一个瓷砖,它看起来像这样:

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

public class Map : MonoBehaviour {

    private int levelWidth;
    private int levelHeight;

    public Transform block13;

    private Color[] tileColors;

    public Color block13Color;

    public Texture2D levelTexture;

    public PlayerMobility playerMobility;

    // Use this for initialization
    void Start () {
        levelWidth = levelTexture.width;
        levelHeight = levelTexture.height;
        loadLevel ();
    }

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

    }

    void loadLevel(){
        tileColors = new Color[levelWidth * levelHeight];
        tileColors = levelTexture.GetPixels ();

        for (int y = 0; y < levelHeight; y++) {
            for (int x = 0; x < levelWidth; x++) {
//              if (tileColors [x + y * levelWidth] == block13Color) {
//                  Instantiate(block13, new Vector3(x, y), Quaternion.identity);
//              }
//              
            }
        }
    }
}

当与所有代码一起使用时,会产生与此类似的地图(我为其他预制件取出所有代码以节省空间)

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以实例化相机范围内的切片并销毁不合适的切片。有几种方法可以做到这一点。但首先要确保消耗资源的东西实际上是大量的瓷砖,而不是其他东西。

一种方法是为每个图块创建一个空的父游戏对象(右键单击“层次结构”&gt;创建空“

parent to cube

然后将脚本附加到此父级。这个脚本引用了相机(告诉我你是否需要帮助)并计算它与相机之间的距离,如果距离小于一个值则实例化瓷砖,否则会破坏相机实例(如果它在那里)。

必须在Update功能中执行此操作以检查每帧的距离,或者您可以使用“Coroutines”进行更少的检查(更高效)。

另一种方法是将脚本附加到具有所有图块实例的阵列的相机,并以相同的方式检查它们与相机的距离。如果您只有一个大型tilemap,则可以执行此操作,因为如果您有多个大型tilemap,则很难重新使用此脚本。

您还可以计算图块和字符精灵之间的距离,而不是相机。选择哪个更方便。

完成上述操作后,您仍然可以放大相框,可以放大相机以在其范围内包含更少的图块,但是您必须重新计算距离。

相关问题