Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: ramunda en Junio 01, 2017, 10:36:48 PM

Título: Disparo enemigo(resuelto).
Publicado por: ramunda en Junio 01, 2017, 10:36:48 PM
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!!!
 
 
 
 
 
 
 
 
Título: Disparo enemigo(resuelto).
Publicado por: GSG3D en Junio 01, 2017, 11:42:28 PM
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.
 
 
Título: Disparo enemigo(resuelto).
Publicado por: ramunda en Junio 01, 2017, 11:48:44 PM
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);
}
}
 


 
 
 
 
Título: Disparo enemigo(resuelto).
Publicado por: ramunda en Junio 02, 2017, 12:33:20 AM
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);
}
}