2016-12-31 5 views
1

私はUnityゲームエンジンで小さなゲームを作成しています。ゲームのマップは2dタイルマップから生成されます。タイルマップには非常に多くのタイルが含まれていますが、電話などのデバイスでそれらをすべてレンダリングするのは非常に難しいため、フレームレートが低下します。ゲーム内の唯一の動くものがメインキャラクタースプライトであり、それに続くカメラであるという点で、マップは完全に静的です。マップ自体には動くオブジェクトはありません。非常に単純です。必要なセクションだけをレンダリングする方法や、マップを一度にレンダリングする方法が必要です。私がトピックを研究して発見したのは、Unityメッシュクラスを使用してタイルマップをメッシュに変えることだけです。私は2dタイルマップでこれを行う方法を理解できず、とにかくレンダリング時間にどのようなメリットがあるかわかりませんでしたが、誰かが大きな2dタイルマップをレンダリングするための正しい方向に向けることができれば素晴らしいでしょう。ありがとう。大きな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); 
//    } 
//    
      } 
     } 
    } 
} 

この結果

を:これは、1枚のタイルのために、このようになります。 enter image description here

答えて

1

カメラの範囲内にあるタイルをインスタンス化し、それ以外のタイルを破壊することができます。これを行うにはいくつかの方法があります。しかし、まずあなたのリソースを消費するのは実際には何か他のものではなく、たくさんのタイルであることを確認してください。

一つの方法は、この親にスクリプトを添付し、その後

parent to cube

「空の作成>右の「階層」のクリック(すべてのタイルに空の親ゲームオブジェクトを作成することです。このスクリプトは、への参照を持っていますカメラ(援助が必要な場合は教えてください)と距離を計算し、その距離が値よりも小さい場合はインスタンスを作成し、それ以外の場合はインスタンスを破棄します(存在する場合)。

Update functでこれを行う必要がありますイオンを使用してフレームごとの距離をチェックしたり、「Coroutines」を使用してチェックを少なくする(より効率的)ことができます。

もう1つの方法は、すべてのタイルのインスタンスを持つ配列を持ち、同様にカメラからの距離をチェックするスクリプトをカメラに取り付けることです。大まかに1つの大きなタイルマップしか持っていない場合は、これを行うことができます。これは、大きなタイルマップ以上のものがあれば、このスクリプトを再利用することが難しいためです。

また、カメラの代わりにタイルと文字スプライトの間の距離を計算することもできます。どちらか便利な方を選んでください。

上記の操作を行ってもフレームドロップが発生した場合は、範囲内のタイル数を減らすためにカメラをズームインできますが、距離を再計算する必要があります。

+0

すごい素晴らしい回答ありがとう!私は、カメラへの参照を持っているスクリプトで少し失われています。もう少し詳しくお聞かせください。 – dmkanerer

+0

空のゲームオブジェクトをどのようにして各タイルにつなぐのですか? – dmkanerer

+0

あなたはpublic gameObject変数を 'public GameObject MyCamera;' [これを見てください](https://www.youtube.com/watch?v=5t8L2pXQjGI)です。タイルを空のgameObjectに接続するには、その名前を階層内にドラッグして空のgameObjectにドロップします。あなたは、上の答えのイメージのように、それの横に矢印を持つ親を見るでしょう。 –

関連する問題