Unity 5로 '따라하면서 배우는 유니티 3D 입문' 7장 플랫포머 게임 따라하기.

키보드로 주인공을 조종하여 파란색 오브를 먹는 게임. 가시나 트랩 등에 닿으면 재시작 된다. 매카님(Animator 컴포넌트, 컨트롤 데이터인 Animator Controller, 애니메이션 데이터인 Animation Clip)을 이용해 애니메이션 구현하기.

* wsad키 혹은 화살표 상화좌우키로 주인공 전후진과 좌우 회전 조종.
* 점프: space 키, 슬라이딩: 좌측 shift키

역시 게임의 용량이 꽤 되는지라 캡쳐만 올림.

15/11/16 월

* Cube, Plane으로 바닥, 계단 등 만들기-경사로는 40도, 계단차는 0.25.
* 여자아이 모델링 fbx, 매핑 png 임포트.
Component-Physics-Character Controller 추가,
Center: 0/0.81/0, Radius: 0.4, Height: 1.6 조정.
Slope Limit: 45 경사 올라가기 제한,
Step Offset:
0.3 계단 올라가는 최대 각도

* 스크립트로 캐릭터 조종 처리. wsad로 전후진,좌우회전, 스페이스로 점프.
* Move 함수의 반환값 CollisionFlags 형 값에따라 캐릭터가 어디에 접촉했는지 여부 판단 가능.
CollisionFlags.None: 충돌 안함
CollisionFlags.Above: 상단 충돌
CollisionFlags.Sides: 측면 충돌
CollisionFlags.Below: 하단 충돌

ex) CollisionFlags flag = man.Move (vel * Time.deltaTime);
if (flag == CollisionFlags.None) { //어떤 것과도 충돌 안함 }
if ((flag & CollisionFlags.Above) == CollisionFlags.Above) { //캐릭터 상부에 충돌한 경우 }

* 주인공 모델링 fbx를 Project에서 선택,
Inspector-Rig 탭에서 Animation Type: Humanoid로 설정, Apply.
Avatar Definition-Configure 클릭하면 모델의 Avatar가 만들어진다.
Head 버튼 클릭하고 Left/Right Eye 각각 None으로 선택, Apply, Done 클릭.

* 애니메이션 임포트: Inspector-Animation 탭에서 불러들여진 애니메이션들을 볼 수 있다. 이곳에서 이름을 재설정하거나 불러들일 프레임 번호, 반복 여부(Loop Time, Loop Pose 체크)를 정할 수 있다. Idle, Jump, Run, RunFirst, Walk, WalkBack은 모두 반복체크, Sliding은 반복체크 없이 Root Transform Position(Y)-Based Upon을 Feet으로 지정. 설정 완료 뒤 Apply 클릭.

* Animator Controller: Project에서 새 Animator Controller 생성. 더블클릭으로 Animator Controller 창 열기.
- 일반 상태 생성: 창에서 마우스 우클릭 Create State-Empty로 새 상태 만들고 이름 Idle로 지정(첫 상태라 오렌지 색이다)하고 Motion에 tgIdle(애니메이션 파일) 적용.
- 블랜드 상태 생성: Create State-From New Blend Tree로 새 상태 만들고 이름 Forward로 지정.
Parameters 탭 + 누른 뒤 Float 선택, 이름 Speed로 설정.
Forward 더블 클릭하여 내부로 들어가 Inspecter 뷰 Motion 탭 + 클릭하고 Add Motion Field 선택하는 방식으로 Motion Field 3개 생성하고 위부터 차례로 tgWalk, tgRun, tgRunFist 애니 적용. Parameter: Speed 적용.
- 트랜지션 생성: Idle 상태 위에서 마우스 우클릭 Make Transition 클릭한 뒤 나오는 화살표를 이을 Forward 상태까지 드래그하여 연결하기.
화살표를 클릭한 뒤 전환조건으로 Conditions +를 클릭 새 조건을 생성하고 Speed, Greater, 0.1로 설정. Forward에서 Idle로도 transition을 만들고 조건은 Speed, Less, 0.1로 설정.
* Jump 일반 상태 만들고 tgJump 애니 Motion에 연결. Ani State에서 Jump로 새 트랜지션 생성. Parameter Bool형 IsGround(체크하여 기본 true로 설정), IsJumpStart 변수 생성. 트랜지션 조건에 IsGround, IsJumpStart - true로 설정.
이런 식으로 Sliding, Backward 상태까지 추가하여 완성.

트랜지션의 조건 유형은 3가지:
Bool -참/ 거짓으로 선택
Float/Int -지정 수치보다 크거나 작다
Exit Time -현 스테이트 재생후 경과시간

* 메카님: 모델 임포트 설정 중 Rig 탭에서 Animation Type: Generic 또는 Humanoid로 설정하면 아바타가 만들어 진다.
아바터 설정화면은 Configure를 누르면 들어갈 수 있고 Mapping(본 매핑)과 Muscles(각 파트 가동범위 설정)로 나뉘어진다. Done을 누르면 빠져 나온다.

* 움직임에따라 Animator에서 애니메이션을 변경시키는 조건인 Parameter를 변화시키는 방식으로 행동에따른 애니를 변경시키는 스크립트 처리.
tgGirl Inspector뷰에서 Animator 활성화 시키고 Controller에 'AniTrGirl' 애니메이터 컨트롤러를 적용시키고 Apply Root Motion 체크 해제.

대기 상태에서 걷기 상태로 가는 방식이 좀 이상하며 슬라이딩이 제대로 작동 안하고 있다. 대기 상태에서 걷기나 뒤로 걷기 상태로 바로 바뀌어야하는데 자신의 애니메이션이 끝날 때까지 대기했다가 앞으로 걷기나 뒤로 걷기로 이동하고 있다.
* 문제해결: Transition 설정 중 Has Exit Time이 체크되어 있어서 생긴 문제 였다. Idle, Forward, Backward등의 연결 Transition들의 Has Exit Time 체크를 해제하자 바로 다음 애니메이션으로 전환된다.

* 추가 애니메이션용 모델 u_man.fbx를 임포트, Animation Type: Humanoid로 변경, Apply, Configure, 포즈에 에러가 난 상태이니 Mapping-Enforce T-Pose, Apply로 해결한 뒤 Done으로 나오기.
- 동체 애니메이션만 사용하기 위해 Project에서 Create-Avatar Mask 생성.
SpineMask'라 명명, Humanoid 항목에서 몸통만 선택해 녹색 만들기.
- AniTrGirl 애니메이터에서 Layers 탭 + 클릭, 새 레이어 생성한 뒤 'Sub Layer'라 명명, Mask에 동체만 선택한 SpineMask 적용. 새 파라미터 'Direction' 추가.
Sub Layer에서 'SpineRoll' 블랜드 상태 생성, 파라미터는 'Direction' 선택, 좌측 최소 숫자를 0에서 -1로 변경해 시작을 중앙으로 변경. Motion 2개 추가해 각각 왼쪽으로 허리 굽히는 애니와 오른쪽으로 허리 굽히는 애니 적용.

스크립트 수정하여 걷거나 달리는 중 회전시 회전 방향으로 허리를 굽히는 애니를 추가.

애니메이션 동작이 바로 바뀌지 않던 문제 해결.
Transition 세팅 중 Has Exit Time에 체크가 되어있어서 생긴 문제로 체크들을 해제하자 동작간 전환이 바로바로 전환된다.

* 주인공 밑에 동그란 간단 그림자 만들기: Projectors 폴더째 임포트하고 Blob Light Projector 프리팹을 treasureGirl의 자식으로 만드로 Position: 0/1.6/0, Far Clip Plane: 5로 설정. 새로 'Player' 레이어를 생성한 뒤 treasureGirl의 레이어를 Player로 변경-변경시 자식들도 변경할 것인지 물어보는데 yes로 모두 변경. Blob Light Projector 프리팹에서 Ignore Layers: Player로 선택하면 된다. 한데 5로 버전 업 되며 이전 프로버전에만 제공되던 Self Shadow가 기본적으로 제공되므로 필요없는 짓이 되었다.

* 아날로그 컨트롤러 추가: Single Joystick.prefab, Joystick.js, JoystrickThumb.psd 임포트, 빈 게임오브젝트 생성, 'Input'이라 명명. Single Joystick.prefab을 3번 Input 아래 자식으로 추가. 이름(Position-Touch Pad): Joystick(0.05/0.05/0-OFF), ButtonJump(0.75/0.25/0-On), ButtonSliding(0.7/-0.03/0-On)으로 설정.
Jostick.js 스크립트는 새로 Standard Assets 폴더를 생성하여 그곳으로 옮긴다(이렇게 하지 않으면 자바스크립트와 C#스크립트 간에 에러가 발생한다. 이런 언어간 에러를 방지하기 위해 Standard Assets나 Plugins 폴더에 다른 종류의 스크립트를 이동시킨다). InputState.cs, PlayerAnimationController.cs를 임포트하여 각각 Hierarchy-Input과 treasureGirl(기존 적용한 csPlayerControl.cs, csPlayerAniSet.cs는 비활성화 시킴) 오브젝트에 적용.
다 따라했지만 이건 안드로이드나 아이폰에서 실행할 경우만 아날로그 조이스틱이 나오기에 일반적으론 필요없는 작업. 확인도 못 해봄.

* 스테이지 불러와 애니메이션 입히기: Platforms 폴더 채 임포트. Platforms-Prefabs폴더의 Stage.prefab을 Hierarchy 창으로 보내 스테이지 화면에 불러오기.
* SmoothFollow.js 임포트하여 Main Camera에 적용, Target: pfPlayer, Distance: 6으로 설정.
* Directional Light-Intensity: 0.2로 하여 전체적으로 어둡게 설정.
* 빈 게임오브젝트 생성, 'SpawnPoint'로 명명, Position: -3.5/1/-3.5로 설정.
* 사운드 이펙트 2개와 배경음악 mp3 3개 임포트.
* 빈 게임오브젝트 생성, 'GameController'로 명명, csGameControl.cs(게임 시작시 또는 죽을 경우 주인공 스폰 포인터에 새로 생성하기, 함정에 닿거나 보석에 닿을 경우 소리 내기와 이후 처리), csSound.cs(소리 내기 처리) 스크립트 적용.
GameController에 Audio Source 컴포넌트 추가하고 Audio Clip:bgm.mp3 적용하고 Loop 체크.

* 애니메이션 컴포넌트 추가:
- Stage-TrapRotating에 Add Component, Miscellaneous-Animation 컴포넌트 추가.
Window-Animation으로 애니메이션 창 띄우기. 빨간 녹화 버튼 형태인 Animation Mode 버튼을 클릭(애니메이션 편집 모드로 전환-처음일 경우 파일 저장 메뉴가 표시)
하고 TrapRotate.anim으로 Platforms 폴더에 저장.
Add Property 클릭 Transform-Rotation 추가. 프레임을 300으로 설정, Rotation.y 우측 원 버튼 클릭,
Add Key로 키프레임 생성하고 값을 360으로 넣고 WrapMode: Loop로 설정.
300 프레임에서 Add Event 버튼 클릭, Edit Animation Event 창의 Function에서 TrapRotating에 적용시킨 csTrapEvent.cs의 StartTrapMovingAnimation()을 선택하여 한바퀴 회전할 때마다 떨어졌다 올라가는 트랩 애니가 다시 재생되게 처리.

- Stage-TrapMoving에 Add Component, Miscellaneous-Animation 컴포넌트 추가.
Window-Animation으로 애니메이션 창 띄우기. 빨간 녹화 버튼 클릭하고 TrapUpDown.anim으로 Platforms 폴더에 저장.
Add Property 클릭 Transform-Position 추가.
프레임 60: 5.5, 프레임 70: 2.5, 프레임 90: 3.5 로 설정,
프레임 60: Flat(애니메이션 커브 핸들 수평화), 프레임 70: Broken(애니메이션 포인트, 커브 핸들 자유롭게 마우스로 이동 가능)으로 설정하고 70번 프레임 포인트를 마우스로 옮기고 핸들을 조종, 커브가 날카로운 V형으로 애니메이션 커브 변경. WrapMode: Once로 설정.

* Animation의 WrapMode가 안보여 헤멨는데 anim 파일을 선택하고 Inspector 메뉴 우상단 메뉴를 클릭하고 Debug 모드로 바꾸면 보인다. 그리고 버전 차이인지 그냥 책에 나온대로 하면 에러가 뜨고 애니메이션이 제대로 작동 안하는데 Debug 모드에서 Legacy에 체크를 해주면 제대로 작동된다.

[WrapMode] - 마지막 프레임 재생한 뒤의 동작 지정
Once: 애니메이션 종료
Loop: 첫 프레임으로 되돌아가 반복 재생
PingPong: 마지막 프레임에서 역방향으로 재생, 반복적으로 왕복하며 재생
Clamp Forever: 마지막 프레임의 상태를 남긴 채 애니메이션 종료

* Animation Event는 게임오브젝트에 설정되어 있는 스크립트의 함수를 실행할 수 있는 기능. 이를 이용, 움직임에 맞춰 소리를 내거나 다른 오브젝트와 연동한 동작이 쉽게 가능.