Quantcast
Channel: Questions in topic: "tree"
Viewing all articles
Browse latest Browse all 513

Lagging when i search for tree in TerrainTreeInstances

$
0
0
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class TreeChop : MonoBehaviour { public GameObject FallingTreePrefab; private List TreeInstances; // Use this for initialization private void Start() { TreeInstances = new List(Terrain.activeTerrain.terrainData.treeInstances); Debug.Log("Tree Instances:" + TreeInstances.Count); } // Update is called once per frame private void Update() { // did we click on a tree? if (Input.GetMouseButtonDown(0)) { DateTime start = DateTime.Now; RaycastHit hit; // This ray will see where we clicked er chopped Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // Did we hit anything at that point, out as far as 10 units? if (Physics.Raycast(ray, out hit, 10.0f)) { // Did we even click er chop on the terrain/tree? if (hit.collider.name != Terrain.activeTerrain.name) { // No, must have been a frantic attack on a giant spider >:) return; } // We hit the "terrain"! Now, how high is the ground at that point? float sampleHeight = Terrain.activeTerrain.SampleHeight(hit.point); // If the height of the exact point we clicked/chopped at or below ground level, all we did // was chop dirt. if (hit.point.y <= sampleHeight + 0.01f) { return; } TerrainData terrain = Terrain.activeTerrain.terrainData; TreeInstance[] treeInstances = terrain.treeInstances; // Our current closest tree initializes to far away float maxDistance = float.MaxValue; // Track our closest tree's position Vector3 closestTreePosition = new Vector3(); // Let's find the closest tree to the place we chopped and hit something int closestTreeIndex = 0; for (int i = 0; i < treeInstances.Length; i++) { TreeInstance currentTree = treeInstances[i]; // The the actual world position of the current tree we are checking Vector3 currentTreeWorldPosition = Vector3.Scale(currentTree.position, terrain.size) + Terrain.activeTerrain.transform.position; // Find the distance between the current tree and whatever we hit when chopping float distance = Vector3.Distance(currentTreeWorldPosition, hit.point); // Is this tree even closer? if (distance < maxDistance) { maxDistance = distance; closestTreeIndex = i; closestTreePosition = currentTreeWorldPosition; } } // Remove the tree from the terrain tree list TreeInstances.RemoveAt(closestTreeIndex); terrain.treeInstances = TreeInstances.ToArray(); // Now refresh the terrain, getting rid of the darn collider float[,] heights = terrain.GetHeights(0, 0, 0, 0); terrain.SetHeights(0, 0, heights); // Put a falling tree in its place Instantiate(FallingTreePrefab, closestTreePosition, Quaternion.identity); Debug.Log(DateTime.Now - start); } } } } Now, when i click on the tree it freeze on 1-3 sec. Someone know how can i remove this freeze ? ;/ I could place trees manually, but map is too large for this.

Viewing all articles
Browse latest Browse all 513

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>