【问题标题】:How to make large 2d tilemap easier to load in Unity如何在 Unity 中更轻松地加载大型 2d tilemap
【发布时间】:2016-12-31 07:07:56
【问题描述】:

我正在 Unity 游戏引擎中创建一个小游戏,游戏的地图是从 2d 瓦片地图生成的。但是,tilemap 包含如此多的图块,对于像手机这样的设备来说很难将它们全部渲染出来,因此帧速率会下降。地图是完全静止的,因为游戏中唯一移动的东西是主角精灵和跟随它的摄像机。地图本身没有移动物体,这很简单,必须有一种方法只渲染它需要的部分,或者只渲染一次地图。我从研究这个主题中发现,也许一个很好的方法是购买使用 Unity 网格类将瓷砖地图变成网格。我无法弄清楚如何使用 2d tilemap 来做到这一点,而且我看不出它对渲染时间有何好处,但如果有人能指出我正确的方向来渲染大型 2d tilemap,那就太棒了。谢谢。

瓷砖系统: 为了使瓦片地图工作,我将每个单独的瓦片作为预制件放在我的预制文件夹中,并针对 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);
//              }
//              
            }
        }
    }
}

这导致与所有代码一起使用时的地图看起来像这样(我为其他预制件取出了所有代码以节省空间)

【问题讨论】:

    标签: optimization 2d render game-engine unity5


    【解决方案1】:

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

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

    然后将脚本附加到该父级。该脚本引用了相机(如果您需要帮助,请告诉我),并计算它与相机之间的距离,如果距离小于某个值,则实例化图块,否则破坏实例(如果存在)。

    它必须在更新函数中执行此操作以检查每帧的距离,或者您可以使用“协程”进行更少的检查(更有效)。

    另一种方法是将脚本附加到具有包含所有图块实例的数组的相机上,并以相同的方式检查它们与相机的距离。如果你只有一个大的瓷砖地图,你可以这样做,因为如果你有多个大瓷砖地图,就很难重复使用这个脚本。

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

    执行上述操作后,您仍然会出现丢帧现象,您可以放大相机以在其范围内包含更少的图块,但您必须重新计算距离。

    【讨论】:

    • 哇很好的答案非常感谢!不过,我对引用相机的脚本有点迷茫。请您再解释一下好吗?
    • 如何将空游戏对象连接到每个图块?
    • 你创建一个公共的gameObject变量public GameObject MyCamera;See this很好。 ...要将图块连接到空的游戏对象,只需将其名称拖到层次结构中并将其放在空的游戏对象上。他们你会看到它的父母旁边有一个箭头,就像上面答案中的图片一样。
    • 所以基本上你的意思是为每个单独的图块创建一个像这样的游戏对象,然后为每个图块的游戏对象创建一个脚本,如果游戏对象不在相机的视野范围内,它将破坏它?
    • 是的,您制作一次的脚本,然后为每个图块重复使用它。但我不确定是否有一种“快速”的方法可以为每个图块制作父游戏对象。您需要父对象,因为父对象必须销毁其子对象。如果你直接把脚本附加到一个对象上,让它自己销毁,它怎么能重新创建自己呢?它不能。 ...否则只需使用其他解决方案,即相机脚本。那时不需要育儿,脚本将仅在相机上使用。 错字:Then you'll see the parent having an arrow beside it...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多