Noticias

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

Problema con script de recarga y balas con raycast

Iniciado por ramunda, Junio 10, 2015, 01:55:00 PM

Tema anterior - Siguiente tema
Muy buenas espero que alguien sepa ayudarme en este dilema que llevo semanas y no puedo solucionar....
 
Tengo un scrip a mi metralleta que dispara balas con raycast hace agujeros todo perfecto , pero me gustaria que tuviera un numero de balas/cargadores y que cuando se acabaran dejara de disparar y pudiera coger mas de por el suelo etc.
 
Pues bien despues de 2 semanas rompiendome la cabeza y montdo el script...nada ni gasta balas y ni recarga ni me dice cuantas tengo nada de na
 
Por favor alguien me de luz a estooooo
 
Uso Unity 5
 
Aqui el script.(JS)

#pragma strict
var Effect : Transform;
var TheDammage = 100;
var fireRate : float = 0.5;
private var nextFire : float = 0.0;
private var reloading = false;
var reloadTime = 2.0;
private var st : int;
var clipAmmo = 50;
var clipSize = 50;
var stockAmmo = 100;
function Update () {
Fire ();
}
function Fire () {
if(Input.GetButton("Fire1") && Time.time > nextFire) {
nextFire =  Time.time + fireRate;
 
    var hit : RaycastHit;
    var ray : Ray = Camera.main.ScreenPointToRay(Vector3(Screen.width*0.64, Screen.height*0.4, 0));
        if(Input.GetButton("Fire1"))
         {
        if (Physics.Raycast (ray, hit, 100))
        {
            var particleClone = Instantiate(Effect, hit.point, Quaternion.LookRotation(hit.normal));
            Destroy(particleClone.gameObject, 1);
            hit.transform.SendMessage("ApplyDammage", TheDammage, SendMessageOptions.DontRequireReceiver);
        }
    }
 
}
}
if (Input.GetKeyDown ("space")){
  if(clipAmmo<clipSize && reloading == false && stockAmmo !=0){
   SaveTime(Time.time);
   reloading = true;
  }
}
if(st < Time.time && reloading == true){
  Reload();
}
//Making it show that you are reloading.
function OnGUI(){
if(reloading == true){
  GUI.Box(Rect(250,200,100,25),"Reloading");
}
}
function Reload(){
if(clipAmmo < clipSize){
  var neededAmmo = clipSize-clipAmmo;
  if(stockAmmo >neededAmmo){
   clipAmmo = clipSize;
   stockAmmo -= neededAmmo;
  }else if(stockAmmo <= neededAmmo){
   clipAmmo += stockAmmo;
   stockAmmo = 0;
  }
}
reloading = false;
}
function SaveTime(time){
st = reloadTime + Time.time;
 

Gracias y espero respuesta cuando se pueda.!!
 
 

Junio 10, 2015, 02:35:22 PM #1 Ultima modificación: Junio 10, 2015, 02:43:45 PM por ProgramacionWH
Me extraña que sepas hacer eso y no sepas restar 1 bala por disparo pero bueno jajaja:

function Fire () {
    if(Input.GetButton("Fire1") && Time.time > nextFire) {
        nextFire = Time.time + fireRate;
        var hit : RaycastHit;
        var ray : Ray = Camera.main.ScreenPointToRay(Vector3(Screen.width*0.64, Screen.height*0.4, 0));
        if(Input.GetButton("Fire1")){ //NO ENTIENDO PORQUE HACES ESTA COMPROBACION OTRA VEZ,Creo que sobra
            if (Physics.Raycast (ray, hit, 100)){
                var particleClone = Instantiate(Effect, hit.point, Quaternion.LookRotation(hit.normal));
                Destroy(particleClone.gameObject, 1);
                hit.transform.SendMessage("ApplyDammage", TheDammage, SendMessageOptions.DontRequireReceiver);
            }
        }
        //AQUI YA SE HA EJECUTADO EL DISPARO POR LO TANTO:
        if(clipAmmo > 0) //Comprobamos que tiene municion.
            clipAmmo--; //Restas una bala...
       
        //No anides estos IF con un else porque modificas clipAmmo de por medio y te dara lugar a un bug
        if(clipAmmo <= 0){ //Has disparado y te has quedado sin balas, ahora te toca a ti decidir si recargas automaticamente o tiene que darse cuenta el jugador , un ejemplo:
              Reload();
        }
    }
}

Otra cosa, y siento meterme donde no me llaman pero me pica la curiosidad como haces el Raycast, probablemente sea por algun motivo "especial" que desconozco pero bueno por si no lo sabes otra forma mas simple y que te puede ayudar al hacer hacer el retroceso y tal es hacer el RayCast utilizando:

WeaponGameObject.transform.forward

 como direccion del RayCast.
 
Bueno un saludo!

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Junio 10, 2015, 05:12:50 PM #2 Ultima modificación: Junio 10, 2015, 05:19:36 PM por ramunda
Cita de: ProgramacionWH date=1433939722Me extraña que sepas hacer eso y no sepas restar 1 bala por disparo pero bueno jajaja:

function Fire () {
    if(Input.GetButton("Fire1") && Time.time > nextFire) {
        nextFire = Time.time + fireRate;
        var hit : RaycastHit;
        var ray : Ray = Camera.main.ScreenPointToRay(Vector3(Screen.width*0.64, Screen.height*0.4, 0));
        if(Input.GetButton("Fire1")){ //NO ENTIENDO PORQUE HACES ESTA COMPROBACION OTRA VEZ,Creo que sobra
            if (Physics.Raycast (ray, hit, 100)){
                var particleClone = Instantiate(Effect, hit.point, Quaternion.LookRotation(hit.normal));
                Destroy(particleClone.gameObject, 1);
                hit.transform.SendMessage("ApplyDammage", TheDammage, SendMessageOptions.DontRequireReceiver);
            }
        }
        //AQUI YA SE HA EJECUTADO EL DISPARO POR LO TANTO:
        if(clipAmmo > 0) //Comprobamos que tiene municion.
            clipAmmo--; //Restas una bala...
       
        //No anides estos IF con un else porque modificas clipAmmo de por medio y te dara lugar a un bug
        if(clipAmmo <= 0){ //Has disparado y te has quedado sin balas, ahora te toca a ti decidir si recargas automaticamente o tiene que darse cuenta el jugador , un ejemplo:
              Reload();
        }
    }
}

Otra cosa, y siento meterme donde no me llaman pero me pica la curiosidad como haces el Raycast, probablemente sea por algun motivo "especial" que desconozco pero bueno por si no lo sabes otra forma mas simple y que te puede ayudar al hacer hacer el retroceso y tal es hacer el RayCast utilizando:

WeaponGameObject.transform.forward

 como direccion del RayCast.
 
Bueno un saludo!
 
ProgramacionWH, antes que nada decirte GRACIAS!!!, por responder a mi post y gracias por ser tan rapido!!!, estoy entusiasmado, respondiendo gratamente a tus 2 preguntas:
 
Me extraña que sepas hacer eso y no sepas restar 1 bala por disparo pero bueno jajaja: Facil porque este script lo he echo a trozos hahahhaa un poco de aqui un poco de alli y dentro lde lo lerdo que soy voy juntando y con logica uniendo y haciéndolo funcionar hasta que me rindo XDDDD, lo del raycast...ni idea!!! lo monte a chachos también y puse esas variables hasta que el disparo me salia acorde con el arma!!,  lo que me has añadido al scrip lo he puesto y borrado lo de abajo como me comentastes los if....pero la metralleta sigue disparando como una loca sin recargar ni naaa y sin quedarse sin balas o cargadores...me comentas que ponga el Reload....soy lerdo! no se como hacerlo  porfavor dame mas instrucciones!! , desearia que cuando se quedara sin balas o cargadores no disparara.....y si no es molestia y no te supone un gran trabajo(porque veo que sabes como 10000 veces mas que yo), que al cojer un ojbeto tip cargador se le añadieran balas...espero de verdad que leas esto y pueda conseguir mi metralleta recargable XD , muchas muchas gracias!!! , a se me olvidaba...donde deberia meter lo de el raycast que me has mencionado?
 
Saludotes!!! espero saber de tiiii
 
P.D :meterte donde no te llaman?, todo al contrario!!! encantado de que me lo digas y aprender de los que saben!! lo que sea dímelo por favor!!!
 
 
 

Junio 10, 2015, 05:30:35 PM #3 Ultima modificación: Junio 10, 2015, 05:50:28 PM por ProgramacionWH
Vale , creo que esto se te queda un poco grande, deberias empezar por cosas mas simples aun asi vamos a intentarlo:
 
Empezamos por el Reload:

//Variables , te lo pongo en español que es mas intuitivo
var MunicionTotal : int = 300;
var MunicionPorCargador : int = 50;
var MunicionActual : int = 50;
var TiempoRecargando : float = 2.0f;
var EstaRecargando : boolean = false;
//AQUI VAN OTRAS FUNCIONES BLA BLA BLA
function Reload(){
     var MunicionNecesarea = MunicionPorCargador-MunicionActual;
     EstaRecargando= true;
     if(MunicionActual == MunicionPorCargador) { //Cargador esta lleno asique salimos de la funcion
          return;
      }
      If(MunicionNecesarea > MunicionTotal){ //Necesitamos mas municion de la que tenemos, asique asignamos para darle el tope que podemos.
            MunicionNecesarea = MunicionTotal;
      }
      MunicionActual += MunicionNecesarea; //Metemos municion en el cargador.
      MunicionTotal -= MunicionNecesarea;    //La quitamos de la "bolsa".
     
      yield WaitForSeconds(TiempoRecargando); //Esperamos mientras recargamos, la funcion no continua hasta que pasa ese tiempo
      EstaRecargando = false; //Hemos acabado de recargar.
}

Hasta aqui lo entiendes?
 
De todas maneras creo que mejor que que te haga yo el script, deberias visitar el canal de @Jocyf, usuario de este foro , tiene una serie de videotutoriales acerca de hacer exactamente lo que estas pidiendo, muy bien explicado y creo que lo entenderas mucho mejor que si te lo escribo y ya esta:
 
" rel="external nofollow">Aqui su canal y el video

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Junio 10, 2015, 05:57:01 PM #4 Ultima modificación: Junio 10, 2015, 06:17:57 PM por ramunda
Cita de: ProgramacionWH date=1433950235Vale , creo que esto se te queda un poco grande, deberias empezar por cosas mas simples aun asi vamos a intentarlo:
 
Empezamos por el Reload:

//Variables , te lo pongo en español que es mas intuitivo
var MunicionTotal : int = 300;
var MunicionPorCargador : int = 50;
var MunicionActual : int = 50;
var TiempoRecargando : float = 2.0f;
var EstaRecargando : boolean = false;
//AQUI VAN OTRAS FUNCIONES BLA BLA BLA
function Reload(){
     var MunicionNecesarea = MunicionPorCargador-MunicionActual;
     EstaRecargando= true;
     if(MunicionActual == MunicionPorCargador) { //Cargador esta lleno asique salimos de la funcion
          return;
      }
      If(MunicionNecesarea > MunicionTotal){ //Necesitamos mas municion de la que tenemos, asique asignamos para darle el tope que podemos.
            MunicionNecesarea = MunicionTotal;
      }
      MunicionActual += MunicionNecesarea; //Metemos municion en el cargador.
      MunicionTotal -= MunicionNecesarea;    //La quitamos de la "bolsa".
     
      yield WaitForSeconds(TiempoRecargando); //Esperamos mientras recargamos, la funcion no continua hasta que pasa ese tiempo
      EstaRecargando = false; //Hemos acabado de recargar.
}

Hasta aqui lo entiendes?
 
De todas maneras creo que mejor que que te haga yo el script, deberias visitar el canal de @Jocyf, usuario de este foro , tiene una serie de videotutoriales acerca de hacer exactamente lo que estas pidiendo, muy bien explicado y creo que lo entenderas mucho mejor que si te lo escribo y ya esta:
 
" rel="external nofollow">Aqui su canal y el video
 
Estimado WH, estoy mas perdido que un pato sin estanque hahahhaha , siiiiiiiii por favor!!!, házmelo de nuevo , que se quede sin balas pida recargar y si no tiene cargadores que los busque por hay XDDD, seria muyyy veliz!!!!!!!! y si, voy a mirar el canal que me has dicho por supuesto pero asi si tu me lo fabricas debidamente lo mirare 100000 veces hasta que lo entienda y enciam te tomas la molestia de hacerlo en español...madre mia!!! si furas mujer te besaria   , a la espera de el milago ah por cierto antes de que te de mas quebraderos hahhaha asi como esta daña a los enemigos y mueren mira este es el script que esta funcionado y se mueren al darles la bala del raycast:

var Vida = 400;
var choke : Transform;
function ApplyDammage (Dammage : int)
{
Vida -= Dammage;

if(Vida <= 0)
{
   Muere();
}
}
function Muere()
{clone = Instantiate(choke, transform.position, transform.rotation);
Destroy(gameObject);
}   

Con el codigo que tengo ahora osea el que tu jentilmente arreglas se mueren sin problema Xd , espero que eso no cambie  juas me muerooo de ganas de ver que has echo!!!
 
Hasta ahora!!!
 
Por cierto empece a mirar los screencast que me comentaste y lo hace con bolas..no con raycast

Bolas/RayCast no cambia mucho simplemente cuando dispares cambia el Instantiate de la bola y lo referido por un Physics.Raycast correspondiente, aunque sea de 2010 no creo que tengas muchos problemas ya que es un codigo "bastante" general...
Se trata de que entiendas el concepto y lo sepas pasar a codigo, no de que copies y peges sin mas!
Un saludete!

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Cita de: ProgramacionWH date=1434016566Bolas/RayCast no cambia mucho simplemente cuando dispares cambia el Instantiate de la bola y lo referido por un Physics.Raycast correspondiente, aunque sea de 2010 no creo que tengas muchos problemas ya que es un codigo "bastante" general...
Se trata de que entiendas el concepto y lo sepas pasar a codigo, no de que copies y peges sin mas!
Un saludete!
 
por supuesto que si , asi aprendo pero te pido por favor que me agas el script tal i como me digistes asi aprendo aun mas!!!! , espero que no sea mucha molestia para ti
 
Espero impaciente )

Junio 11, 2015, 06:00:00 PM #7 Ultima modificación: Junio 11, 2015, 10:49:45 PM por ramunda
Cita de: ProgramacionWH date=1434016566Bolas/RayCast no cambia mucho simplemente cuando dispares cambia el Instantiate de la bola y lo referido por un Physics.Raycast correspondiente, aunque sea de 2010 no creo que tengas muchos problemas ya que es un codigo "bastante" general...
Se trata de que entiendas el concepto y lo sepas pasar a codigo, no de que copies y peges sin mas!
Un saludete!
 
Compañero estoy con los tutoriales de jocyf...mientras espero tu creacion...de momento todo son problemas ya que como te dije ha cambiado todo en unity 5 y todo peta por mucho que lo entienda hay syntaxis cambiadas las cuales desconoxco y que me llevan de cabeza...  , animate y dejame almenos el dichoso script que me dispare balas con ray..se gasten , tenga que recargar y cojer balas de por ai con eso me conformo almenos aprendere sobre el script que me agas actualizado y a partir de hay hasta que me lo sepa de memoria.Por favor.
 
Espero noticias gracias

Etiquetas: