Noticias

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

realizar las siguientes acciones sin que se pisen unas a otras

Iniciado por Abramelin, Mayo 10, 2016, 08:39:20 PM

Tema anterior - Siguiente tema
estoy haciendo un gra***no en el que necesito hacer un cambio entre 5 discos, el cambio sería entre el disco que esta puesto (disco1, disco2... disco5) y el icono del inventario que indica el disco que has cogido (ico1, ico2... ico5). Al hacer el cambio mediante el boton "Jump" se pisan unas activaciones con otras, me he dado cuenta al cambiar el orden. ¿como podría hacer esto de forma correcta?

if (Input.GetButtonUp("Jump")){
if (disco1.activeSelf == true){
if (ico2.activeSelf == true){
disco2.SetActive (true);
ico1.SetActive (true);
ico2.SetActive (false);
disco1.SetActive (false);
}

if (ico3.activeSelf == true){
disco3.SetActive (true);
ico1.SetActive (true);
ico3.SetActive (false);
disco1.SetActive (false);
}
if (ico4.activeSelf == true){
disco4.SetActive (true);
ico1.SetActive (true);
ico4.SetActive (false);
disco1.SetActive (false);
}
if (ico5.activeSelf == true){
disco5.SetActive (true);
ico1.SetActive (true);
ico5.SetActive (false);
disco1.SetActive (false);
}
}
if (disco2.activeSelf == true){
if (ico1.activeSelf == true){
disco2.SetActive (true);
ico2.SetActive (true);
ico1.SetActive (false);
disco2.SetActive (false);
}
if (ico3.activeSelf == true){
disco3.SetActive (true);
ico2.SetActive (true);
ico3.SetActive (false);
disco2.SetActive (false);
}
// asi hasta disco5

hay algo llamado funciones que ayudaria con esas aberraciones...el problema no parece estar en el codigo sino en lo visual, algun pantallaso?

ya supongo que sera mas facil, pero voy tirando con el if y el else... el dilema es com hacer el cambio entre el icono+disco a poner y el disco puesto+su icono, aparentemente es contradictorio, ya que en el momento que se activa en el primer chequeo el disco2 se supone que no hace las acciones consecutivas del disco1 ya que pasaría directamente al disco2? adjunto las imagenes y el codigo completo:
var disco1 : GameObject;
var disco2 : GameObject;
var disco3 : GameObject;
var disco4 : GameObject;
var disco5 : GameObject;

var ico1 : GameObject;
var ico2 : GameObject;
var ico3 : GameObject;
var ico4 : GameObject;
var ico5 : GameObject;

var discospuestos : GameObject;

var texto : GameObject;

function Update () {

if(Input.GetButtonUp("accion")){
musicafondo.SetActive (false);
if (disco1.activeSelf == true){
discospuestos.GetComponent.<AudioSource>().Stop();
discospuestos.GetComponent.<AudioSource>().PlayOneShot(musica1);
}
if (disco2.activeSelf == true){
discospuestos.GetComponent.<AudioSource>().Stop();
discospuestos.GetComponent.<AudioSource>().PlayOneShot(musica2);
}

if (disco3.activeSelf == true){
discospuestos.GetComponent.<AudioSource>().Stop();
discospuestos.GetComponent.<AudioSource>().PlayOneShot(musica3);
}

if (disco4.activeSelf == true){
discospuestos.GetComponent.<AudioSource>().Stop();
discospuestos.GetComponent.<AudioSource>().PlayOneShot(musica4);
}

if (disco5.activeSelf == true){
discospuestos.GetComponent.<AudioSource>().Stop();
discospuestos.GetComponent.<AudioSource>().PlayOneShot(musica5);
}
}

if(Input.GetButtonUp("Jump")){
discospuestos.GetComponent.<AudioSource>().Stop();
if (disco1.activeSelf == true){
if (ico2.activeSelf == true){
disco2.SetActive (true);
ico1.SetActive (true);
ico2.SetActive (false);
disco1.SetActive (false);
}

if (ico3.activeSelf == true){
disco3.SetActive (true);
ico1.SetActive (true);
ico3.SetActive (false);
disco1.SetActive (false);
}
if (ico4.activeSelf == true){
disco4.SetActive (true);
ico1.SetActive (true);
ico4.SetActive (false);
disco1.SetActive (false);
}
if (ico5.activeSelf == true){
disco5.SetActive (true);
ico1.SetActive (true);
ico5.SetActive (false);
disco1.SetActive (false);
}
}
if (disco2.activeSelf == true){
if (ico1.activeSelf == true){
disco2.SetActive (true);
ico2.SetActive (true);
ico1.SetActive (false);
disco2.SetActive (false);
}
if (ico3.activeSelf == true){
disco3.SetActive (true);
ico2.SetActive (true);
ico3.SetActive (false);
disco2.SetActive (false);
}
if (ico4.activeSelf == true){
disco4.SetActive (true);
ico2.SetActive (true);
ico4.SetActive (false);
disco2.SetActive (false);
}
if (ico5.activeSelf == true){
disco5.SetActive (true);
ico2.SetActive (true);
ico5.SetActive (false);
disco2.SetActive (false);
}
}
if (disco3.activeSelf == true){
if (ico2.activeSelf == true){
disco2.SetActive (true);
ico3.SetActive (true);
ico2.SetActive (false);
disco3.SetActive (false);
}
if (ico1.activeSelf == true){
disco1.SetActive (true);
ico3.SetActive (true);
ico1.SetActive (false);
disco3.SetActive (false);
}
if (ico4.activeSelf == true){
disco4.SetActive (true);
ico3.SetActive (true);
ico4.SetActive (false);
disco3.SetActive (false);
}
if (ico5.activeSelf == true){
disco5.SetActive (true);
ico3.SetActive (true);
ico5.SetActive (false);
disco3.SetActive (false);
}
}   
if (disco4.activeSelf == true){
if (ico2.activeSelf == true){
disco2.SetActive (true);
ico4.SetActive (true);
ico2.SetActive (false);
disco4.SetActive (false);
}
if (ico1.activeSelf == true){
disco1.SetActive (true);
ico4.SetActive (true);
ico1.SetActive (false);
disco4.SetActive (false);
}
if (ico3.activeSelf == true){
disco3.SetActive (true);
ico4.SetActive (true);
ico3.SetActive (false);
disco4.SetActive (false);
}
if (ico5.activeSelf == true){
disco5.SetActive (true);
ico4.SetActive (true);
ico5.SetActive (false);
disco4.SetActive (false);
}
}
if (disco5.activeSelf == true){
if (ico2.activeSelf == true){
disco2.SetActive (true);
ico5.SetActive (true);
ico2.SetActive (false);
disco5.SetActive (false);
}
if (ico1.activeSelf == true){
disco1.SetActive (true);
ico5.SetActive (true);
ico1.SetActive (false);
disco5.SetActive (false);
}
if (ico4.activeSelf == true){
disco4.SetActive (true);
ico5.SetActive (true);
ico4.SetActive (false);
disco5.SetActive (false);
}
if (ico3.activeSelf == true){
disco3.SetActive (true);
ico5.SetActive (true);
ico3.SetActive (false);
disco5.SetActive (false);
}
}
}
}


 



El dilema parece: quiero aprender a programar o quiero mi gramófono.Está bien que quieras hacerlo pero recuerda que este foro es para aprender también. Aquí hay programadores que llevan muchos años y ofrecen su tiempo para enseñar a alguien que empieza. De verdad que muchos de nosotros ya hemos pasado por lo mismo hace mucho tiempo. Cuesta lo mismo hacerlo bien que hacerlo mal.Escúchalos.

los arrays me vienen grandes, si lo dices por eso, intento hacer lo que puedo con lo que tengo mas o menos aprendido... en realidad programar me viene grande. Presto atencion a los consejos pero no soy precisamente un lumbreras... si no adopto una forma de trabajar no es porque pase, es porque me cuesta entender algo que para vosotros es facil.

Yo no entendí lo que quieres hacer, no estoy seguro pero si te explcias mejor igual con 4 lineas tienes una función que te lo resuelve, y te explicamos cada paso.

cambiar el disco que esta puesto en el gra***no (disco1) por el que hay en el inventario (ico2). son 5 discos en total, se cogen de una estanteria pero solo puedes llevar uno a la vez, por lo que el cambio seria unicamente entre el disco que esta sonando y el unico disco del inventario, que como he dicho antes puede ser cualquiera de los 5 discos. Todo lo demas no hay problema, solo al cambiar entre el disco del gra***no y el del inventario. Pongo de ejemplo solo esta parte: 
if(Input.GetButtonUp("Jump")){

if (disco1.activeSelf == true){ //si el disco que esta en el gra***no es el disco1
if (ico2.activeSelf == true){  //si el icono del inventario indica que tienes el disco2
disco2.SetActive (true);  //aqui creo que esta el primer problema, creo que salta al if del disco2 y no hace las siguientes acciones
ico1.SetActive (true);  //mismo problema que en la linea de arriba?
ico2.SetActive (false);  
disco1.SetActive (false);

[quote author=Abramelin" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35841" data-ipsquote-contentcommentid="130741 date=1462914188]los arrays me vienen grandes, si lo dices por eso, intento hacer lo que puedo con lo que tengo mas o menos aprendido... en realidad programar me viene grande. Presto atencion a los consejos pero no soy precisamente un lumbreras... si no adopto una forma de trabajar no es porque pase, es porque me cuesta entender algo que para vosotros es facil.[/quote]Si no pasa nada. Entre todos te ayudaremos!

Entonces el jugador no decide que disco va a sonar? o Sonará el disco que llevas en inventario elegido por tí?Podría el jugador intentar poner el disco que ya está sonando? antes de hacer nada hay que saber todas las opciones.

suena el que esta puesto en el gra***no, con la posibilidad de cambiarlo por el del inventario
... ya lo tengo medio corregido, la unica pega es que no se puede cambiar el disco mas de dos veces, para eso hay que salir y volver a entrar al gra***no... tampoco es problema, no creo que nadie se ponga a cambiar el vinilo como un loco.Aqui dejo un video, he puesto 2 luces a modo chivato (la izquierda es el disco del inventario, y la derecha el dico puesto en el gra***no) . Como se observa, a los 2 cambios no deja cambiar mas (deja de reproducir pero no cambia el disco), hay que salir y volver a entrar en el gra***no.
eature=oembed" allowfullscreen="true" frameborder="0" height="270" width="480">  

Buenas, primero que nada como te ha dicho iRobb, quizás deberías prestar más atención a como estás programando las cosas, por ejemplo en limpieza de código. No te hablo de ni arrays ni nada "raro", solamente reducir el código que tienes. 
 
Por ejemplo cuando tienes el disco 1 en ejecución, y cambias o otro, pones en cada if el ico1.SetActive (true);  ahí tienes un montón de "basura" en el código.  Pongo solo un trozo del código. 
 

if(Input.GetButtonUp("Jump")){
   discospuestos.GetComponent.<AudioSource>().Stop();
   if (disco1.activeSelf == true){
      if (ico2.activeSelf == true){
         disco2.SetActive (true);
         ico1.SetActive (true);
         ico2.SetActive (false);
         disco1.SetActive (false);
      }
      
      if (ico3.activeSelf == true){
         disco3.SetActive (true);
         ico1.SetActive (true);
         ico3.SetActive (false);
         disco1.SetActive (false);
      }
      if (ico4.activeSelf == true){
         disco4.SetActive (true);
         ico1.SetActive (true);
         ico4.SetActive (false);
         disco1.SetActive (false);
      }
      if (ico5.activeSelf == true){
         disco5.SetActive (true);
         ico1.SetActive (true);
         ico5.SetActive (false);
         disco1.SetActive (false);
      }
   }

 
Yo lo simplificaría así: 
 

if(Input.GetButtonUp("Jump")){
   discospuestos.GetComponent.<AudioSource>().Stop();
   if (disco1.activeSelf == true){
      ico1.SetActive (true); //aquí la simplificación, solo lo haces al inicio en todos los casos.
      disco1.SetActive (false); // queda más limpio y si tienes que cambiar algo, pues será en 1 sitio y no 5 (que te puedes olvidar de uno)         
      if (ico2.activeSelf == true){
         disco2.SetActive (true);
         ico2.SetActive (false);
      }
      
      if (ico3.activeSelf == true){
         disco3.SetActive (true);
         ico3.SetActive (false);
      }
      if (ico4.activeSelf == true){
         disco4.SetActive (true);
         ico4.SetActive (false);
      }
      if (ico5.activeSelf == true){
         disco5.SetActive (true);
         ico5.SetActive (false);
      }
   }

 
 
 
Por otro lado, personalmente hubiera usado la variable de discospuestos, con eso ya sabes que disco se está utilizando, y simplificarías aún más el código. Piensa que un código más simple y más corto es mucho más fácil de mantener dentro de unos meses irás a tocar esto y no sabrás que coj. querías hacer. 

Y esos if + set active en una función como parámetro ico y disco.

Etiquetas: