我在Unity游戏引擎中创建一个小游戏,游戏地图是从2d tilemap生成的。然而,tilemap包含如此多的tile,对于像手机这样的设备来说非常难以全部渲染它们,因此帧速率会下降。地图是完全静态的,因为游戏中唯一移动的东西是主角色精灵和跟随它的相机。地图本身没有移动的对象,它非常简单,必须有一种方法只渲染它所需的部分,或者只是一次渲染地图。我在研究这个主题时发现的一点是,使用Unity网格类将tilemap转换为网格可能是一个很好的方法。我无法弄清楚如何用2d tilemap做到这一点,我无法看到它如何有利于渲染时间,但是如果有人能指出我正确的方向来渲染大的2d tilemaps那将是太棒了。感谢。
瓷砖系统: 为了使瓷砖地图工作,我将每个单独的瓷砖作为预制件放入我的预制文件夹中,其中属性已更改为2d盒式对撞机和缩放尺寸。我将瓷砖的每个单独的预制件归因于RGB刻度上的某种颜色,然后导入一个png文件,该文件具有我想要的预制件的相应颜色,如下所示:
然后我编写了一个脚本,将每个预制件放在其相关颜色所在的位置。对于一个瓷砖,它看起来像这样: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);
// }
//
}
}
}
}
当与所有代码一起使用时,会产生与此类似的地图(我为其他预制件取出所有代码以节省空间)
答案 0 :(得分:1)
您可以实例化相机范围内的切片并销毁不合适的切片。有几种方法可以做到这一点。但首先要确保消耗资源的东西实际上是大量的瓷砖,而不是其他东西。
一种方法是为每个图块创建一个空的父游戏对象(右键单击“层次结构”&gt;创建空“
然后将脚本附加到此父级。这个脚本引用了相机(告诉我你是否需要帮助)并计算它与相机之间的距离,如果距离小于一个值则实例化瓷砖,否则会破坏相机实例(如果它在那里)。
必须在Update功能中执行此操作以检查每帧的距离,或者您可以使用“Coroutines”进行更少的检查(更高效)。
另一种方法是将脚本附加到具有所有图块实例的阵列的相机,并以相同的方式检查它们与相机的距离。如果您只有一个大型tilemap,则可以执行此操作,因为如果您有多个大型tilemap,则很难重新使用此脚本。
您还可以计算图块和字符精灵之间的距离,而不是相机。选择哪个更方便。
完成上述操作后,您仍然可以放大相框,可以放大相机以在其范围内包含更少的图块,但是您必须重新计算距离。