
상태 관리 그래프
Tutorial
foundational
+10XP
40 mins
Unity Technologies
지금까지 배운 스크립트 머신과는 달리 상태로 나누어 그래프를 관리하는 스테이트 머신을 활용하여 로직을 구성하는 단계입니다.
1. 캐릭터 오브젝트 준비
지금까지는 하나의 로직으로만 이루어져 있다면 상태에 따라서 로직이 작동하게 관리할 수 있는 상태 머신(FSM)에 대해 알려드리고자 합니다. 이것을 위해 다른 캐릭터 프리펩을 장면에 넣고 트리거 이벤트를 받을 수 있도록 Sphere Collider를 추가해봅니다. (IsTrigger 체크)그리고 이번에는 State Machine 컴포넌트를 새로 추가합니다.
새로운 오브젝트는 상태 머신 State Machine을 활용할 예정
2. 상태 머신 살펴보기
Script Machine에서 했던 것과 같이 New 버튼을 눌러 새로운 그래프 에셋을 생성합니다. 이후 자동으로 State Graph가 열리게 되는데, 여기에는 상태 기반 노드가 보일 것입니다.
상태 노드는 포함하고 있는 이벤트를 미리 보여주고 있습니다.
이 노드를 더블클릭하면 안으로 들어가 Script Graph를 볼 수 있고 창의 위쪽에서 부모 그래프 이름을 눌러 되돌아 갈 수 있습니다.
창 위쪽에 경로가 표시되고 부모 그래프 이름을 누르면 되돌아갈 수 있습니다.
3. 상태 추가하기
이제 다른 상태를 추가해봅시다. 빈 공간에서 우클릭 후 Create Script State로 새로운 상태를 만들고 노드 위에서 우클릭으로 Make Transition으로 서로를 연결해주도록 합시다. 이 때 우클릭을 시작한 곳과 연결한 곳으로 상태이동 방향이 결정됩니다.
두 개의 상태 노드를 이어주는 모습
Transition은 역시 하나의 그래프를 갖는데 여기서는 상태 이동을 어떻게 하느냐를 결정해주는 로직을 작성해야 합니다. 우리는 플레이어가 해당 오브젝트의 Collider 영역에 닿으면 다음 상태로 넘어가게 할 것입니다. 그렇기 때문에 OnTriggerEnter 이벤트 노드와 플레이어임을 확인하기 위한 CompareTag 노드, 조건으로 흐름을 분리할 If 노드를 추가하고 서로 연결해줍니다.
태그가 Player인 오브젝트와 접촉할 때만 상태 이동하는 그래프
특이한 점은 OnTriggerEnter 노드에서 충돌할 상대방의 Collider 타입의 데이터를 출력하는데 이것을 GameObject 타입으로 CompareTag에 전달했다는 것입니다.
유니티 비주얼 스크립팅은 이처럼 요구하는 타입과 전달하는 타입이 서로 달라도 자동 형변환이 지원된다는 편리함을 가지고 있습니다.
이벤트가 추가된 Transition 노드의 모습
4. 상태 변경 이벤트 완성하기
이제 다음 상태의 로직을 작성할 시간입니다. 상태 노드의 이름은 Graph Inspector에서 설정할 수 있습니다. 이름을 정하셨다면 더블클릭해서 들어간 후 간단하게 제자리에서 회전하는 그래프를 만들어봅니다. 여기에는 Transform > Rotate (X, Y, Z) 노드를 사용합니다.
OnUpdate를 통해 자체 회전하는 그래프
마지막으로 플레이어가 다시 Collider 영역을 벗어나면 원래 상태로 돌아도록 반대 방향의 Transition을 추가하면 됩니다. 이벤트만 다를 뿐 나머지는 동일하게 그래프를 만들어봅니다.
반대방향의 Transition 그래프와 완성된 상태 그래프
상태 머신이 완성되었으니 실행해보도록 합니다. 그 전에 상태 이동은 상대방의 Tag를 확인하기 때문에 플레이어 오브젝트의 Tag를 꼭 Player로 설정합니다.
플레이어 오브젝트의 태그를 Player로 설정합시다.
이후 실행하고 상태머신을 가진 오브젝트를 선택하면 그래프에서 상태 이동이 되는 것을 실시간으로 확인할 수 있습니다.
Transition의 로직에 따라 상태가 바뀌는 것을 실시간으로 확인할 수 있습니다.