Noticias

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

problema con pasos 3º persona (suenan varios a la vez)

Iniciado por Abramelin, Diciembre 17, 2015, 03:20:43 PM

Tema anterior - Siguiente tema
Hace poco segui un tutorial para añadirle eventos de audio a las animaciones en cada paso, me quedo asi:el problema es que me duplica los audios de los pasos, no deja espacio entre unos y otros aun cambiando el delay, y los pone unos sobre otros (como si andaran varias personas a la vez). Los tags de "mojado" tampoco los respeta, en el script de 1ª persona esta puesto de forma similar y si que los respeta... bueno dejo el codigo de los pasos en 3ª persona a ver que veis mal:
using UnityEngine;
using System.Collections;

public class audiofoot3thirdc : MonoBehaviour {


public AudioClip[] concreteSoundStep;
public AudioClip[] woodSoundStep;
public AudioClip[] metalSoundStep;
public AudioClip[] mojadoSoundStep;
public AudioClip[] terrainSoundStep;

public float normalSpeed;
public float sprintSpeed;
public float delayBetweenStep;
private float nextPlay;
private float delay;
private AudioClip step;
public AudioClip[] Footsteper;



void Start () {
   delay = delayBetweenStep;
}

void PlayFootsteper()
{
   nextPlay = Time.time + delayBetweenStep;
   switch (GetComponent<Collider>().tag)
   {
   case "concrete":
      step = concreteSoundStep[Random.Range(0, 4)];
      break;
   case "wood":
      step = woodSoundStep[Random.Range(0, 4)];
      break;
   case "metal":
      step = metalSoundStep[Random.Range(0, 4)];
      break;
   case "mojado":
      step = mojadoSoundStep[Random.Range(0, 7)];
      break;
   default:
      step = terrainSoundStep[Random.Range(0, 7)];
      break;
   }
   GetComponent<AudioSource>().clip = step;
   GetComponent<AudioSource>().Play();

   delayBetweenStep = delay;
   return;
   }
}
 


Diciembre 17, 2015, 04:04:32 PM #2 Ultima modificación: Diciembre 17, 2015, 04:06:25 PM por Abramelin
Pues me sigue pasando, he puesto eso y me ha corregido a:GetComponent<AudioSource>().PlayOneShot(step); //si entre parentesis (step) no pongo nada me tira error y dice que falta el argumentpero sigo teniendo el mismo problema, quias sea de otra cosa no se.

Diciembre 17, 2015, 08:20:10 PM #3 Ultima modificación: Diciembre 17, 2015, 08:20:30 PM por Antonio
Sí, es algo que me ha surgido al actualizar a Unity 5, parece que es un asunto de las transiciones que provoca que el evento se ejecute varias veces, (llamando a la función cada vez) Bueno, yo lo solucioné tomando el AnimationEvent (es el propio evento que ejecuta la función) y poniéndole una condicional para que compruebe si la animación de ese evento, tiene un peso mayor de la mitad. 

El peso de las animaciones normalmente es 1, pero cuando llega la transición entre animaciones, pues ese va decrementando y la animación siguiente va ganando peso hasta que llega al máximo, (así se van como fusionando). Si la animación actual tiene un peso superior a 0.5, podríamos decir que es la animación predominante, así que quiero que se ejecuten los eventos de esa. Ahora, si la animación tiene un peso inferior a 0.5, es porque hay otra animación que está predominando, prefiero que se ejecuten los eventos de esa otra animación. (O al menos para el asunto de las pisadas).

Imagina que el enemigo va dudando entre si correr o andar, las 2 animaciones tienen funciones de pisadas pero a distinto tiempo, con este método pues controlo un poco, si corriendo es la animación con más fuerza, tomará los eventos de esa, si por el contrario es la de andando, pues que suenen los eventos de andando.
No sé cómo será tu código pero a lo mejor este trozo te sirve de guía.
    void SonidoPasos (AnimationEvent evt)
    {
        if (evt.animatorClipInfo.weight > 0.5f)
        {
            AudioClip SonidoStep = null;
            
            if (InWater)
            {
                if ((gameObject.GetComponent <Player_Water>()) && (SonidoPisadasAgua.Length > 0))
                {
                    int numeroaleatorio;
                    if(gameObject.GetComponent <Player_Water>().DistSurface < 0.55f)
                    {
                        numeroaleatorio = Random.Range(0,4);
                        SonidoStep = SonidoPisadasAgua[numeroaleatorio];
                    }else{
                        numeroaleatorio = Random.Range(4,SonidoPisadas.Length);
                        SonidoStep = SonidoPisadasAgua[numeroaleatorio];
                    }
                }
            }else{            
                if (SonidoPisadas.Length > 0)
                {
                    int numeroaleatorio = Random.Range(0,SonidoPisadas.Length);
                    SonidoStep = SonidoPisadas[numeroaleatorio];
                }
            }
            
            if (SonidoStep != null)
                SonidoFeet (SonidoStep);
        }
    }




 

[quote author=Abramelin" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34721" data-ipsquote-contentcommentid="125155"> el problema es que me duplica los audios de los pasos,[/quote]Utiliza audiosource.isPlaying para evitar que se duplique un mismo audio: http://docs.unity3d.com/ScriptReference/AudioSource-isPlaying.html" rel="external nofollow date=1450362043]http://docs.unity3d.com/ScriptReference/AudioSource-isPlaying.html 

Adngel muchas gracias ahora mismo lo pruebo a ver que tal, kaito gracias por el consejo lo tendré en cuenta.

Etiquetas: