2017-04-07 6 views
0

의 전환 내가 Unity3D에 새로운 오전 나는 다음 튜토리얼에서 일하는 :유니티 3D : 애니메이션

https://www.youtube.com/watch?v=gXpi1czz5NA

그것은 모두 괜찮 았는데.

스켈레톤이 칼로 뭔가를 때리는 기능을 추가하고 싶었는데, 그가 피해를 입은 것처럼 진짜 돌아올 것입니다. 자신의 검을 물건과 충돌시키는 그릇된 방법.

하지만 제대로 작동하지 않는 것으로 나타났습니다. 나는 무의미한 루프에 넣기 위해 히트를 일으키거나 히트를 모두 무시하는 선택을하는 것처럼 보인다. 여기

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class chase : MonoBehaviour { 

    public Transform player; 
    static Animator anim; 

    // Use this for initialization 
    void Start() { 
     anim = GetComponent<Animator>(); 
    } 

    // Update is called once per frame 
    void Update() { 
     //Debug.Log (anim.ToString()); 
     //Debug.Log ("Start Update"); 
     Vector3 direction = player.position - this.transform.position; 
     //Debug.Log ("Distance: " + direction.magnitude.ToString()); 
     float angle = Vector3.Angle (direction, this.transform.forward); 
     //Debug.Log ("Angle: " + angle.ToString()); 
     //Debug.Log(anim.GetCurrentAnimatorStateInfo(0).IsName("Damage")); 

     // Get top animation currently running 
     AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0); 

     if (Vector3.Distance (player.position, this.transform.position) < 10 && angle < 120 && !stateInfo.IsName ("Attack") && !anim.GetBool("Hit")) { 

      direction.y = 0; 
      this.transform.rotation = Quaternion.Slerp (this.transform.rotation, Quaternion.LookRotation (direction), 0.1f); 

      anim.SetBool ("isIdle", false); 
      if (direction.magnitude > 2) { 
       this.transform.Translate (0, 0, 0.03f); 
       anim.SetBool ("isWalking", true); 
       anim.SetBool ("isAttacking", false); 
       anim.SetBool ("Hit", false); 
      } else { 
       anim.SetBool ("isAttacking", true); 
       anim.SetBool ("isWalking", false); 
       anim.SetBool ("Hit", false); 
      } 
     } 
     else{ 
      anim.SetBool ("isIdle", true); 
      anim.SetBool ("isWalking", false); 
      anim.SetBool ("isAttacking", false); 
      anim.SetBool ("Hit", false); 
     } 
    } 
} 

그리고 칼 충돌 스크립트입니다 : "종료 시간이"그들은 모든 방법을 플레이 할 수 있도록 전환을 공격하고 손상을 애니메이션하기

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class SwordCollision : MonoBehaviour { 
    private Animator anim; 

    // We just collided with an object 
    private void OnTriggerEnter(Collider collider) { 
     int layer = collider.gameObject.layer; 
     anim = this.GetComponentInParent<Animator>(); 
     //Debug.Log (anim.ToString()); 
     if (layer != LayerMask.NameToLayer ("Floor") && layer != LayerMask.NameToLayer ("Monster")) { 
      Debug.Log ("Sword Hit something:" + collider.name.ToString()); 
      Debug.Log (LayerMask.LayerToName(layer)); 

      anim.SetBool ("isIdle", false); 
      anim.SetBool ("isWalking", false); 
      anim.SetBool ("isAttacking", false); 
      anim.SetBool ("Hit", true); // kicks off damage state 
     } 
    } 

} 

I 설치 여기 내 코드입니다 을 통하여. 다른 전환에는이 기능이 없어 '히트'가 발생하면 즉시 중단 될 수 있습니다.

검 충돌 스크립트가 히트를 등록하고 체이스 스크립트가 즉시이를 취소하므로 "히트"부울을 "true"(데미지 애니메이션을 시작하기 위해)로 설정하면 문제가 발생한 것으로 보입니다. 장소. (예 : anim.SetBool ("Hit", false);)

그러나 그 줄을 주석 처리하면 손상 애니메이션이 발생하지만 분명히 닫힐 것이 없기 때문에 분명히 루프에 걸리게됩니다. 떨어져.

공격 애니메이션이 거의 동일하게 설정 되었기 때문에 머리카락이 날아갔습니다. 그러나 애니메이션이 실제로 시작될 때까지 부울 "isAttacking"이 체이스 스크립트에서 계속 'true'로 설정되기 때문에 올바르게 작동하는 이유가 있다고 생각합니다. 데미지 애니메이션이 다른 스크립트에서 시작 되었기 때문에 체이스 스크립트가 "히트"에 대한 부울 값을 변경하도록 허용하기 전에 애니메이션이 시작되도록하는 쉬운 방법이 아닌 것 같습니다.

할 수있는 방법이 있습니까? 애니메이션이나 애니메이션 상태를 보장하는 지연 또는 무언가와 같습니다. 또는 부울 값을 변경하기 전에 '손상'애니메이션이 완료되었는지 확인하는 방법일까요?

답변

0

내가 마지막으로 생각해 낸 해결책은 다음과 같습니다. 제 생각에 해커. 나는 아직도 내가 최선의 방법으로 이것을하지 않는다고 느낀다.

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class chase : MonoBehaviour { 

    public Transform player; 
    static Animator anim; 

    // Use this for initialization 
    void Start() { 
     anim = GetComponent<Animator>(); 
    } 

    // Update is called once per frame 
    void Update() { 
     //Debug.Log (anim.ToString()); 
     //Debug.Log ("Start Update"); 
     Vector3 direction = player.position - this.transform.position; 
     //Debug.Log ("Distance: " + direction.magnitude.ToString()); 
     float angle = Vector3.Angle (direction, this.transform.forward); 
     //Debug.Log ("Angle: " + angle.ToString()); 
     //Debug.Log(anim.GetCurrentAnimatorStateInfo(0).IsName("Damage")); 

     // Get top animation currently running 
     AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0); 

     if (anim.GetBool("Hit") && !stateInfo.IsName ("Damage")) { 
      print ("keep going"); 
      anim.SetBool ("isIdle", false); 
      anim.SetBool ("isWalking", false); 
      anim.SetBool ("isAttacking", false); 
      anim.SetBool ("Hit", true); 
     } 
     else if (Vector3.Distance (player.position, this.transform.position) < 10 && angle < 120 && !stateInfo.IsName ("Attack") && !stateInfo.IsName ("Damage")) { 

      direction.y = 0; 
      this.transform.rotation = Quaternion.Slerp (this.transform.rotation, Quaternion.LookRotation (direction), 0.1f); 

      anim.SetBool ("isIdle", false); 
      if (direction.magnitude > 2) { 
       print ("Following"); 
       //this.transform.Translate (0, 0, 0.03f); 
       anim.SetBool ("isWalking", true); 
       anim.SetBool ("isAttacking", false); 
       anim.SetBool ("Hit", false); 
      } else { 
       print ("Attacking"); 
       anim.SetBool ("isAttacking", true); 
       anim.SetBool ("isWalking", false); 
       anim.SetBool ("Hit", false); 
      } 
     } 
     else { 
      print("Back to Idle"); 
      anim.SetBool ("isIdle", true); 
      anim.SetBool ("isWalking", false); 
      anim.SetBool ("isAttacking", false); 
      anim.SetBool ("Hit", false); 
     } 
    } 
}