목차
게임을 만들다보면, 하나의 캐릭터는 굉장히 많은 동작을 수행해야한다.
대기, 걷기, 뛰기, 앉기, 공격 등등등...
그런데 스크립트 상에서 이러한 동작을 전환시키려면 어떻게 해야할까?
각 상태별로 Boolean 변수를 만들어서 각 변수를 체크한다?
동작이 한 두개라면 쓸 수 있는 방법이겠지만, 동작이 많아지면 많아질수록 관리가 감당이 안될것이다.
이럴때 사용하는 방법이 바로 State 패턴.
public enum PlayerState
{
Die,
Moving,
Idle,
Channeling,
Jumpling,
Falling,
}
PlayerState _state = PlayerState.Idle;
우선 이렇게 동작을 정의? 해준다.
void Update()
{
switch (_state)
{
case PlayerState.Die:
//해당 동작에 수행할함수
break;
case PlayerState.Moving:
//해당 동작에 수행할함수
break;
case PlayerState.Idle:
//해당 동작에 수행할함수
break;
}
}
이후, Update 등... 상태를 빠르게 확인해서 그 상태에 맞는 동작을 수행할수있게 해 주면 된다.
단점이라면, 동시에 두 가지 상태를 갖게 할 수 없다.
다만 한 번에 한 가지 동작을 수행하기에는 관리가 편하다.
State Machine
위의 방법으로 진행을 하면, Switch 문을 활용하여 각 상태에 따라 애니메이션이 동작하게 하거나, 원하는 위치로 이동한다던지, 공격을 한다던지 할 수 있다.
다만, 애니메이션의 경우에는 아래와 같이 Transition을 해서 전환을 할 수 있다.
? 스크립트를 사용하지 않고 왜 이렇게 하는가 ?
State가 많아짐에 따라서 스크립트로 조절을 하는것이 복잡해질수가 있다.
위와같이 시각적으로 보이는 것이 조금 더 직관적이라는 장점이 있다.
연결 선을 만들고
Parameter를 만들어준다.
이 Parameter는 코드와 애니메이터를 연결해주는 것이라고 생각.
따라서 코드상에서 이 애니메이터의 파라미터를 받아와서 값을 변경해주고
애니메이터는 그 변경된 파라미터의 값에 따라 애니메이션의 전환을 수행해주면 된다.
파라미터의 값에 따른 전환은 이와같이 해 주면 된다...
알쓸신잡
Has Exit Time 이란?
간단하게 생각하면, 동작이 끝나기까지의 시간이 생긴다는것.
일정시간이 지나면 해당동작이 끝나고 다음 동작으로 넘어가는데, Has Exit Time에 false를 하면 특별한 명령없이는 평생 그 동작만을 반복하게 될 것이다.
이렇게 여러가지 Transition이 연결되어 있다면 우선순위는?
- 중심이 되는 State의 Inspector에 가서 Transitions의 우선순위대로 동작한다.
+ 해당 포스팅은 Rokiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 들으며 개인적으로 이해에 도움이 되기위해 간단하게 정리를 한 내용입니다.
'Unity3D > 유니티 공부' 카테고리의 다른 글
[유니티] UI - 1 (0) | 2022.01.21 |
---|---|
유니티 게임 오브젝트와 UI 클릭을 구분하기 - [EventSystem.IsPointerOverGameObject] (0) | 2022.01.16 |
유니티 간단하게 조이스틱 이동 해보기. (1) | 2021.12.02 |
[Unity2D 공부] 기초적인 클리커 게임 제작 (0) | 2021.06.09 |
[Unity2D 공부] 이동과 충돌 학습정리 (0) | 2021.06.07 |