我的项目是一个军事fps,我在动画方面遇到了一些问题。
我有3种不同的武器,每种武器都有1个动画控制器,每个武器都有一个"输入"并且"离开"动画。像CS,COD等......
我需要知道我什么时候离开"动画结束以禁用游戏对象,启用另一个并播放"输入"动画。
我试图这样做:http://answers.unity3d.com/questions/362629/how-can-i-check-if-an-animation-is-being-played-or.html但没有成功。
如果您需要更多细节,我会留下动画控制器,层次结构和脚本的打印件,只需要说。
1号武器的动画师控制器
所有过渡到" Sair" (留下动画)有一个触发器(AK47_sair)并转换到" Extit"州有一个触发器(" AK47_SairControlador")
在我的代码中,当我按下2(更改为武器编号2)时,我想进行过渡。
这是层次结构,我的脚本附加到" 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");
}
}
}
}
答案 0 :(得分:1)
在Unity 5中,你有一个新的东西,就是动画状态机行为:State Machine Behaviours
您可以使用它来指定动画控制器进入或离开特定状态时的行为。
例如,在这里,我的门有一个打开和关闭的状态,让我们说我想在门打开时发出声音。
在这里,我单击“打开”,然后单击“添加行为”并为测试设置一个随机名称(在我的情况下为“行为测试”)
然后我只需要实现函数 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([...])并处理武器更改。
为了更进一步,我不认为你应该直接在动画状态下处理武器更改,但也许你的脚本可能会发送一个游戏控制器抓住的事件,它将实际处理改变武器。