Jump to content
MotoSierraProducciones

No puedo hacer una lista de enemigos y agregarla al destination del navmeshagent

Recommended Posts

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.....

Edited by pioj
Evita poner tags irrelevantes...

Share this post


Link to post
Share on other sites

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...

 

 

  • Like 1

Share this post


Link to post
Share on other sites

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???

Edited by MotoSierraProducciones

Share this post


Link to post
Share on other sites
44 minutes ago, MotoSierraProducciones said:

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??? 

Asegurate que no sean hijos de  un objeto enemigo y que su padre sea un objeto vacío.

  • Like 1

Share this post


Link to post
Share on other sites
2 hours ago, Soy C# said:

Asegurate 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.

Captura.PNG

Share this post


Link to post
Share on other sites
6 hours ago, Soy C# said:

Muestra 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);
		}
	}
}

 

Share this post


Link to post
Share on other sites
10 hours ago, MotoSierraProducciones said:
11 hours ago, MotoSierraProducciones said:

//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.

 

11 hours ago, MotoSierraProducciones said:

int 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.

  • Like 1

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...