2016-01-16 2 views
1

Мой проект - военный fps, и у меня проблемы с анимацией.Управлять анимацией и исполнять скрипт при завершении анимации

У меня есть 3 разных оружия, 1 контроллер аниматора для каждого из них, и каждое оружие имеет анимацию «войти» и «уйти». Как CS, COD и т. Д.

Мне нужно знать, когда заканчивается анимация «оставить», чтобы отключить игровой объект, включить другой и воспроизвести анимацию «ввести».

Я попытался сделать это: http://answers.unity3d.com/questions/362629/how-can-i-check-if-an-animation-is-being-played-or.html, но без успеха.

Я оставлю здесь распечатку контроллера аниматора, иерархии и сценария, если вам нужно больше деталей, просто нужно сказать.

enter image description here

Аниматор контроллер количества оружия 1

Все переходы с «Саир» (оставить анимацию) есть триггер (AK47_sair) и переход к «Extit» состояния имеют триггер ("AK47_SairControlador ")

В моем коде, когда я нажимаю 2 (изменение на номер оружия 2), я хочу сделать переход.

enter image description here

Это иерархия, мой сценарий прилагается к "Jogador".

С моим фактическим кодом он отключает игровой объект AK47, когда анимация отпуска все еще играет.

using UnityEngine; 
using System.Collections; 

public class FirstPerson : MonoBehaviour { 

    public float speed; 
    public float normalSpeed = 5.0f; 
    public float slowSpeed = 2.5f; 
    public float crchSpeed = 2.5f; 

    private Transform tr; 
    private float dist; // distance to ground 


    public float mouseSensitivity = 5.0f; 
    public float verticalRotation = 0.0f; 
    public float updownRange = 60.0f; 
    private float verticalSpeed = 0.0f; 
    public float jumpSpeed = 5.0f; 

    CharacterController player; 

    private GameObject AK47; 
    private GameObject Faca; 

    public float shootingRate = 0.15f; 
    public float shootCooldown; 

    private bool agachado = false; 
    public float camOriginalPositionY; 
    public float camCrouchPositionY; 

    private Animator controladorAnimacaoAK; 
    private Animator controladorAnimacaoFaca; 


    public CapsuleCollider playerCollider; 
    public Camera CameraPrincipal; 

    public int ArmaSelecionada; 
    public int UltimaArma; 



    void Start() { 
     player = GetComponent<CharacterController>(); 
     shootCooldown = 0; 
     controladorAnimacaoAK = player.GetComponentInChildren<Animator>(); 
     playerCollider = gameObject.GetComponent<CapsuleCollider>(); 
     CameraPrincipal = Camera.main; 
     ArmaSelecionada = 1; 
     AK47 = CameraPrincipal.transform.FindChild ("ak47_final_animado").gameObject; 
    } 



    void Update() { 

     if (Input.GetKeyDown (KeyCode.Alpha2) || Input.GetKeyDown(KeyCode.Keypad2)) { 
      UltimaArma = ArmaSelecionada; 
      ArmaSelecionada = 2; 

      if(UltimaArma == 1) { 
       controladorAnimacaoAK.SetTrigger("AK47_Sair"); 
    controladorAnimacaoAK.SetTrigger("AK47_SairControlador"); 
       AK47.SetActive (false); 


      } 

     } 

     if (Input.GetKeyDown (KeyCode.Alpha1)) { 
      UltimaArma = ArmaSelecionada; 
      ArmaSelecionada = 1; 
     // controladorAnimacaoAK.SetTrigger ("AK47_Entrar"); 
     } 

     if (ArmaSelecionada == 1) { 
      // diz ao controlador da anim se o player esta a movimentar-se ou nao 
      controladorAnimacaoAK.SetFloat ("AK47_Deslocacao", player.velocity.magnitude); 
      //Debug.Log (player.velocity.magnitude); 

      // dispatar tiros 
      PlayerShoot PlayerShootScript = player.GetComponent<PlayerShoot>(); 

      if (shootCooldown > 0) { 
       shootCooldown -= Time.deltaTime; 
      } 


      if (Input.GetButton ("Fire1")) { 
       if (shootCooldown <= 0) { 
        shootCooldown = shootingRate; 
        PlayerShootScript.FireShoot(); 
        // animaçao 
        controladorAnimacaoAK.SetBool ("AK47_Disparar", true); 
       } 
      } else { 

       // animaçao 
       controladorAnimacaoAK.SetBool ("AK47_Disparar", false); 
      } 

      if (Input.GetKeyDown (KeyCode.R)) { 
       controladorAnimacaoAK.SetTrigger ("AK47_rec"); 
      } 
     } 
    } 
} 

ответ

1

В Unity 5 вы получили эту новую вещь, которая Animation State Machine Поведение: State Machine Behaviours

Вы можете использовать его, чтобы определить поведение при анимации контроллер входит или оставить определенные состояния.

Для примера здесь у меня есть дверь с открытым и закрытым состоянием, и, допустим, я хочу играть звук, когда открывается дверь.

Opening animation

Здесь я нажал Открытие, затем добавить поведение и установить случайное имя для теста (Behavior испытания в моем случае)

Тогда мне просто нужно реализовать функцию недействительного OnStateEnter (аниматор аниматор , AnimatorStateInfo stateInfo, int layerIndex) для воспроизведения звука в первом кадре анимации.

[SerializeField] 
AudioClip open_sound; 

override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) 
{ 
    animator.GetComponent<AudioSource>().clip = open_sound; 
    animator.GetComponent<AudioSource>().Play(); 
} 

В вашем случае, вы хотели бы реализовать поведение в состоянии Disparar который реализует функцию OnStateExit ([...]) и обрабатывать изменения оружия.

Чтобы поступить немного дальше, я не думаю, что вы должны должен обрабатывать изменение оружия непосредственно в состоянии анимации, но, возможно, ваш скрипт может отправить событие, улавливаемое игровым контроллером, которое фактически будет обрабатывать смену оружия.

+0

Спасибо, с некоторыми настройками, это решило мою проблему! –

Смежные вопросы