2016-12-31 16 views
1

Я создаю небольшую игру в игровом движке Unity, а карта для игры создается из 2-го tilemap. Тканевая карта содержит так много фрагментов, однако для устройства, такого как телефон, очень сложно отобразить их все, поэтому частота кадров падает. Карта полностью статична в том, что единственная движущаяся вещь в игре - главный символ спрайта и камера, следующая за ним. Сама карта не имеет движущихся объектов, она очень проста, должен быть способ визуализации только необходимых разделов или, возможно, просто отобразить карту за один раз. Все, что я обнаружил, исследуя эту тему, заключается в том, что, возможно, хороший способ сделать это - купить с помощью класса ячеек Unity, чтобы превратить tilemap в сетку. Я не мог понять, как это сделать с 2-мерным tilemap, и я не мог понять, как это пригодится времени рендеринга в любом случае, но если кто-нибудь может указать мне в правильном направлении для рендеринга больших 2D-фрагментов, которые были бы фантастическими. Благодарю.Как сделать большой 2d tilemap проще для загрузки в Unity

Плитка системы: Чтобы сделать работу с плиточной плитой, я помещаю каждую отдельную плиту в виде сборника в моей папке prefab, с атрибутами, измененными для коллайдеров 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

Вы можете создавать фрагменты, находящиеся в зоне действия камеры, и уничтожать плитки, которые нет. Есть несколько способов сделать это. Но сначала убедитесь, что то, что потребляет ваши ресурсы, на самом деле представляет собой большое количество плиток, а не что-то еще.

Один из способов создать пустой родительский геймобжекты для каждой плитки (щелкните правой кнопкой мыши в «иерархии»> Создать Пустое»

parent to cube

затем прикрепить сценарий к этому родителю. Этот сценарий имеет ссылку камера (скажите мне, если вам нужна помощь с этим) и вычисляет расстояние между ним и камерой и конкретизирует плитку, если расстояние меньше, чем значение, в противном случае уничтожает экземпляр (если он есть).

Он должен сделать это в функции обновления чтобы проверить расстояния на каждом кадре, или вы можете использовать «Coroutines» для выполнения меньших проверок (более эффективно).

Другой способ - прикрепить сценарий к камере с массивом с экземплярами всех фрагментов и проверять их расстояния от камеры таким же образом. Вы можете сделать это, если у вас есть только один большой tilemap, потому что было бы трудно повторно использовать этот скрипт, если у вас больше, чем большой tilemap.

Также вы можете рассчитать расстояние между плиткой и символом спрайта вместо камеры. Выберите, что удобнее.

После выполнения вышеуказанного и вы по-прежнему получаете кадры с кадром, вы можете масштабировать камеру, чтобы включить меньшее количество плиток в своем диапазоне, но тогда вам придется пересчитывать расстояния.

+0

Ничего себе большой ответ спасибо!Тем не менее, я немного потерял сценарий, имеющий ссылку на камеру. Не могли бы вы объяснить, что еще немного? – dmkanerer

+0

Как связать пустой игровой объект с каждой плиткой? – dmkanerer

+0

Вы делаете общедоступную переменную gameObject 'public GameObject MyCamera;' [См. Это] (https://www.youtube.com/watch?v=5t8L2pXQjGI) Это хорошо. ... для подключения плитки к пустому объекту gameObject просто перетащите его имя в иерархии и опустите его поверх пустого объекта gameObject. Они вы увидите, что у родителя есть стрелка рядом с ним, как изображение в ответе выше. –