Noticias

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

Paso de objetos en Animator Behaviour

Iniciado por FNP, Diciembre 17, 2015, 01:42:37 PM

Tema anterior - Siguiente tema
Buenas, tengo un problema con el paso de objetos a un script del Animator, os cuento:Tengo un personaje, que está inactivo y en cierto momento, cuando se dan una sereie de condiciones este se activa, en su animator tengo una serie de animaciones a partir del punto de entrada que consisten en salir de un agujero, dar un paso hacia delante y mirar al jugador, hacer un amago de atacar y dar un rugido, dar un paso hacia delante y mirar al jugador y esperar en posición idle hasta que haga lo que le toque hacer.Las animaciones de andar un paso hacia delante y hacer el amago de atacar y dar un rugido tiene un comportamiento que controlo por script. En el caso de dar un paso hacia delante, le paso el gameobject del jugador y del propio bicho, en el bicho hago un SimpleMove para que avance mientra da el paso y que mire hacia el jugador con un LookAt, esto funciona perfectamente.El problema lo tengo con el comportamiento del rugido, simplemente quiero que emita un sonido, para eso en el script del comportamiento he creado un AudioSource como public para asignarselo en el editor y en el script simplemete hace un Play() del rugido. El problema es que no me deja asignar el AudioSource, sin embargo en el caso del paso hacia delante, le puedo asignar el jugador y el propio bicho sin problemas.No se porqué es esto ¿Acaso solo puedo utilizar GameObjects en los scripts del Animator? 

Enseñame el script y te digo que falla lo mismo as puesto algo mal.

Diciembre 17, 2015, 02:53:09 PM #2 Ultima modificación: Diciembre 17, 2015, 02:53:39 PM por FNP
Bueno, esto es de traca , he conseguido asignarle el AudioSource al script de la siguiente forma, creo un AudioSource en la escena, lo convierto en un PreFab suelto y asi lo puedo asignar, pero el problema es que al intentar reproducirlo me da un warning diciendo que no puede Reproducir un AudioSouce desactivado, evidentemente el AudioSource no está desactivado, he probado tanto a arrastrar el Prefab como a colocarlo en la escena, asi que justo delante le he puesto un enabled = true; pero le da exactamente igual. No entiendo nada.

Diciembre 17, 2015, 02:59:15 PM #3 Ultima modificación: Diciembre 17, 2015, 03:02:15 PM por brok
As puesto esta linea si la tienes quitala.Audio = Getcomponet<AudioSource>();

No, en principio tengo el AudioSource como público y lo asigno desde el editor, tambien lo he hecho pasando el GameObject del bicho y buscando los componentes de Audio, que tiene cuatro, pero me da como resultado cero. Ahora mismo está de la forma mas simple que puede estar:using UnityEngine;
using System.Collections;public class RoarBoss : StateMachineBehaviour {    public AudioSource roarSound;    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
        roarSound.enabled = true;
        roarSound.Play ();
    }

¿El AudioSource lo tienes asignado al objeto en si? porque si lo asignas al objeto en si te puncionara con Getcomponet. El script lo veo bien.

No, ahora mismo el objeto se lo paso al script arrastrando el prefab, es necesario hacerlo así porque Unity no deja arrastrarlo ni seleccionarlo para pasarlo al script desde el objeto padre,  al estar asignado con el editor desde el Prefab el  hacer un GetComponent seria redundante ¿no? aunque en el objeto tambien lo tengo, el problema es que no consigo hacer un GetComponent tampoco.Lo he hecho docenas de veces, la única diferencia es que esta es la primera vez que lo estoy haciendo en un Behaviour de un estado del Animator.Normalmente lo que suelo hacer es tener el objeto primario, por ejemplo un enemigo y dentro de el, distintos AudioSources con sus correspondientes clips y según me interese reproducir el sonido que me convenga en función de la situación, al morir, al atacar, etc. y en el script donde programo una de esas acciones, declaro el AudioSource como public y lo asigno desde el editor, pero eso no es posible cuando el script es un Animator State Behaviour, o al menos yo no he sabido como hacerlo, porque desde luego ni se puede arrastrar ni seleccionar desde el editor. 

Otra cosa, este es un script de otro estado de la animación, lo que hace es que cuando se produce la animacion "walk", el bicho (Boss) avancia hacia adelante:public class MoveBossAtStartup : StateMachineBehaviour {    public GameObject player;
    public GameObject boss;
    public float speed = 3.0f;
    public bool endOfWalk; // If the enemy cannot walk more at start up
    
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
        player = GameObject.Find ("Player");
        boss = GameObject.Find ("Boss");
    }
    
    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
        Transform bossTransform = boss.gameObject.transform;
        boss.GetComponent<CharacterController> ().SimpleMove (bossTransform.forward * speed);
    }
    
    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {        Vector3 lookAtPosition = player.transform.position;
        lookAtPosition.y = boss.transform.position.y;
        
        boss.transform.LookAt (lookAtPosition);            if (endOfWalk) // if the enemy cannot walk anymore at start up
            GameManager.SetBossSpawnedStatus (false); // The enemy can play normally    }Aqui lo que hago basicamente es que al script le paso el jugador y el propio enemigo, aunque en el OnStateEnter los busco, que es innecesario porque ya los tiene asignados por editor y lo que hace es que mientras se produce la animacion de andar el bicho se va moviendo hacia delante y cuando esta termina se queda mirando al jugadorpara que a partir de ahi, el juego tome control y empiece el combate.Esto funciona correctamente, en el otro caso, el del audio es de otra animacion que se produce antes de esta, el bicho se pone chulo y ruge para asustar al jugador, ahí tambien puedo tener a mi disposicion el propio bicho, bien haciendo un Find o recibiendolo desde el editor. Como ahí lo que necesito no es el bicho, como en este caso sino su AudioSource, inicialmente pensé en hacerlo igual, recibiendo el bicho y buscando su AudioSource, pero las funciones Find no me valen y el GetComponent lo tengo que usar mediante un array (tengo tres o cuatro sonidos), de esta forma:public class RoarBoss : StateMachineBehaviour {    public AudioSource[] roarSounds;
    public GameObject boss;
    AudioSource roar;     // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {        boss = GameObject.Find ("Boss");        roarSounds = boss.GetComponents<AudioSource> ();
        for (int i=0; i< roarSounds.Length; i++) {
            roar = roarSounds ;
            if(roar.tag == "rugido"){
                roar.Play();
            }
        }
    }Pero no hace absolutamente nada, ni siquiera entra dentro del bucle, lo he testeado, lo que quiere decir que no encuentra ningún AudioSource dentro del objeto, cosa que tampòco entiendo. 

Diciembre 19, 2015, 12:50:05 PM #8 Ultima modificación: Diciembre 19, 2015, 12:53:15 PM por brok
Por que en vez de AudioSource utilizas AudioClip de esa manera puedes arrastrar el sonido directamente Assets solo tienes que poner un AudioSorce en tu enemigo y podras poner todos los clip que quieras.Hay tienes un ejemplo.
public AudioClip audio1;
public AudioClip audio2;
public AudioClip audio3;
AudioSource Audio;

void ejemplo ()
{
   if(ejemplo1)
   {
   Audio.clip = Audio1;
   Audio.Play();
   }
    if(ejemplo2)
   {
   Audio.clip = Audio2;
   Audio.Play();
   }
    if(ejemplo3)
   {
   Audio.clip = Audio3;
   Audio.Play();
   }
}
 

Bueno, pues curiosamente como tu dices si funciona. Lo he hecho asi: public class RoarBoss : StateMachineBehaviour {    public AudioClip roarSoundClip;
    public GameObject boss;
    AudioSource roar;     // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
        boss = GameObject.Find ("Boss");
        roar = boss.GetComponent<AudioSource> ();
        roar.clip = roarSoundClip;
        roar.Play ();
    }
}
Le asigno el prefab del AudioClip desde el editor, lo cojo en el script y se lo pongo al AudioSource del modelo, no entiendo porqué lo puedo hacer con el clip, pero sin embargo con el AudioSource no funciona.La verdad es que me putea y no me parece lo mas elegante, por una parte, prefería tener los AudioSources con sus clips cargados en vez de un único AudioSource y cada vez que quiero un sonido cargar el clip, rendiría mejor pues ya tienes los clips cargados y no hay que cargarlos cada vez y es mucho mas simple hacer un Play del AudioSource que andar haciendo un GetComponent, asignando el clip y luego haciendo un Play, lo otro me perece mas cómodo y elegante, pero bueno, que le vamos a hacer, por lo que estoy viendo, trabajar con Unity es encontrarse con cantidad de estas puñetitas incomprensibles.Muchísimas gracias por la ayuda, al final seré un experto en Unity o un asiduo cliente del frenopático  

De nada FNP me alegro que te haya servido

Etiquetas: