유니티 애니메이션 트리거 - yuniti aenimeisyeon teuligeo

유니티로 졸업프로젝트를 진행하면서 특정 조건에 따라 애니메이션을 바꿔줘야했는데 애니메이션을 바꾼 방법에 대해서 적어보려고 한다. 우선 애니메이션을 변경하기 위해 당연히 애니메이터가 필요하다.

Asset에서 마우스 우클릭으로 애니메이터 컨트롤러를 만들 수 있다. 프로젝트를 할 때 우리는 기존에 존재하는 에셋을 샀기 때문에 필요한 애니메이션만 골라서 컨트롤러에 넣어주었다.

이때 Entry가 처음 시작이고 각 화살표 방향으로 애니메이션이 바뀌게 된다.

저 화살표를 Transition이라고 한다. Transition은 바꾸기 원하는 애니메이션(A)에서 우클릭을 누르고 Make Transition 선택 후 다음 애니메이션(B)을 클릭하면 해당 애니메이션으로의 transition(A->B)이 생긴다.

근데 이때 Transition만 만들게 되면 해당 애니메이션이 한 번만 플레이되고 바로 다음 애니메이션으로 넘어간다. 특정 상황에서만 애니메이션이 바뀌는 것을 원했기 때문에 각 transition에 조건을 추가해주었다.

여기 이 애니메이터 창에서 왼쪽 위 Parameters 창을 눌러준다.

그럼 이런 창이 뜨는데 아무것도 추가해주지 않았다면 목록이 비어있을 것이다. 여기에 원하는 방식의 조건을 추가해줄 수 있다. 오른쪽의 +버튼을 누르면 Float, Int, Bool, Trigger 이렇게 네 가지 항목이 존재한다. 이 넷 중에 조건으로 원하는 것을 선택해주면 되는데 예를 들어, 나는 ButtonPush라는 이름의 Bool parameter를 만들었다. 그리고 이 ButtonPush가 참일 때만 CorgiWalk에서 CorgiEat으로 애니메이션이 바뀌게 설정했다. 이를 확인하기 위해 CorgiWalk에서 CorgiEat으로 가는 transition을 눌러보면 이런 인스펙터 창이 뜬다.

CorgiWalk에서 CorgiEat으로 가는 transition의 인스펙터

오른쪽에 Conditions 부분에 ButtonPush가 true로 설정된 것을 알 수 있다. 이것은 애니메이터의 ButtonPush라는 parameter가 참일 때만 애니메이션이 바뀐다는 것을 의미한다. 동시에 여러가지 조건을 주고 싶다면 아래에 +버튼을 눌러서 조건을 더 추가해줄 수 있다. 만약 parameter를 float으로 설정한다면 속도가 얼마 이상일 때 애니메이션을 바꾸게하는 등의 설정도 가능하다. 이런 식으로 애니메이터를 세팅해놓으면 실제 코드에서 parameter를 변경해줄 수 있다.

간단한 예시를 위해 코드를 하나 작성했다.

Animator를 코드에 추가해주고 처음 부분에 SetBool 함수를 통해 ButtonPush parameter는 false 상태로 시작할 수 있게 했다. 애니메이터의 다른 파라미터도 마찬가지로 바꿀 수 있다. SetInt, SetFloat 명령어와 parameter명, 값을 넣어주면 해당 parameter가 세팅된다.

이 코드 상에서는 버튼을 누르면 ButtonPush가 true가 되도록 설정했다.

Hierarchy 창에 GameObject를 하나 추가하고 여기에 작성한 코드를 넣어주었다. Corgi와 Button도 넣고 Corgi에는 아까 만들어두었던 Animator를 넣어준다.

버튼의 On Click으로 buttonPush 함수를 넣어줬다.

처음에는 걷고 있던 강아지가 버튼을 누르면 먹는 모션을 취한다. 이 방식을 사용하여 프로젝트에서는 애니메이션을 컨트롤했다. 그래도 초반 코드가 너무 비효율적인 부분이 있어서 고치고 싶긴 하다... 이 방법만 사용한다고 애니메이션을 원하는 대로 설정할 순 없었어서 조건 설정을 잘해주는게 중요하고 또 애초에 애니메이터를 만들 때부터 효율적으로 만들 수 있는 방법을 생각하고 시뮬레이션을 해본다음에 만들면 더 좋을 것 같다.

반응형

[유니티기초] 유니티강좌 - Trigger(트리거)를 활용하여 엘레베이터 움직이기



유니티 시간에 배웠던건데 혹시 까먹을까봐서

일단 아는대로 급하게 작성을 하도록 하겠습니다.


우선, 이 포스팅은 유니티를 처음 접하시는 분들께서는 잘 모르실 수 있으니,

오른쪽에 유니티 카테고리에서 과거의 유니티관련 포스팅들을 먼저 보시고 접하시면

조금 더 이해가 쉬울 것입니다.




이 강좌는...제 개인 복습용으로 초점이 맞춰져 있기 때문에, 다소 설명이 부족할 수 있습니다.

이점 양해 부탁드리겠습니다 ㅠ_ㅠ


최대한 설명은 해 놓을것입니다.

부디 이 글이 도움이 되기를 바라는 간절한 마음으로 말이지요.





우선, 엘레베이터의 모델링 파일은 구글링을 통해서 찾고,

기왕이면 애니메이션까지 같이 들어있는 FBX 파일이 좋습니다.

애니메이션이래봐야 위~아래~ 위위아래~ 움직이는 것이 전부죠.


보통은, FBX파일안에는 애니메이션파일이 같이 들어 있기도 하지만,

만약 없다면, 3D맥스에서 애니메이션을 적용시켜 주면 됩니다.


왼쪽에 ElevatorRoot 는 빈 오브젝트에 Box Collider 를 만들었습니다.

이 박스콜리더의 역할은 플레이어가 이 지역에 들어오면, 엘리베이터가 아래로 내려오도록 해주는 역할을 합니다.

따라서, Is Trigger 에 체크가 되어 있어야 합니다.


그리고 TriggerElevator 라는 스크립트를 넣어주었습니다.

자식 오브젝트로, ElevatorPlate / Elevator / bottom / left / right / back 이 있습니다.





TriggerElevator 스크립트의 내용입니다.





ElevatorPlate 마찬가지로, 빈 오브젝트 입니다. 여기에 박스콜리더 를 적용했구요,

이 충돌체 역할은, 엘리베이터 안에 배치되어 있으며, 플레이어가 들어오면 엘리베이터가 위로 상승을 하게 됩니다.

마찬가지로, Is Trigger 에 체크가 되어 있어야 합니다.





TriggerInElevator 의 스크립트 내용입니다.





Elevator 는 FBX 모델링 이구요, 엘레베이터 입니다.

애니메이션은 말 그대로 위로 갔다 아래로 갔다 하는 동작이구요,

그 아래의 bottom, left, right, back 은 엘레베이터를 통과 못하게 일종의 벽을 만들어 준 것입니다.

각각 빈 오브젝트에 박스콜리더(충돌체) 를 만든 것이며, 이것은 is Trigger 체크를 풀어줍니다.

그래야 플레이어가 통과를 못하게 벽 역할을 하게 됩니다.





박스콜리더는 이렇게 만들어 주는 것이구요~





아까 말씀드렸던, 플레이어가 엘레베이터 안에 도착하면, 올라가는 충돌체를 크기와 위치 조절을 해주는 과정입니다.





TriggerInElevator 스크립트를 저렇게 드래그해서 넣어줍니다.





그리고, ElevatorPlate 에 Ani 변수에 저 움직이는 동작스크립트를 넣어줍니다.





아까 말씀드렸던 벽 역할을 하는 충돌체 입니다.





Is Trigger 체크를 풀어야 통과를 못합니다.



자, 오늘의 유니티수업은 여기까지 입니다.

요새 언리얼 쪽에 더 집중을 하다보니;;; 유니티를 살짝 소홀히 하게 되고 있습니다.

하지만, 아주 관심을 끊은 것이 아니니~ 항상 새로운 것을 배우게 되면 그때그때 포스팅을 할 수 있도록 하겠습니다.



공유하기

게시글 관리

구독하기친절한효자손 취미생활

저작자표시 비영리 변경금지

Toplist

최신 우편물

태그