Noticias

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

Reproducir un audio aleatorio desde un array

Iniciado por PorcinoSenpai, Noviembre 14, 2016, 03:13:46 AM

Tema anterior - Siguiente tema
hola chicos, estoy iniciándome en esto de la programación y me estoy aproblemando mucho con una situación, he buscado en la documentación pero aún no logro comprender del todo como funcionan los arrays.
 
mi problema es que tengo una variable array donde meto cuatro audios (en este caso sonidos de pisadas) y lo que quiero es que se reproduzcan de forma aleatoria uno tras otro mientras el personaje se mueve.
 
para esto he pensado en dos soluciones: que se reproduzcan cuando el transform del personaje cambie o que se reproduzcan cuando el jugador presione una tecla (A o D, que son con las que el personaje se mueve). pero por más que lo intento siempre me tira error o derechamente no conozco las funciones que debo llamar para realizar las acciones.
 
aquí dejo mi rudimentario script:
 

public var Velocidad : float;
public var VelocidadCarrera : float;
public var Anim : Animation;
public var Linterna : GameObject;
public var Act : boolean = false;
public var SonidoPasos : AudioClip[];
function Start () {
    Anim = GetComponent.<Animation>();
    Linterna.SetActive(false);
    Act = false;
}
function FixedUpdate () {
    var translation : float = Time.deltaTime * Velocidad;
    var translationRun : float = Time.deltaTime * VelocidadCarrera;
    Anim.CrossFade("Armature|Respirar [Escopeta]");
    //Caminar y Correr izq
    if (Input.GetKey (KeyCode.A)) {
        transform.Translate (translation, , );
        Anim.CrossFade("Armature|Caminar [Escopeta]");
        if (Input.GetKey (KeyCode.LeftShift)){
            transform.Translate (translationRun, , );
        }
    }
    //caminar y correr der
    if (Input.GetKey (KeyCode.D)) {
        transform.Translate (-translation, , );
        Anim.CrossFade("Armature|Caminar [Escopeta]");
        if (Input.GetKey (KeyCode.LeftShift)){
            transform.Translate (-translationRun, , );
        }
    }
    //Linterna
    if (Input.GetKeyDown (KeyCode.F) && Act == false){
        Linterna.SetActive(true);
        Act = true;
    }
    else
    if (Input.GetKeyDown (KeyCode.F) && Act == true){
        Linterna.SetActive(false);
        Act = false;
    }
}

 
de antemano muchas gracias :)

Amigo, asi no se ejecutan los sonidos, (no los sonidos FX que se suponen que son activados mediante interruptores, acciones o eventos).
 
Tu lo que quieres es que cuando la animacion de andar o correr se este ejecutando tambien suene el sonido de las pisadas, eso se hacen en un Behaviour del MachineState.
 
https://docs.unity3d.com/ScriptReference/StateMachineBehaviour.html
 
Segun el estado de la animacion haces una cosa u otra. (Leete bien la documentacion y busca tutoriales)
 
Un Saludo.

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 




Hola , lo que yo hago es primero detectar que el jugador se este moviendo, segundo es mediante una variable time empezar a contar, cuando llegue a un cierto valor elegir un clip de un arreglo y reproducirlo.
 
En C# (perdon en java no se como es)
 

float time;
float intervalo;
AudioSource audioSource;
//
//
//
//
//
 
// En Update :
if(SeEstaMoviendo){
  time += Time.deltaTime;
  if(time > intervalo){
      ElegirClip();   //funcion que elige aleatoriamente un clip del arreglo
      audioSource.Play();
      time = 0;   //reset al time
  }
}else{
time = 0;
}
//
//
void ElegirClip()
{
//aca podes detertar con raycasting el tipo de superficie y determinar cual de los arrays seleccionas
//Por ejemplo podes tener arrays para concreto, madera, etc.   
audioSource.clip = array[ Random.Range (0, array.Length) ] //array es un arreglo de AudioClips
}

 
el primer valor del Random.RAnge es inclusivo pero el segundo es exclusivo, es decir que no puede tomar el valor "Length" y quedar fuera del arreglo
 
Esto lo haces para seleccionar el clip que vas a disparar, Solo usas solo un AudioSource, una vez que lo seleccionas aleatoriamente le das al audio source Play
 
 
 
Otra cosa, si estas trabajando con transforms y deteccion de entrada (Inputs) no tenes que usar FixedUpdate jamas, usa Update, FixedUpdate solo se emplea con los rigidbody para que las fisicas se comporten de manera adecuada ya que son steps fijos (por eso el Fixed)
 
 
 
Saludos
 
 
 
 

Cita de: lightbug date=1479155596 
   
   
      Otra cosa, si estas trabajando con transforms y deteccion de entrada (Inputs) no tenes que usar FixedUpdate jamas, usa Update, FixedUpdate solo se emplea con los rigidbody para que las fisicas se comporten de manera adecuada ya que son steps fijos (por eso el Fixed)
   
   
       
   
   
       
   
   
       
   


gracias, pero uso el FixedUpdate para que el player choque contra los objetos.

Cita de: PorcinoSenpai date=1479156030gracias, pero uso el FixedUpdate para que el player choque contra los objetos.
   


No entendi, tu player es un characterController o Un Rigidbody? que choque o no lo determina las fisicas de unity no el metodo que llamas. Te digo esto porque una vez hice un shooter, si clickeaba muy rapido los disparos salian de forma rara :) , el problema era el bendito FixedUpdate

es un rigidbody, como no estoy usando los assets de unity al incorporar un character controller, el player atraviesa las cosas

el charactercontroller es lo mejor para mover un personaje, basicamente funciona con los transform, antes usaba un rigidbody pero despues de años y años de problemas (minimos) reemplace como 200 lineas del rigidbody en 20 lineas del charactercontroller jaja.
 
En fin, el Ccontroller "funciona" solo si lo moves mediante el metodo "Move" o "Simple" (detesto el segundo), si lo moves con transform no funciona y atraviesa todo. Y si estas moviendo a tu personaje con rigidbody usa fuerzas AddForce o directamente cambiá el vector de velocity.


Etiquetas: