버튼에 애니메이션을 실행(Play)시킬 때 발생하는 문제가 하나 있었다.


같은 버튼을 계속 누를 때 최초 1회만 애니메이션이 재생되고, 그 이후 두번 다시 Play되지 않은 문제였다.

 

그래서 틀렸을 때 흔들리는 애니메이션이 1번만 보여지고 그 이후는 무반응이므로 뭔가 어색하게 되었다.


오브젝트를 껐다가 켜야하나 생각도 해보고 구글을 찾아봤지만 한국어 검색으로는 비슷한 문제가 발견되지 않았다.


그래서 형편없는 영어 실력으로 영어 검색을 시작했다.


검색어 : unity animator play once reset


그결과 유니티 커뮤니티에서 어떤 한 외국인님이 나와 완전히 동일한 문제를 질문했고, 답을 얻을 수 있었다.


생각보다 별 것 아니었다. 몰라서 못 쓴 것이지만,,]


내가 사용했던 Play("AnimationName"); 에서 확장된...아니 오버로딩된



public void Play(string stateName, int layer = -1, float normalizedTime = float.NegativeInfinity);


을 사용하라고 한다.



아래 코드가 내가 사용한 기본적인 코드이다. 이렇게 하면 플레이는 된다.


buttonObject.GetComponent<Animator>().Play("ButtonWrong");


하지만,


buttonObject.GetComponent<Animator>().Play("ButtonWrong", -1, 0f);



첫 번째 매개변수 : stateName

두 번째 매개변수 : layer

세 번쨰 매개변수 :normalizedTime


첫 번쨰 매개변수로는 Play할 애니메이션 state의 이름을 적는다.


두 번째 매개변수로는 layer를 설정한다. -1일 경우 첫 state를 재생한다.


세 번째 매개변수로는 normalizedTime를 적는다.


normalizedTime란,


표준화된(normalized) 애니메이션 시간아다. 


값 1은 애니메이션의 끝을 의미하며 값 0.5는 애니메이션의 중간을 의미한다.


Posted by sungho88
,

애니메이션 클립은 애니메이션에서 가장 작은 단위로써, 걷기 / 뛰기/ 숨쉬기 등 동작 하나하나를 나타내는 단위이다.


이것은 Animation을 분할해놓았을 경우 Animation 컴포넌트를 추가하게 되면 기본적으로 목록이 있다.


Animations라는 속성이 있고, 그것을 눌러보면 배열로 이루어진것을 볼 수 있다(기본은 size 0)


이 Animation에 Animations 배열 항목을 빼보는 방법은 다음과 같다.


public GameObject character;
Animation anim = character.GetComponent<Animation>();
        
foreach (AnimationState state in anim)
{
Debug.Log(state.name);
}



이렇게 하면,  anim안에 AnimationState 형의 값을 모두 가져와 Debug.Log에 이름을 출력한다.


만약, 이 이름을 전부 저장해서 사용하고 싶다면, string 배열에 저장을 해야할 것이다.


왜냐하면, 애니메이션을 실행하는 문장은 


        anim.Play("Death");


와 같이 Play 함수 뒤에 string 형을 매개변수로 적어야 하기 때문이다.


foreach()문을 어떻게 for문으로 변경해야 하는지 많이 검색을 해봤고, 시도를 해봤다.


그렇지만 실패했고, foreach문에서 어떻게 반복되는 횟수 즉, index 값을 찾을까를 알아봤다.


그 결과, index를 외부에 변수로 선언하고, foreach()문 앞에 index++;으로 증가를 시키면 되는 간단한 것이었다.


따라서, string 배열 안에 애니메이션 클립의 이름을 넣는 코드는 다음과 같다.


        internal int index;        
foreach (AnimationState state in anim)
{
            animArray[index] = state.name;
Debug.Log(state.name);
            index++;
}


이렇게 하면 , foreach()에서 몇 번 째 요소인지 for문에서 i값으로 사용할 수 있다.


Posted by sungho88
,