Hey there guys! I have a quandry. I have a project which allows the player to chop a tree from the terrain, and in turn when the tree is “dead” it instantiates a chopped tree model in it’s place, which falls to the gorund.
My question is this. We have multiple tree models in the game of course, and only one chopped tree model currently. So the same chopped model gets spawned for all trees, which does not fit all of the tree models.
What I’m looking to do is check for the actual name of the tree object being chopped, and then we’ll do an if statement that would say if hitTree == palmTree, instance the palm tree prefab instead of a general prefab.
What I’m not sure of how to do is check for the name of the tree being hit. Here is the script we have going (bolt networked)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[BoltGlobalBehaviour]
public class treeCallbacks : Bolt.GlobalEventListener
{
private List<TreeInstance> TreeInstances;
Terrain kappa;
GameObject keepo;
public int[] deadTrees = new int[100];
int timer = 0;
public override void OnEvent(treeRespawn evnt)
{
//ADD check location for Bolt tree
List<TreeInstance> trees = new List<TreeInstance>(kappa.terrainData.treeInstances);
TreeInstance PogChamp;
//trees[evnt.ID] = new TreeInstance();
PogChamp = trees[evnt.ID];
//PogChamp.position = Vector3.Scale(PogChamp.position, kappa.terrainData.size) + kappa.transform.position;
PogChamp.position.y += 0.1f;
trees[evnt.ID] = PogChamp;
//trees.RemoveAt(this);
kappa.terrainData.treeInstances = trees.ToArray();
/*
List<TreeInstance> trees = new List<TreeInstance>(kappa.terrainData.treeInstances);
TreeInstance PogChamp;
//trees[evnt.ID] = new TreeInstance();
Debug.Log(trees[evnt.ID].position.y);
PogChamp = trees[evnt.ID];
Debug.Log(PogChamp.position.y);
PogChamp.position.y += 100;
Debug.Log(PogChamp.position.y);
trees[evnt.ID] = PogChamp;
//trees.RemoveAt(this);
kappa.terrainData.treeInstances = trees.ToArray();
*/
//TreeInstance treeInstance = terrain.terrainData.treeInstances[i];
GameObject capsule = GameObject.CreatePrimitive(PrimitiveType.Capsule);
CapsuleCollider capsuleCollider = capsule.GetComponent<Collider>() as CapsuleCollider;
capsuleCollider.center = new Vector3(0, 5, 0);
capsuleCollider.height = 10;
DestroyableTree tree = capsule.AddComponent<DestroyableTree>();
tree.terrainIndex = evnt.ID;
capsule.transform.position = Vector3.Scale(trees[evnt.ID].position, kappa.terrainData.size) + kappa.transform.position;
capsule.tag = "Tree";
capsule.transform.parent = kappa.transform;
capsule.GetComponent<Renderer>().enabled = false;
if (BoltNetwork.isServer)
deadTrees[evnt.ID] = -1;
}
public override void OnEvent(treeRemove evnt)
{
bool okToSend = true;
if (okToSend)
{
List<TreeInstance> trees = new List<TreeInstance>(kappa.terrainData.treeInstances);
TreeInstance PogChamp;
//trees[evnt.ID] = new TreeInstance();
PogChamp = trees[evnt.ID];
PogChamp.position.y -= 0.1f;
trees[evnt.ID] = PogChamp;
//trees.RemoveAt(this);
kappa.terrainData.treeInstances = trees.ToArray();
if (BoltNetwork.isServer)
for (var i = 0; i < deadTrees.Length; i += 1)
{
if (deadTrees[i] == -1)
{
deadTrees[i] = evnt.ID;
break;
}
}
//BoltNetwork.Instantiate(evnt.pid, evnt.pos, evnt.rot);
//int k = evnt.ID;
//kappa.terrainData.treeInstances[evnt.ID].
//TreeInstances = new List<TreeInstance>(Terrain.activeTerrain.terrainData.treeInstances);
//TreeInstances.RemoveAt(evnt.ID);
//kappa.terrainData.treeInstances = TreeInstances.ToArray();
//kappa.terrainData.treeInstances[evnt.ID] = new TreeInstance();
// Now refresh the terrain, getting rid of the darn collider
//float[,] heights = kappa.terrainData.GetHeights(0, 0, 0, 0);
//kappa.terrainData.SetHeights(0, 0, heights);
}
}
public override void OnEvent(resourceRemove evnt)
{
bool okToSend = true;
if (okToSend)
{
keepo.transform.GetChild(evnt.number).gameObject.active = false;
//spawn ore on server
if (BoltNetwork.isServer)
BoltNetwork.Instantiate(BoltPrefabs.RockBolt, keepo.transform.GetChild(evnt.number).position, keepo.transform.GetChild(evnt.number).rotation);
}
}
public void Update()
{
//server respawn tree every x seconds
if (BoltNetwork.isServer)
if (timer == 5000)
{
int k = -1;
for (var i = 0; i < deadTrees.Length; i += 1)
{
if (deadTrees[i] != -1)
{
k = deadTrees[i];
deadTrees[i] = -1;
break;
}
}
if (k != -1)
using (var evnt = treeRespawn.Raise(Bolt.GlobalTargets.Everyone))
{
evnt.ID = k;
}
timer = 0;
}
else timer++;
if (kappa == null)
kappa = GameObject.Find("Terrain").GetComponent<Terrain>();
if (keepo == null)
keepo = GameObject.Find("ORES");
}
public void Start()
{
//if (BoltNetwork.isServer)
for (var i = 0; i < deadTrees.Length; i += 1)
deadTrees[i] = -1;
}
}