2014-12-01 3 views
0

В игре игроки могут рубить деревья. Затем я создаю падающее дерево в его месте.Ландшафт обновления lag unity C# - Как эффективно обновить ландшафт?

я удалить дерево из списка местности и обновить местность так:

 var treeInstancesToRemove = new List<TreeInstance>(terrain.treeInstances); 
     treeInstancesToRemove.RemoveAt(closestTreeIndex); 
     terrain.treeInstances = treeInstancesToRemove.ToArray(); 

     // I refresh the terrain so the collider gets removed... 
     float[,] heights = terrain.GetHeights(0, 0, 0, 0); 
     terrain.SetHeights(0, 0, heights); 

Местность очень большой ... Это означает, что всякий раз, когда дерево рубят игра зависает на несколько секунд, и затем возобновляется (по мере обновления). Есть ли более быстрый или более эффективный способ взглянуть? Замораживание после каждого дерева, которое вы рубили, не совсем идеально?

СПАСИБО МУЖЧИНЫ В РАСЧЕТЕ!

ответ

0

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

+0

Мне нравится идея кусков, у меня просто нет ИДЕИ, как это сделать в Единстве! Я сделаю некоторые исследования ... –

0
float hmWidth = grav.currentTerrain.terrainData.heightmapWidth; 
    float hmHeight = grav.currentTerrain.terrainData.heightmapHeight; 
    // get the normalized position of this game object relative to the terrain 
    Vector3 tempCoord = (transform.position - grav.currentTerrain.gameObject.transform.position); 
    Vector3 coord; 
    coord.x = tempCoord.x/grav.currentTerrain.terrainData.size.x; 
    coord.y = tempCoord.y/grav.currentTerrain.terrainData.size.y; 
    coord.z = tempCoord.z/grav.currentTerrain.terrainData.size.z; 
    // get the position of the terrain heightmap where this game object is 
    int posXInTerrain = (int)(coord.x * hmWidth); 
    int posYInTerrain = (int)(coord.z * hmHeight); 
    // we set an offset so that all the raising terrain is under this game object 
    //int offset = size/2; 

    // get the heights of the terrain under this game object 
    float[,] heights = grav.currentTerrain.terrainData.GetHeights(posXInTerrain, posYInTerrain, 1, 1); 
    grav.currentTerrain.terrainData.SetHeights(posXInTerrain, posYInTerrain, heights); //THIS CHANGES TERRAIN FOR GOOD 
+0

Этот ответ может быть улучшен путем добавления некоторого содержимого без кода. – Thomas

Смежные вопросы