[Unity] Animation 재생 시간 구하기

2019. 6. 11. 12:09개발 달리기/Unity 개발달리기

안녕하세요. 달빠입니다.



오늘은 유니티에서 Animation 의 개별 시간을 가져오는 알고리즘을 공유하려합니다.






케릭터의 애니메이션들이 다양하게 있을수 있는데 해당 애니메이션의 애니메이션 시간을 가져와서 다양하게 활용할 수 


있도록 제공하는 알고리즘입니다.



// 사용할 케릭터 애니메이션 enum 값 추가 - 다양하게 입맛에 맞게 조절하시면 됩니다.

public enum eCharacterState

 {

        idle,

        walk,

        attack,

        hit,

        die,

        celebration,

        ZZattack1,

        ZZattack2,

        ZZattack3,

        faint,

        scream,

 }



// 에니메이션 Duration 값 얻기

    public float MoveDuration(eCharacterState move)

    {

        string name = string.Empty;

        switch (move)

        {

            case eCharacterState.idle:

                name = "idle01";

                break;

            case eCharacterState.walk:

                name = "walk01";

                break;

            case eCharacterState.attack:

                name = "attack01";

                break;

            case eCharacterState.hit:

                name = "hit01";

                break;

            case eCharacterState.die:

                name = "die01";

                break;

            case eCharacterState.celebration:

                name = "celebration";

                break; ;

            case eCharacterState.ZZattack1:

                name = "att01";

                break;

            case eCharacterState.ZZattack2:

                name = "att02";

                break;

            case eCharacterState.ZZattack3:

                name = "att03";

                break;

            case eCharacterState.faint:

                name = "faint01";

                break;

            case eCharacterState.scream:

                name = "scream01";

                break;


            default:

                return 0;

        }


        float time = 0;

        RuntimeAnimatorController ac = Anim.runtimeAnimatorController;


        for (int i = 0; i < ac.animationClips.Length; i++)

            if (ac.animationClips[i].name == name)

                time = ac.animationClips[i].length;


        return time;

    }





사용방법


예 ) 케릭터의 어택 애니메이션만큼의 딜레이 시간이 필요할때 유용하게 사용 할 수 있습니다. 

      어택시간이 끝난후에 이펙트가 터지게 한다는 등의 코드를 활용할때 좋습니다.


 float delayTime = MoveDuration(omDefenceMonster.eCharacterState.attack);

 // 어택 모션 실행 -> 해당 애니메이션 시간 가져와서 끝나는 시점에 이펙트 발생

 Anim.SetTrigger("attack");


 //어택파티클실행

 AttactParticlePlay(delayTime, m_ParticleAttack);




  //케릭터 어택 이펙트

    public void AttactParticlePlay(float waitTime, GameObject attackParticle)

    {

        if (m_ParticleCoroutine != null)

        {

            StopCoroutine(m_ParticleCoroutine);

            m_ParticleCoroutine = null;

        }

        m_ParticleCoroutine = StartCoroutine(WaitEffect(waitTime, attackParticle));

    }

    //케릭터 애니메이션 대기 시간 적용

    IEnumerator WaitEffect(float waitTime, GameObject particle)

    {

        yield return new WaitForSeconds(waitTime);


        if (particle != null)

        {

            particle.GetComponent<ParticleSystem>().Play();

        }

    }



더 자세한 내용을 알고 싶다면 클릭!






미약하게나마 유용한 정보가 되었다면 구독 공감 버튼은 작성자에게 큰 힘이 됩니다. 감사합니다 ^^