Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Prefabs de arboles para gaia

Iniciado por mutoit, Noviembre 09, 2017, 10:16:08 PM

Tema anterior - Siguiente tema
Buenas, sabeis si hay algo especial con los arboles ? tengo el prefab con su script que funciona bien...es para talar la madera etc. Pero cuando los spawnea gaia no los reconoce como el prefab.
 
Si lo hago con el editor de unity añadiendo el arbol y pintando sobre el terreno tampoco.
 
Si añado el arbol a escena si.
 
Entonces que falla ? o como se hace para meter recursos por el mapa ? 

Noviembre 11, 2017, 12:36:35 PM #1 Ultima modificación: Noviembre 11, 2017, 12:39:06 PM por Igor
unity añade todos los arboles en el terrain....
 
tienes terrain.treeInstances....
 
podrias hacer un "foreach tree intreeInstances"  ...y comparar las posiciones o las distancias al player para saber cual de los arboles es.... y luego borrarlo...
 
algo asi....
 
 
 

for (int i = treeInstances.Length-1; i > -1; i--) {
   if (distance < range) { //por ejemplo
       treeInstances.Remove(i);
   }
}
                       

 
fijate que he hecho el bucle "for" alrreves.... empezando por el final (de atras a delante) para que no falle al borrar un elemento...
 
 
 
ah claro, no he puesto pa parte de calcular la distancia (o la posicion...)... eso dependera de como lo quieras hacer...
 
yo solo te he puesto un ejemplo simple de como eliminar un arbol de un terrain...

Ah coño no lo conocía. Además debo meter un remplazo cuando detecte ese árbol no? Algo como instanciate. Lo que no entiendo es porque un - 1 como contador.. 

si, porias instanciar un arbol como reemplazo y hacer que caiga(al cortarlo) o instanciar un "tocon"... o lo que quieras
 
 
 
un array o List de 35 elementos(porejemplo)
 
empieza en el elemento 0 y termina en el 34... (Length - 1) 
 
si haces el "for" alrreves, el primer elemento a comprobar seria el 34(Length - 1) y el ultimo seria el 0 (mientras "i" sea mayor que -1
 
 
 
 
 
si estas contando hacia adelante, y borras un elemento(arbol), el array o List tendra un elemento menos y dara fallo de " out of index" al llegar al ultimo elemento, porque habra uno menos que cuando empezo el bucle "for"....
 
porejemplo tu lista de arboles tiene 35 elementos y borras el 34... entonces el elemento 35 pasara a ser el 34, pero tu bucle for intentara "buscar" el elemento 35 que ya no existe...
 
pero si haces hacia "atras", y borras el elemento 35(por ejemplo) pues como luego va a comprovar el 34 no va a dar fallo...

Ah genial vale. Lo intento esta noche aver si me sale bien. Muchas gracias. 

Cita de: mutoit date=1510403931Ah genial vale. Lo intento esta noche aver si me sale bien. Muchas gracias. 
   


no se si tienes un unico terreno o son multiples terrenos juntos....
 
y nose como compruebas para cortarlo.... hacer un raycast/spherecast? porque unity dira que has colisionado con un terreno, no con un arbol.... (hagas lo que hagas...)
 
podrias comprobar las "normales" del impacto, si impactas con un terreno(hit.collider.name == "terrain" y el "hit.normal.y == 0" es que has impactado contra algo vertical( segiramente un arbol) luego compruevas la distancia para ver si hay un arbol cerca...
 
y si existe ese arbol, pues lo borras...
 
y creo tendras luego tendras que volver a asignar las instancias...
 
algo asi:(codigo sin comprobar, escrito directamente aqui...)
 
cutPosition es el "hit.point"
 

void CutTree(Terrain t, Vector3 cutPosition) {
   GameObject[] treeArray = t.treeInstances;
 
   for (int i = treeArray.Length - 1; i > -1; i--) {
      if (Vector3.Distance(cutPosition, treeArray.transform.position) < 2.0f) {
           treeArray.Remove(i);
                                                                                //no se si funcionara asi... sino habra que crear un nuevo array con todos los elementos menos ese... o hacerlo con "List"
                                                                         }
                                                                               t.treeInstances = treeArray;
       //volver a asignar los arboles al terreno      
                                                                                //quizas tengas que hacer t.Flush();//actualizar terreno
                                                                         }

 
 

pues mira..no tengo idea, voy a ver si lo intento esta noche o ya mañana,salga lo que salga te dire algo,gracias por tus aportes o si no iria perdidisimo ! 
 
 

Por ahora lo he dejado de lado, me empezaron a salir otros problemas y que ademas trabajo mas de lo que me gustaria :P 
 
Pero muchas gracias, en algun momento me pondre enserio porque es algo que quiero plasmar ! 

Etiquetas: