Noticias

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

Ayuda acript de disparo

Iniciado por Mega, Agosto 07, 2017, 06:15:05 PM

Tema anterior - Siguiente tema
Agosto 07, 2017, 06:15:05 PM Ultima modificación: Agosto 18, 2017, 09:13:57 AM por Mega
Hola, quiero hacer que se dispare un objeto cada dos segundos pero lo que he conseguido es que a los dos segundo tire el objeto pero no uno ,dispara como una metralleta.Solo quiero que cada dos segundos dispare uno.
 
Gracias de antemano.
 

pragma strict
var projectile : Rigidbody;
var TiempoDisparo : float;
var speed = -7;
function Start () {
    
}
function Update () {
  disparador();
}
function disparador(){
  yield WaitForSeconds(TiempoDisparo);
    var instantiatedProjectile : Rigidbody = Instantiate(
   projectile, transform.position, transform.rotation );
  instantiatedProjectile.velocity =
   transform.TransformDirection( Vector3( speed, , ) );
  Physics.IgnoreCollision( instantiatedProjectile. GetComponent.<Collider>(),
   transform.root.GetComponent.<Collider>() );
}

 
 

A ver. El problema es que lo llamas a través de Update(), que se ejecuta en cada frame (le pones yield, pero si lo ejecutas en cada frame solo desplazas el tiempo inicial,,,). Te dejo la documentación  de unity3d:
 
https://docs.unity3d.com/ScriptReference/WaitForSeconds.html
 
 
 
Hay muchas formas de hacer esto. Tienes yield en tu propia coroutine o una variable de tiempo propia. Esta última simplemente consiste en una variable que pones a TiempoDisparo. Al disparar reduces esta variable en update a time.deltaTime hasta que llegue a cero. Entonces la reinicias y se realiza un disparo.

Si, yo haria lo de la variable como dice @marcoscuro1, 
 
Definiria una variable float para contar el tiempo y quitaria lo de yield WaitForSeconds ya que es innecesario al contar el tiempo con una variable definida
 
Ej:
 


....
var tiempoDisparo: float;
//tiempo en segundos entre cada disparo
var tiempoTrancurrido = 0f;
//variable para contar el tiempo
....
function Update() {
   tiempoTranscurrido = tiempoTranscurrido + Time.timeDelta;
   //sumar el tiempo transcurrido
   if (tiempoTranscurrido > tiempoDisparo) {
      tiempoTranscurrido = 0;
      // resetear el tiempo
      disparador();
   }
}
...
//y en la funcion disparador borrar la linea de "yield"

 
 

No es mas facil algo asi?
 

var espera : boolean;
function Start(){
espera = false;
}
function Update(){
if(espera == false){
       Disparar();
   espera = true;
    }
}
function Disparar(){
//haces todo tu codigo de disparo
//Al final del codigo pones esto
     yield WaitForSeconds(2);
espera = false;
}

 
asi, comprobas siempre si espera es falso, si lo es, te vas a la funcion disparar, mientras tanto, pones espera en verdadero, haces todo tu codigo de disparo, cuando terminas, le decis que espere 2 segundos y al finalizar pones espera en falso de nuevo, para que vuelva a realizar el disparo...
 
Tambien podes cambiar el 2 por una variable y decirle que espera tanto tiempo como diga la variable --> yield WaitForSeconds(variable); <--
 
No se, es otra idea, y te ahorras todo el procesamiento de andar sumando y contando tiempo...

Cita de: arjmaj date=1502928630No es mas facil algo asi?
   
   

var espera : boolean;
function Start(){
espera = false;
}
function Update(){
if(espera == false){
       Disparar();
   espera = true;
    }
}
function Disparar(){
//haces todo tu codigo de disparo
//Al final del codigo pones esto
     yield WaitForSeconds(2);
espera = false;
}

   
      asi, comprobas siempre si espera es falso, si lo es, te vas a la funcion disparar, mientras tanto, pones espera en verdadero, haces todo tu codigo de disparo, cuando terminas, le decis que espere 2 segundos y al finalizar pones espera en falso de nuevo, para que vuelva a realizar el disparo...
   
   
      Tambien podes cambiar el 2 por una variable y decirle que espera tanto tiempo como diga la variable --> yield WaitForSeconds(variable); <--
   
   
      No se, es otra idea, y te ahorras todo el procesamiento de andar sumando y contando tiempo...
   


Muchísimas gracias

De nada, lo hice en el aire, asi que probalo y me decis que tal! jaja...

@Mega, estás incumpliendo varias normas de la Comunidad:
 

  •    Poner de título del tema algo confuso o poco claro. Por favor, corrígelo y explica mejor qué necesitas.


  •    Poner un título de tema en Mayúsculas, como si gritaras. Acostúmbrate a escribir normalmente, por favor.


  •    No usar los <> y "Quote", para pegar código: Te mandé un mensaje con las buenas prácticas de la Comunidad cuando te registraste. Apréndetelas bien, por favor.


 
 
Los próximos temas o mensajes que no cumplan estas normas serán borrados sin explicación alguna.

Cita de: pioj date=1503037159@Mega, estás incumpliendo varias normas de la Comunidad:
   
   


  •          Poner de título del tema algo confuso o poco claro. Por favor, corrígelo y explica mejor qué necesitas.
          

  •       

  •          Poner un título de tema en Mayúsculas, como si gritaras. Acostúmbrate a escribir normalmente, por favor.
          

  •       

  •          No usar los <> y "Quote", para pegar código: Te mandé un mensaje con las buenas prácticas de la Comunidad cuando te registraste. Apréndetelas bien, por favor.
          

  •    

       
   
   
      Los próximos temas o mensajes que no cumplan estas normas serán borrados sin explicación alguna.
   


Lo siento mucho mucho , lo tendré en cuenta la próxima vez

Cita de: arjmaj date=1502928630No es mas facil algo asi?
   
   

var espera : boolean;
function Start(){
espera = false;
}
function Update(){
if(espera == false){
       Disparar();
   espera = true;
    }
}
function Disparar(){
//haces todo tu codigo de disparo
//Al final del codigo pones esto
     yield WaitForSeconds(2);
espera = false;
}

   
      asi, comprobas siempre si espera es falso, si lo es, te vas a la funcion disparar, mientras tanto, pones espera en verdadero, haces todo tu codigo de disparo, cuando terminas, le decis que espere 2 segundos y al finalizar pones espera en falso de nuevo, para que vuelva a realizar el disparo...
   
   
      Tambien podes cambiar el 2 por una variable y decirle que espera tanto tiempo como diga la variable --> yield WaitForSeconds(variable); <--
   
   
      No se, es otra idea, y te ahorras todo el procesamiento de andar sumando y contando tiempo...
   


Muchas gracias funciona perfectamente.Mis dieses
 
 

Etiquetas: