2016-12-31 5 views
1

Unity 게임 엔진에서 작은 게임을 만들고 게임용 맵이 2d 타일 맵에서 생성됩니다. 타일 ​​맵은 너무 많은 타일을 포함하고 있지만 전화기와 같은 장치가 모든 것을 렌더링하는 것은 매우 어려우므로 프레임 속도가 떨어집니다. 게임의 유일한 움직이는 것은 주인공 스프라이트와 그 뒤의 카메라라는 점에서 맵은 완전히 정적입니다. 지도 자체에는 움직이는 물체가 없으며 매우 간단합니다. 필요한 부분 만 렌더링하거나 한 번에지도를 렌더링하는 방법이 있어야합니다. 이 주제를 연구 한 결과, Unity 메쉬 클래스를 사용하여 타일 맵을 메시로 변환하는 것이 좋은 방법 일 것이라고 생각합니다. 2d 타일 맵을 사용하여이 작업을 수행하는 방법을 알 수 없었습니다. 어쨌든 렌더링 시간에 어떤 이점이 있는지를 알 수 없었습니다. 그러나 누가 멋진 2 차원 타일 맵을 렌더링 할 수 있는지 올바른 방향으로 알려줄 수 있다면 좋을 것입니다. 감사.Unity에서 큰 2d 타일 맵을 쉽게로드하는 방법

타일 시스템 : 타일 맵을 작동시키기 위해 필자는 모든 개별 타일을 프리 필드 폴더에 프리 패브로 배치하고 속성을 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

다음이 부모에 스크립트를 첨부 "> (오른쪽의"계층 "에 클릭 할 때마다 타일에 빈 부모의 게임 오브젝트를 만들 빈 작성하는 것입니다.이 스크립트에 대한 참조가 카메라 (도움이 필요하면 알려주십시오.) 카메라와 거리 사이의 거리를 계산하고 거리가 값보다 작 으면 타일을 인스턴스화합니다. 그렇지 않으면 인스턴스가 파괴됩니다 (있는 경우).

Update funct에서이 작업을 수행해야합니다. 이온을 사용하여 매 프레임마다 거리를 확인하거나 "Coroutines"를 사용하여 검사 횟수를 줄일 수 있습니다 (보다 효율적 임).

또 다른 방법은 모든 타일의 인스턴스가있는 배열이있는 스크립트를 카메라에 부착하고 카메라와의 거리를 같은 방식으로 확인하는 것입니다. 정확히 하나의 큰 타일 맵만있는 경우이 작업을 수행 할 수 있습니다. 큰 타일 맵 이상인 경우이 스크립트를 다시 사용하기가 어려울 수 있기 때문입니다.

또한 타일 대신 문자 스프라이트 사이의 거리를 계산할 수 있습니다. 어느 쪽이든 더 편리하게 선택하십시오.

위의 작업을 수행 한 후에도 프레임 드롭이 생기면 범위에 타일을 적게 포함하도록 카메라를 확대 할 수 있지만 거리를 다시 계산해야합니다.

+0

와우 대단히 감사합니다.카메라에 대한 언급이있는 스크립트로 인해 약간 분실했습니다. 조금만 더 설명해 주시겠습니까? – dmkanerer

+0

빈 게임 개체를 모든 타일에 어떻게 연결합니까? – dmkanerer

+0

당신은 public gameObject 변수를'public GameObject MyCamera;'[이것을보십시오] (https://www.youtube.com/watch?v=5t8L2pXQjGI) 좋습니다. 타일을 빈 gameObject에 연결하려면 계층의 이름을 드래그하여 빈 gameObject 위에 놓습니다. 부모님은 위의 답에있는 이미지와 같이 옆에 화살표가있는 부모를 보게됩니다. –