Animation Simple Scripting

¾Ö´Ï¸ÞÀ̼ÇÀ» ½ºÅ©¸³Æ®·Î Á¦¾î ÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ °£´ÜÇÏ°Ô ¾Ë¾Æº¸ÀÚ.

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 ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î ÀüȯµÇ±â Àü±îÁö Áߺ¹Çؼ­ ¾Ö´Ï¸ÞÀ̼ÇÀÌ ÀϾÁö ¾Êµµ·Ï ±¸Çö Çغ¸ÀÚ.
  • Idle »óÅ¿¡¼­ ½ºÆäÀ̽ºÅ°¸¦ ÀÔ·ÂÇÏ¸é ¹Ù·Î ¾Ö´Ï¸ÞÀ̼ÇÀÌ Àüȯ¾ÈµÈ´Ù.
    ¾Ö´Ï¸ÞÀ̼ÇÀÌ Jump ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î ¹Ù²î¸é ´ÙÀ½À¸·Î ³Ñ¾î °£´Ù.
  • AnimatorIsPlaying( )ÀÌ false°¡ µÇ¸é ´ÙÀ½À¸·Î ³Ñ¾î°£´Ù.
  • SetTrigger("ToIdle") : SetTreiIdle ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î  ÀüȯÇÑ´Ù.
  • animator.IsInTransition(0) true°¡ µÇ¸é 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