실시간 게임을 제작하는 과정에서, 애니메이션 제어를 스크립트로 직접 구성하는 것보다

유니티에 구현된 메카님 시스템을 잘 사용하는게 시간이 절약된다고 판단하여 메카님 시스템을 통해 구현

그동안 구현하면서 느낀점들

 

설계 방향

 - 시스템에서는 상태값(Parameters)을 애니메이터에게 지속적으로 넘긴다.

 - animator.Play 등을 통해 강제로 특정한 노드를 플레이 시키지 않는다.

 - animator.speed는 히트프리즈와 같은 기능을 구현할때를 제외하고는 수정하지 않는다.

 - 상태전이는 animator의 Transition을 통해서만 구현한다.

 

장점

- 상태 관리를 애니메이터로만 하게 되므로, 코드의 수정이 적어진다.

- 애니메이션 블렌드 등 상태 전이할때 옵션을 세세하게 조정할 수 있다.

- Inspector를 이용해, 전이때 어떻게 애니메이션이 변경되는지 미리 관찰할 수 있다.

 

단점

- animator.speed가 0일때, 상태 전이는 이루어지지 않는다.

- animator override controller를 구현해도 세부적으로 Actor들마다 구현이 미묘하게 달라, 결국 각각의 애니메이터를 만들어야 하는 상황도 발생

- SubState 노드를 만든다면, animator.Play로 진입시, Default 노드의 기준을 알수가 없다.

 

추후 개선 할점

- 히트프리즈 (animator.speed = 0)를 구현한뒤, 특정 액션이 끝날때 애니메이션이 끝나는것을 맞춰야 한다면, 어떻게 설계할 것인가 ?

- node의 normalizeTime을, 코드에서 넘겨준 값으로 설정할때 blend와 상태전이는 어떻게 이루어 질것인가 ?

 

초기 게임을 만들때는 히트프리즈 또는 세부적인 애니메이션 재생을 고려하지 않고 만들어 졌지만 (초기에는 animator.Play(노드 이름) 으로 처리) 추후에 확장되면서 여러가지 변경이 이루어 졌다.

여러번 설계가 변경되면서 얻은 정보들을 적는다.

 

1. 애니메이션의 재생 속도는 animator.speed를 변경하는 것보다. Node의 Multiply를 변경하는것이 좋다.

애니메이터 창을 열어본뒤 노드를 선택하면 인스펙터에 다음과 같이 나타난다.

필드를 보면 Multiplier 라는 곳이 비활성화 되어있다.

animator 의 parameters에 float 파라미터를 한개 추가한뒤, 애니메이터 노드 (위 사진)의 Multiplier -> Parameter를 체크한다.

위의 사진은

1. animator의 파라미터에 WholeActive라는 파라미터를 float으로 만들었다.

2. Multiplier에 Parameter를 체크하고, WholeActive를 드롭다운 메뉴에서 선택했다.

 

실제로 사용할때는 코드에서 

animator.SetFloat(파라미터 이름, 값) 으로 설정한다.

* string으로 값을 넘기는것은 성능이 좋지 않기때문에

int hash = Animator.StringToHash("파라미터 이름");

aniamtor.SetFloat(hash, 값)로 처리한다.

 

위 사진의 Death의 Clip 길이가 2초이고, WholeActive의 값을 2로 설정하면

2배의 속도로 재생된다. (1초동안 애니메이션이 재생됨)

 

처음 써보기 전에는 애니메이터가 정확하게 예상한대로 시간을 맞춰줄까 ? 의심했지만.

사용해보니 잘 맞춰춘다.

 

2. 애니메이션이 중간에 멈추거나 다른 동작으로 자주 바뀐다면, Trigger보다 Bool 값을 통해서 전환하는게 유리하다.

이동중에 공격을 하거나, 공격 도중 움직이면 애니메이션이 Stand로 돌아가야 하는 등, 실시간으로 상태가 자주 바뀐다면, Transition을 할때 Bool을 통해서 하는게 유리하다.

 

다음과 같이 Transition (화살표 선)을 클릭하면, 조건을 설정할 수 있는데

다음과 같이 Bool 값을 통해서 전이하는게 유리하다.

이렇게 처리하면

 

1] 공격이 시작될때 animator에 true를 전달

2] 공격이 끝나면 animator에 false를 전달.

3] 공격 도중, 중단한다면 animator에 false를 전달.

 

false일때 재생중인 노드를 나오도록 설정하면, 편리하다

 

3. 상태전이가 동시에 여러번 일어날때, Interruption Source 옵션을 활용한다.

다음과 같은 상황을 예시로 들어보자.

상황 : 모든 Transition (상태 전이)은 Blend가 0.2초로 설정되어 있다.

1] 현재 Move 애니메이션을 재생하고 있다.

2] 멈춘다음 바로 공격을 한다. (Move -> Stand -> Atk_02)

 

별도의 설정을 하지 않았다면, 실제로 코드는 공격을 실행하고 있지만 (파라미터의 값도 변경되어 있지만) 애니메이터는 Move -> Stand로 전이를 하는 중이다 (0.2초가 지나지 않아서)

하지만 일반적으로 다른 파트에서는 공격을 시작했으니 Atk_02가 바로 재생되기를 원한다.

 

이럴때는 Move -> Stand 로 향하는 Transition (화살표) 를 클릭 한뒤 다음과 같이 설정하자.

Settings 에서 Interruption Source를 Next State로 설정한다.

Animator Interruption Source로 검색하면 더 많은 내용이 나오지만

간단하게 설명하자면

 

현재 Transition중일때, 다음 Transition 조건에 해당된다면 현재를 건너뛰고 바로 다음으로 가는것이다.

ex) Move -> Stand로 Transition 중일때, Stand -> Atk_02로 Transition이 가능한 상태라면 Atk_02로 바로 전이를 시작한다.

 

이때 Blend는 현재를 기준으로 진행되기 때문에 부자연스럽지 않다.

=> Move의 애니메이션 마지막 상태에서 Atk_02로 블렌드

'프로그래밍 > Unity (유니티)' 카테고리의 다른 글

WWW Request (post)  (0) 2018.09.05
Unity 다른 이름 앱 빌드  (0) 2018.07.20

유니티에서 WWW를 이용해 Post 메시지를 전송했었는데


upload Progress는 1인데 


downloadProgress, progress는 계속 0에 머무르는 현상이 있었다.


while( !www.isDone )

{

Debug.log(www.downloadProgress);

Debug.log(www.uploadProgress);

yield return new WaitForSeconds(0.1f);

}

와 같은 코드로 확인


원인을 확인해보니 WWW를 생성할때 URL, Form만 삽입하는게 아니라


Header를 삽입하지 않을경우 해당문제가 발생했었다.


WWW www = new WWW(URL, form.data, header)와 같은식으로 생성한뒤 post메시지 전송시 정상 처리됨

유니티 앱 이름 변경은 프로젝트 셋팅에서 간단히 진행하면 되지만

Firebase, Facebook, Google Auth (인증)이 추가되고 나서는 APK이름 바꾸는게 쉽지가 않다.

페이스북, 구글 로그인을 적용하고 나서 다른 앱 이름으로 빌드하는 방법이다.


1. Project 폴더에서 google-services.json 파일의 package 이름을 새 APK 이름으로 변경한다.


2. Project Setting에서 AppId 및 App 이름 변경


3. Build Setting에서 Minify -> Proguard를 None으로 변경한다.


4. Facebook메뉴 -> EditSettings -> Selected App Id 를 다른 App Id로 변경한다.


5. Assets 메뉴 -> PlayService Resolver -> Android Resolver -> Resolve를 눌러 처리한다.


6. PlayerSettings 에서 Product Name, Package Name을 변경한뒤 빌드한다.


* 이때 Product Name과 google-service.json의 package 이름이 같아야 한다.

'프로그래밍 > Unity (유니티)' 카테고리의 다른 글

[Unity] 애니메이션 메카님 시스템 (Mecanim)  (2) 2020.02.12
WWW Request (post)  (0) 2018.09.05

+ Recent posts