¾Ö´Ï¸ÞÀ̼ÇÀ» ½ºÅ©¸³Æ®·Î Á¦¾î ÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ °£´ÜÇÏ°Ô ¾Ë¾Æº¸ÀÚ.1. Animator ¼³Á¤Animator¸¦ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.Idle, Run, Jump 3°³ÀÇ ¾Ö´Ï¸ÞÀ̼ÇÀ» ¸¸µé¾ú´Ù. ¾Ö´Ï¸ÞÀÌ¼Ç »óÅ¿¡¼ ¿À¸¥ÂÊ ¸¶¿ì½º ¹öÆ°À» ´·¯ "Make Transition"À¸·Î Æ®·£Áö¼ÇÀ» ¸¸µç´Ù. ¾î¶² ¾Ö´Ï¸ÞÀÌ¼Ç »óÅ¿¡¼¶óµµ Idle ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î Àüȯ Çϱâ À§ÇØ "Any State" ---> "Idle" Æ®·£Áö¼ÇÀ» ¸¸µé¾ú´Ù. 2. ¾Ö´Ï¸ÞÀÌ¼Ç Æ®¸®°Å ¼³Á¤Idle, Run, Jump 3°³ÀÇ ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î ÀüȯÇϱâ À§ÇØ Æ®¸®°Å¸¦ 3°³ ¸¸µç´Ù.Æ®·£Áö¼ÇÀÇ Æ®¸®°Å¸¦ ¼³Á¤ÇÑ´Ù. Idle·Î ÇâÇÏ´Â Æ®·£Áö¼ÇÀº ToIdle Jump·Î ÇâÇÏ´Â Æ®·£Áö¼ÇÀº ToJump RunÀ¸·Î ÇâÇÏ´Â Æ®·£Áö¼ÇÀº ToRun Jump ---> Run Æ®·£Áö¼ÇÀ» ToRun Æ®¸®°Å·Î ¼³Á¤ÇÏ´Â ¿¹ÀÌ´Ù. 3. Start ÇÔ¼ö¿¡¼ Animator ¼³Á¤¾Ö´Ï¸ÞÀÌ¼Ç °ÔÀÓ¿ÀºêÁ§Æ®ÀÇ ÄÄÆ÷³ÍÆ®·Î AnimationController.cs ½ºÅ©¸³Æ®¸¦ Ãß°¡ÇÑ´Ù.Start ÇÔ¼ö¿¡¼ Animator º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù. Animator anim;
void Start () { anim = gameObject.GetComponent<Animator>(); } 4. Æ®¸®°Å·Î ¾Ö´Ï¸ÞÀÌ¼Ç ÀüȯUpdate ÇÔ¼ö¿¡¼ Å° ÀÔ·ÂÀ» °Ë»çÇÏ¿© Æ®¸®°Å¸¦ ¼³Á¤ÇÏ¸é ¾Ö´Ï¸ÞÀ̼ÇÀÌ ÀüȯµÈ´Ù. if (Input.GetKeyDown(KeyCode.I))
anim.SetTrigger("ToIdle"); else if (Input.GetKeyDown(KeyCode.UpArrow)) anim.SetTrigger("ToRun"); else if (Input.GetKeyDown(KeyCode.Space)) anim.SetTrigger("ToJump"); 5. ¾Ö´Ï¸ÞÀÌ¼Ç »óÅ üũ¾Ö´Ï¸ÞÀÌ¼Ç »óÅ´ AnimatorStateInfo·Î ¾Ë¼ö ÀÖ´Ù."Base Layer.Run" ¾Ö´Ï¸ÞÀ̼ÇÀ϶§ ¸ðµ¨ Å©±â¸¦ 2¹è·Î ÇÏ°í ÀÖ´Ù. AnimatorStateInfo.fullPathHash·Î Run ¾Ö´Ï¸ÞÀ̼ÇÀ» üũÇÑ´Ù. AnimatorStateInfo
state = GetComponent<Animator>().GetCurrentAnimatorStateInfo(0);
if (state.fullPathHash == Animator.StringToHash("Base Layer.Run")) transform.localScale = new Vector3(2f, 2f, 2f); else transform.localScale = new Vector3(1f, 1f, 1f); 6. ¾Ö´Ï¸ÞÀÌ¼Ç ¼Óµµ º¯°æ¿À¸¥ÂÊ È»ìǥ۸¦ ´©¸£°í ÀÖÀ¸¸é ¾Ö´Ï¸ÞÀ̼ÇÀÌ 3¹è »¡¶óÁø´Ù if (Input.GetKey(KeyCode.RightArrow))
anim.speed = 3; else anim.speed = 1; 7. ¾Ö´Ï¸ÞÀ̼ÇÀÌ ³¡³ª¸é ´Ù¸¥ ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î º¯°æÁ¡ÇÁ ¾Ö´Ï¸ÞÀÌ¼Ç ÁßÀ϶§ ¾Ö´Ï¸ÞÀÌ¼Ç ¾Æ´Ï¸é ¾Ö´Ï¸ÞÀÌ¼Ç Æ®¸®°Å¸¦ "ToIdle"·Î ¼³Á¤ÇÑ´Ù. void Update () {
if (Input.GetKeyDown(KeyCode.Space)) anim.SetTrigger("ToJump"); if (anim.GetCurrentAnimatorStateInfo(0).IsName("Base Layer.Jump")) { if (AnimatorIsPlaying() == false) anim.SetTrigger("ToIdle"); } } bool AnimatorIsPlaying() { return anim.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f; } 8. ÄÚ·çƾÀ¸·Î ¾Ö´Ï¸ÞÀ̼ÇÀÌ ³¡³ª¸é ´Ù¸¥ ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î º¯°æÄÚ·çƾÀ» ÀÌ¿ëÇØ ¾Ö´Ï¸ÞÀ̼ÇÀ» ÀüȯÇÑ´Ù.½ºÆäÀ̽ºÅ°¸¦ ´©¸£¸é Á¡ÇÁ¸¦ ÇÏ°í Idle »óÅÂÀÇ ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î ÀüȯµÈ´Ù. Á¡ÇÁ ¾Ö´Ï¸ÞÀ̼ǿ¡¼ Idle ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î ÀüȯµÇ±â Àü±îÁö Áߺ¹Çؼ ¾Ö´Ï¸ÞÀ̼ÇÀÌ ÀϾÁö ¾Êµµ·Ï ±¸Çö Çغ¸ÀÚ.
WaitForEndOfFrame ½ÇÇà½ÃÁ¡Àº LateUpdate() ÀÌÈÄÀÌ´Ù. void Update()
{ if (Input.GetKeyDown(KeyCode.Space)) { int fullPathHash = Animator.StringToHash("Base Layer.Jump"); if (anim.GetCurrentAnimatorStateInfo(0).fullPathHash != fullPathHash && anim.IsInTransition(0) == false) { anim.SetTrigger("ToJump"); StartCoroutine(this.WaitForAnimation(anim, fullPathHash)); } } } bool AnimatorIsPlaying() { return anim.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f; } IEnumerator WaitForAnimation(Animator animator, int fullPathHash) { while (animator.GetCurrentAnimatorStateInfo(0).fullPathHash != fullPathHash) yield return new WaitForEndOfFrame(); while (AnimatorIsPlaying() == true) yield return new WaitForEndOfFrame(); anim.SetTrigger("ToIdle"); while (animator.IsInTransition(0) == false) yield return new WaitForEndOfFrame(); } 9. ¾Ö´Ï¸ÞÀÌ¼Ç ¹Ù·Î ÀüȯÇϱâ¾Ö´Ï¸ÞÀÌ¼Ç Æ®¸®°Å "ToJump" ¸í·ÉÀ» ³»¸®¸é ¹Ù·Î "Jump"À¸·Î Àüȯ ¾ÈµÈ´Ù.Áï½Ã, "Jump" ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î Àüȯ ÇÒ·Á¸é "Has Exit Time" üũ¸¦ ÇØÁ¦ ÇÑ´Ù. ¼Ò½º: AnimationController.cs Âü°í) http://qiita.com/yando/items/601e6fd35002e77ae9c8 AnyState »ç¿ë http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&no=3041 ¾Ö´Ï¸ÞÀÌ¼Ç Á¾·á http://kukuta.tistory.com/181 WaitForEndOfFrame ¼³¸í http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&no=412 ¾Ö´Ï¸ÞÀÌ¼Ç ½ºÅ×ÀÌÆ® ¸Ó½Å https://docs.unity3d.com/kr/current/Manual/AnimationStateMachines.html |