본문 바로가기
게임 프로그래밍/유니티 활용

[유니티 활용] 비주얼 스크립팅 - State Machine

by 레오란다 2023. 5. 2.
반응형

이번 글에서는 유니티 비주얼 스크립팅에서 State Machine 을 사용하는 방법에 대해 알아보도록 하겠습니다. 이 예제에서는 Idle 상태일 때는 Cube의 scale 값을 조정해 커졌다 작아지는 것을 반복하고 키보드의 화살표키를 입력하면 해당 방향으로 Cube 가 이동하도록 할 것입니다.

 

 

State Machine 추가

우선 State Machine 의 추가는 다음과 같이 Add Component 에서 추가할 수 있습니다.

 

비주얼 스크립트용 State Machine 추가

 

추가된 State Machine 컴포넌트에서 아래와 같이 [New] 를 클릭하고 asset 을 만들어 줍니다. 이름은 임의로 정하시면 됩니다. 저는 CubeSM 으로 하였습니다.

새로운 State Machine 에셋 생성

 

위의 방법대로 추가한 후에 Edit Graph 를 클릭하면 다음과 같이 State Graph 창이 나타납니다.

 

State Graph 창

 

위의 그림에서 붉은 색 테두리 부분에서 이름을 변경할 수 있습니다. 이름을 Idle 로 변경합니다. 이제 Idle State 를 더블클릭 하면 다음과 같은 화면으로 바뀌고 Enter / Update / Exit 상태일 때 어떤 동작을 할지 만들 수 있습니다.

 

Idle State 작성

먼저 OnEnter / OnExit state 와 OnUpdate 가 어떻게 동작하는지 알아보도록 하겠습니다.

 

OnEnter State: Idle 상태로 진입할 때 한 번 호출됩니다.

OnExit State: Idle 상태를 빠져나갈 때 한 번 호출됩니다.

OnUpdate: Idle 상태에 있는 동안 반복적으로 호출됩니다.

 

다음은 각 상태에서 수행할 동작 정의입니다.

 

OnEnter / OnExit State: transform.localscale 의 값을 (1, 1, 1) 값으로 초기화 함

OnUpdate : transform 의 scale 값을 변경해 cube 가 주기적으로 커졌다 작아졌다 하도록 만듭니다.

 

작성 과정은 다소 복작하기 때문에 아래의 영상을 참고해 주시기 바랍니다.

 

Idle 상태 작성

 

여기서 사용되는 큐브의 scale 값 변경 코드는 sin 함수를 이용합니다. sin 함수에 45 ~ 135 도 값을 넣어주고 그 결과를 Vector3.one 에 곱한 결과를 transform의 localscale 값으로 사용합니다. C# 코드는 다음과 같습니다.

 

float val = 0f

void Update()
{
   val = (val + 0.5) % 90;   
   transform.localScale = Vector3.one * Mathf.sin((val + 45) * Mathf.Deg2Rad);
}

 

이제 아래와 같이 붉은 테두리 부분을 클릭하면 상위 단계로 갈 수 있습니다.

상위 단계로 이동

 

Cube 이동

이제 큐브를 이동하는 상태를 만들어 보도록 하겠습니다. 아래의 그림과 같이 State Graph 창의 빈 영역에서  [마우스 우클릭 > Create Script State] 를 클릭하고 새로운 상태를 생성합니다.

 

Create Script State

 

Script State 도 OnEnter / OnExit / OnUpdate 로 구성되어 있습니다. 박스를 더블클릭 해서 세부 설정으로 들어갑니다. 여기서는 OnEnter 와 OnExit 는 사용하지 않으므로 선택 후 delete 버튼을 눌러 삭제해 줍니다. 그리고 OnUpdate 에 대해 다음과 같이 작성해 줍니다. 이름은 MoveRight 로 변경합니다.

 

Move Right

 

위의 비주얼 스크립팅은 다음의 C# 코드와 같습니다.

void Update()
{
   transform.Translate(Vector3.right * Time.deltaTime * 10f);
}

 

이벤트 연결

다시 Cube 가 써져 있는 부분을 클릭합니다. 이제 아래의 영상과 같은 방법으로 Idle 상태와 MoveRight 를 키보드 이벤트로 연결합니다.

 

 

transition 연결 후 이벤트 설정

이와 같은 방법으로 left, up, down 을 만들어 주면 키보드 화살표 키를 이용해 상/하/좌/우로 움직이는 큐브를 만들 수 있습니다.

 

 

 

반응형

댓글