Unity Spain

Mesa de ayuda => Unity3D => Scripting => Mensaje iniciado por: MotoSierraProducciones en Febrero 06, 2019, 05:28:12 PM

Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: MotoSierraProducciones en Febrero 06, 2019, 05:28:12 PM
tengo un par de problemas con un script, ya que yo usaba solo JS se me dificulta un poco el hacer ciertas cosas en C#
 
El Objertivo esta en el Update, ya que se van a estar instanciando varios enemigos durante la escena, quiero que detecte a todos en cada momento, al guardarlos en una lista (Array [ ]), no me deja ponerlos como el objetivo, ya qu e sale un error de convercion a transform o position.
 
 
 
como puedo hacer que en la lista, ejemplo: 3 enemigos (Enemigo 0, Enemigo1, Enemigo 2) me detecte el que esta mas cerca y vaya tras el, y no que se vaya por el ultimo de la lista
 
te muestro este script:
 

   //Estadisticas
public int Salud = 100;
public int Velociad = 2;
//Componentes
public UnityEngine.AI.NavMeshAgent Agente;
//Enemigos
public Transform Objetivo;
GameObject Obj;
//Funciones
void Update () {
   Objetivo = GameObject.FindGameObjectWithTag("Humano").transform;
   if (Obj == null) {
      Debug.Log ("Ganaste");
   }
   
   Agente.destination = Objetivo.position;
}
void OnTriggerEnter (Collider otro) {
   if (otro.tag == "Humano") {
      Obj = otro.gameObject;
   }
}

 
Asi como esta el Script busca al ultimo creado, pero esta hasta el fondo, pasa a travez de todos para atacar al que esta mas escondido, algo ilogico.
 
 
 
Espero me haya explicado y puedas entenderme y ayudarme, estoy estancado con eso desde hace mucho.....
Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: pioj en Febrero 08, 2019, 11:54:32 AM
Se puede hacer de muchas maneras. Por ejemplo:
 

  1.    Primero se saca con un bucle todos los GameObjects/Collisions que estén dentro del radio del Trigger/Raycast/SphereCast. Los metes dentro de un Array[..] o un List<>, tú decides.


  2.    Luego se filtran según si son "Humano", y recoge de todos ellos sus Transforms. Ahora deberías tener un Array o una List de Transforms.


  3.    Por último, ordena ese array por distancias relativas al Player, y el primero de la lista será el objetivo al que ir.


También se puede recoger el primer objeto que entre en tu trigger, ya que generalmente es el que está más cerca del Player.
 
O también se puede recoger de uno en uno, y compararlo en Vector3.Distance con el actual candidato que tengas asignado en una variable...
 
 
 
 
Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: MotoSierraProducciones en Febrero 08, 2019, 05:07:23 PM
Ok Pero traducido eso en código como seria?
 
He estado buscando durante toda la noche y no he logrado hacerlo...
 
 
 
y tengo otro problema que me acaba de surgir, al destruir un "enemigo" se eliminan todos los enemigos a la vez, como podria solucionar eso???
Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: Soy C# en Febrero 08, 2019, 05:54:18 PM
Cita de: MotoSierraProducciones date=1549642043y tengo otro problema que me acaba de surgir, al destruir un "enemigo" se eliminan todos los enemigos a la vez, como podria solucionar eso??? 
   


Asegurate que no sean hijos de  un objeto enemigo y que su padre sea un objeto vacío.
Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: MotoSierraProducciones en Febrero 08, 2019, 08:48:20 PM
Cita de: Soy C# date=1549644858Asegurate que no sean hijos de  un objeto enemigo y que su padre sea un objeto vacío.
   


Estan por separado, cada uno con su script (El mismo script lo llevan todos),  pero al hacer una acción 1 los demás lo hacen igual.
 
 (//<fileStore.core_Attachment>/monthly_2019_02/Captura.PNG.ff61e3032cafbb9f5f8704c904e6b9d7.PNG)
Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: Soy C# en Febrero 09, 2019, 01:36:31 AM
Muestra el código a ver que está mal.
Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: MotoSierraProducciones en Febrero 09, 2019, 07:40:50 AM
Cita de: Soy C# date=1549672591Muestra el código a ver que está mal.
   


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Soldado2 : MonoBehaviour {
//Componentes
public UnityEngine.AI.NavMeshAgent Agente;
//Instancias
public GameObject Zombie;
//Objetos
static public Transform Zombie1;
//Variables
static public bool Escapar = false;
static public bool Calculo = false;
void Update () {
   if (Escapar == true) {
      Agente.destination = this.gameObject.transform.position - Zombie1.position;
   }
   if (Calculo == true) {
      Calcular();
   }
}
void Calcular () {
   int Calculo = Random.Range (0,3);
   if (Calculo == 0) {
      Destroy (this.gameObject);
   }
   if (Calculo == 1) {
      Instantiate (Zombie, transform.position, transform.rotation);
      Destroy(this.gameObject);
   }
   if (Calculo == 2) {
      Destroy (this.gameObject);
   }
   if (Calculo == 3) {
      Instantiate (Zombie, transform.position, transform.rotation);
      Destroy(this.gameObject);
   }
}
}

 
 
Título: No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent
Publicado por: Soy C# en Febrero 09, 2019, 06:43:27 PM
Cita de: MotoSierraProducciones date=1549694450
Cita de: MotoSierraProducciones date=1549694450//Variables static public bool Escapar = false; static public bool Calculo = false;
         
      
   

      Allí está tu problema en que las variables son estáticas y cuando la cambias en un objeto cambian en todos los scripts.
   


 
 
Cita de: MotoSierraProducciones date=1549694450int Calculo = Random.Range (0,3);
   


También tienes código que no se ejecuta en la condición if(Calculo == 3) {hacer algo;}
 
Y eso es porque Random.Range devuelve un número aleatorio entre (valor minimo y valor máximo - 1) en tu caso la variable random nunca devuelve un 3 sólo llega al dos.