动画结束时控制动画并执行脚本

时间:2016-01-16 01:28:09

标签: c# unity3d

我的项目是一个军事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号武器的动画师控制器

所有过渡到" Sair" (留下动画)有一个触发器(AK47_sair)并转换到" Extit"州有一个触发器(" AK47_SairControlador")

在我的代码中,当我按下2(更改为武器编号2)时,我想进行过渡。

enter image description here

这是层次结构,我的脚本附加到" Jogador"。

使用我的实际代码,当假动画仍在播放时,它会禁用AK47 gameobject。

    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 个答案:

答案 0 :(得分:1)

在Unity 5中,你有一个新的东西,就是动画状态机行为:State Machine Behaviours

您可以使用它来指定动画控制器进入或离开特定状态时的行为。

例如,在这里,我的门有一个打开和关闭的状态,让我们说我想在门打开时发出声音。

Opening animation

在这里,我单击“打开”,然后单击“添加行为”并为测试设置一个随机名称(在我的情况下为“行为测试”)

然后我只需要实现函数 void OnStateEnter(Animator animator,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([...])并处理武器更改。

为了更进一步,我不认为你应该直接在动画状态下处理武器更改,但也许你的脚本可能会发送一个游戏控制器抓住的事件,它将实际处理改变武器。