Noticias

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

Disparo enemigo(resuelto).

Iniciado por ramunda, Junio 01, 2017, 10:36:48 PM

Tema anterior - Siguiente tema
Junio 01, 2017, 10:36:48 PM Ultima modificación: Junio 02, 2017, 12:34:14 AM por ramunda
Buenas noches , tengo un pequeño problema con un disparo que me realiza un enemigo.
 
En este caso es una nave enemiga que al estar en un rango de alcance, me dispara. hasta aquí todo esta bien.
 
El problema viene cuando instancio el láser que me dispara el enemigo....intento que me dispare en intervalos osea que salga por ejemplo 1 laser cada segundo pero me saca 300 lasers seguidos y en linea!!
 
no veo donde fallo para que solo dispare un laser cada por ejemplo 1 segundo.
 
Este es el script:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class enemigoataca : MonoBehaviour {
private Transform target;
public int moveSpeed;
public int rotationSpeed;
public int maxRange;
public int minRange;
public GameObject bulletPrefab;
public Transform bulletSpawn;
public float speed;
AudioSource audio;
bool disparo =false;
public float tiempodisparo =0.5f;
private float nextFire =0.0f;
 
private Transform myTransform;
void Awake()
{
   myTransform = transform;
}
void Start ()
{
   GameObject go = GameObject.FindGameObjectWithTag("Player");
   target = go.transform;
}
 
void Update ()
{
   Debug.DrawLine(target.position, myTransform.position, Color.yellow);
   //Look at target
   myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
   if ((Vector3.Distance (transform.position, target.position) < maxRange) && (Vector3.Distance (transform.position, target.position) > minRange))
   {
      transform.LookAt (target);
      transform.Translate (Vector3.forward * moveSpeed * Time.deltaTime);
      Invoke("Fire",3);
   }
}
void Fire()
{
       nextFire = Time.time + tiempodisparo;
   var bullet = (GameObject)Instantiate (bulletPrefab, bulletSpawn.position, bulletSpawn.rotation);
       Destroy(bullet, 0.3f);
}
}
 
 

 
Agradecería una ayuda o idea, gracias de antemano!!!
 
 
 
 
 
 
 
 

Seguramente la llamada a la funcion
 

Invoke("Fire",3);

 
la estas ejecutando continuamente por el Update, porque el condicional es verdadero.

Pon un Debug.Log dentro del condicional y mira si es asi.
 
 

Junio 01, 2017, 11:48:44 PM #2 Ultima modificación: Junio 02, 2017, 12:03:03 AM por ramunda
Cita de: GSG3D date=1496353348Seguramente la llamada a la funcion
   
   

Invoke("Fire",3);

   
      la estas ejecutando continuamente por el Update, porque el condicional es verdadero.

      Pon un Debug.Log dentro del condicional y mira si es asi.
   
   
       
   


si , asi es se repite constantemente.
 
aver si puedo hacer una coorutina.
 
he probado asi, en este caso esta fuera de el update, pero sigue sin funcionar.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class enemigoataca : MonoBehaviour {
private Transform target;
public int moveSpeed;
public int rotationSpeed;
public int maxRange;
public int minRange;
public GameObject bulletPrefab;
public Transform bulletSpawn;
public float speed;
AudioSource audio;
private Transform myTransform;
void Awake()
{
   myTransform = transform;
}
IEnumerator disparos()
{
   yield return new WaitForSeconds (10);
   Fire ();
}

   
void Start ()
{
   GameObject go = GameObject.FindGameObjectWithTag("Player");
   target = go.transform;
}
 
void Update ()
{
   Debug.DrawLine(target.position, myTransform.position, Color.yellow);
   //Look at target
   myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
   if ((Vector3.Distance (transform.position, target.position) < maxRange) && (Vector3.Distance (transform.position, target.position) > minRange))
   {
      transform.LookAt (target);
      transform.Translate (Vector3.forward * moveSpeed * Time.deltaTime);
      StartCoroutine("disparos");
      Debug.Log ("disparo");
   }
}
void Fire()
{
   var bullet = (GameObject)Instantiate (bulletPrefab, bulletSpawn.position, bulletSpawn.rotation);
   Destroy(bullet, 2f);
}
}
 


 
 
 
 

Bueno ....el tema esta solucionado.Gracias a  #GSG3D, he creado un timer el cual espera el tiempo para que instancie de nuevo el prefab.
 
Ha quedado asi, lo pongo funcionado para posibles lecturas.
 
Muchas gracias.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class enemigoataca : MonoBehaviour {
private Transform target;
public int moveSpeed;
public int rotationSpeed;
public int maxRange;
public int minRange;
public GameObject bulletPrefab;
public Transform bulletSpawn;
//public float speed;
AudioSource audio;
bool dispaross=false;
private float nextFire = 0.0F;
public float fireRate = 0.5F;
private Transform myTransform;
void Awake()
{
   myTransform = transform;
}
void Start ()
{
   GameObject go = GameObject.FindGameObjectWithTag("Player");
   target = go.transform;
}
 
void Update ()
{
   Debug.DrawLine(target.position, myTransform.position, Color.yellow);
   //mir al player
   myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
   if ((Vector3.Distance (transform.position, target.position) < maxRange) && (Vector3.Distance (transform.position, target.position) > minRange) && Time.time >nextFire)
   {
      transform.LookAt (target);
      transform.Translate (Vector3.forward * moveSpeed * Time.deltaTime);
      Fire();
   }
}
void Fire()
{
   nextFire = Time.time + fireRate;
   var bullet = (GameObject)Instantiate (bulletPrefab, bulletSpawn.position, bulletSpawn.rotation);
   Destroy(bullet, 2f);
}
}

 
 

Etiquetas: