의자 돌리기
의자에서 아이처럼 빙글빙글 돌고 싶었던 적이 있나요? 이제 그걸 할 수 있어요! 이 튜토리얼에서는 캐릭터와 의자에 제어 가능한 회전을 추가하는 방법을 보여줄게요.
어지러워 어지러워!
의자 소품 준비하기
이 튜토리얼을 위해 꼭 의자 소품이 필요한 건 아니지만, 의자가 있으면 훨씬 재미있을 거예요. Warudo의 Discover 탭을 사용해 Steam Workshop에서 Computer Chair 소품을 다운로드할 수 있어요. (물론, Mod SDK를 사용해 직접 의자 소품을 가져올 수도 있어요!)
캐릭터와 의자 소품을 설정해 캐릭터가 의자에 앉도록 해요:
캐릭터 회전
카메라 애니메이션 튜토리얼에서 Animating the Camera 노드를 기억할 수도 있어요. 하지만 이번에는 캐릭터의 회전만 신경 쓰기 때문에, 대신 Set Asset Rotation 노드를 사용할 수 있어요. (참고로, transform은 위치, 회전, 그리고 스케일을 결합한 개념이에요.) 다음 노드가 트리거되면 어떤 일이 벌어질지 추측할 수 있나요?
이 노드는 캐릭터를 (0, 180, 0). 으로 회전시켜요. Y축은 위쪽을 가리키고 있기 때문에, 캐릭터가 머리에서 발까지 막대가 지나가며 180도 회전하는 모습을 상상할 수 있어요. 그 결과, 캐릭터는 이제 의자의 뒤쪽을 향하게 돼요!
그렇다면, 캐릭터를 (180, 0, 0)으로 회전시키면 어떤 일이 일어날까요? 또는 (0, 0, 180)은 어떨까요? 직접 시도해 보세요!
이제 우리의 다음 단계가 무엇인지 직관적으로 알 수 있을 거예요: 이 노드의 Rotation 데이터 인풋에 무언가를 연결해야 해요. 이 '무언가'는 시간이 지남에 따라 변하는 값이어야 해요, 그래야 캐릭터가 점진적으로 회전할 수 있거든요. 변수를 사용할 수도 있겠지만, 더 쉬운 방법이 있어요.
잠시 생각해 봅시다. 캐릭터가 처음에 회전 값 (0, 0, 0)을 가지고 있다고 가정해요. 우리는 그 캐릭터를 (0, 180, 0)으로 회전시키고 싶어요. 이걸 어떻게 할 수 있을까요? 직접 (0, 180, 0)으로 회전시킬 수도 있지만, 그런 갑작스러운 회전 변화는 별로 흥미롭지 않아요. 그럼 중간 단계를 하나 더 추가해 볼까요? 처음엔 (0, 90, 0)으로 회전시키고, 조금 후에 (0, 180, 0)으로 회전시키는 거예요. 아니면 더 많은 단계를 추가할 수도 있겠죠: (0, 30, 0), (0, 60, 0), (0, 90, 0), (0, 120, 0), (0, 150, 0), (0, 180, 0). 그보다 더 많은 단계로 나누면 어떨까요? (0, 10, 0), (0, 20, 0), (0, 30, 0), ... , (0, 180, 0). 중요한 건, 충분한 단계가 있다면 캐릭터가 부드럽게 회전하는 것처럼 보일 거예요!
이제 이 시퀀스 (0, 10, 0), (0, 20, 0), (0, 30, 0), ... , (0, 180, 0)을 보면, Y축 값이 매 단계마다 10씩 증가하는 것을 알 수 있어요. 다시 말해, 매 단계마다 현재 회전 값을 알면, 다음 회전 값을 쉽게 계산할 수 있어요: Y축 값에 10을 더하면 돼요!
아래 blueprint가 바로 이 작업을 수행해요:
이를 풀어보자면, 우리는 고정된 회전값 대신에 변화하는 회전값을 사용하고자 하는 거예요. 이 변화하는 회전값은 캐릭터의 현재 회전값을 기반으로 하고 있어요. 현재 회전값 (X, Y, Z)을 세 숫자 X, Y, Z로 분해하고 (Decompose Vector3 노드), Y에 10을 더한 다음 (Float Addition 노드), X와 Z는 그대로 두고 Y만 변경하여 새로운 회전값을 만들어요 (Vector3 노드); 마지막으로 Set Asset Rotation 노드를 통해 캐릭터의 회전값을 새로 설정하는 거죠.
이제 Set Asset Rotation 노드의 Enter 플로우 인풋을 클릭해 보면, 캐릭터가 한 번 클릭할 때마다 10도씩 회전하는 것을 볼 수 있을 거예요!
캐릭터가 자동으로 회전하도록 하려면, 매 프레임마다 트리거되는 On Update 노드를 사용하면 돼요:
캐릭터가 더 빠르게 회전하게 하려면 무엇을 변경해야 할까요? 더 느리게 하려면 어떻게 해야 할까요? 단축키로 회전 속도를 제어할 방법을 생각해 볼 수 있나요? (힌트: variable를 사용해 회전 속도를 저장할 수 있어요.)
하지만 이건 캐릭터만 회전시킬 뿐이에요. 그래서 의자도 함께 회전시켜야 해요:
이제 캐릭터와 의자가 팽이처럼 회전할 거예요!
선택한 의자 소품은 기본적으로 캐릭터와 동일한 방향을 가지고 있을 거예요. 그렇지 않다면, 의자를 올바른 방향으로 회전시키기 위한 추가 노드가 필요할 수 있어요.
게이트
이제 캐릭터가 최대 속도로 회전하고 있어요. 그런데 이 회전을 어떻게 멈출 수 있을까요? 물론 On Update 노드를 끊으면 멈출 수 있죠:
하지만 이 방법은 불편하죠, blueprint를 비활성화하는 방법도 있지만, 좀 더 좋은 방법을 찾아봐요. On Update 노드에서 나오는 플로우를 멈출 방법을 찾아보도록 해요.
당신이 성에 살고 있는데 성 안으로 들어오는 사람들의 흐름을 멈추고 싶다고 상상해보세요. 어떻게 하겠어요? 문을 달면 되겠죠!
이와 같은 방식으로, Gate 노드를 사용해서 On Update 노드에서 나오는 플로우를 멈출 수 있어요.
Gate 노드는 이름 그대로 동작해요. Enter 플로우 인풋을 통해 들어오는 플로우는 게이트가 열려 있을 때만 Exit 플로우 아웃풋으로 나가요. 기본적으로 게이트는 열려 있지만(Opened가 Yes로 설정됨), Close 플로우 인풋을 클릭하면 게이트가 닫히고 (Opened가 No로 설정됨), 플로우가 나가는 걸 막아요.
즉, 우리는 단축키를 설정해서 이 게이트를 토글할 수 있어요! 아래 blueprint를 사용하면 R 키를 눌러 게이트를 열거나 닫을 수 있고, 캐릭터의 회전을 시작하거나 멈출 수 있어요:
회전 초기화
현재 설정에는 문제가 하나 있어요. R 키를 눌러 회전을 멈추면 의자와 캐릭터가 회전 중이어도 바로 멈추게 되죠. 우리는 회전이 끝나고 자연스럽게 원래 위치로 돌아가길 원할 거예요.
이 문제를 해결하기 위해 아래 노드를 추가 해보도록 해요:
이 노드들이 하는 일은 간단해요. T 키를 누르면 캐릭터와 의자가 원래 회전 상태로 부드럽게 돌아가요. 여기서 Transition Time을 0.5초로 설정하고, Transition Easing을 OutBack으로 설정했어요. 이렇게 하면 회전이 끝날 때 살짝 튀는 듯한 "탄성" 효과가 생기죠.
그런데 잠깐, 왜 (0, 0, 0) 대신 (0, 360, 0)으로 회전하냐고요? 그 이유는 Set Asset Rotation 노드가 항상 목표 회전 값까지 가장 짧은 거리로 회전하기 때문이에요. 예를 들어, 현재 시계 방향으로 90도 회전한 상태에서 0도로 돌아가려면, 반시계 방향으로 90도 돌리거나 시계 방향으로 270도 돌릴 수 있어요. Set Asset Rotation 노드는 가장 짧은 거리인 반시계 방향 90도를 선택하겠죠. 하지만 실제로 의자에 앉아 회전할 때는 가장 짧은 거리가 아니라, 계속 시계 방향으로 돌아서 원래 위치로 돌아가고 싶을 거예요.
그래서 우리는 Set Asset Rotation 노드를 "속여서" 목표 회전을 (0, 360, 0)으로 설정해요. Get Asset Rotation 노드가 반환하는 값은 항상 360도 이하이기 때문에, Set Asset Rotation 노드는 시계 방향으로 계속 돌아가 360도에 도달하게 되는 거죠.
시퀀스
거의 완벽한 설정이에요, 하지만 아주 작은 문제가 하나 있어요. 현재 회전을 멈추려면 R을 누르고, T를 눌러야 해요. 그런데 한 번만 R을 눌러서 회전을 멈출 수 있으면 좋겠죠?
처음 보기엔 간단해 보이는 작업이에요. 우리는 Flip Flop 노드를 잘 알고 있죠. 이 노드는 두 가지 플로우 아웃풋을 번갈아가며 실행해요. 그래서 Flip Flop 노드를 사용해서 "게이트를 열고 회전을 시작"과 "게이트를 닫고 회전을 멈추지만, 원래 회전 상태로 돌아가기"를 번갈아 실행하면 될 것 같아요. 첫 번째는 간단해요: Flip Flop → A를 Gate → Open에 연결하면 돼요.
그런데 두 번째는 어떻게 해야 할까요? 만약 Flip Flop → B를 Gate → Close에 연결한다고 해도, Set Asset Rotation 노드를 사용해 원래 회전 상태로 돌아가는 작업은 어떻게 트리거할까요? 플로우 아웃풋은 하나의 플로우 인풋에만 연결할 수 있기 때문에 Flip Flop → B를 Gate → Close와 Set Asset Rotation → Enter에 동시에 연결할 수는 없어요.
이때 필요한 것이 바로 Sequence 노드예요. Sequence node노드는 가변적인 수의 플로우 아웃풋을 가질 수 있고, 트리거될 때 각 플로우 아웃풋을 순서대로 실행해요. 시퀀스 노드를 사용하면, 먼저 게이트를 닫고, 그 다음에 원래 회전 상태로 돌아가게 만들 수 있어요:
이제 R만 누르면 회전을 시작하거나, 자연스럽게 회전을 멈출 수 있어요!