< 절대 강좌 유니티 5 > 위키북스, 이재현 지음
1. 이동
Tramsform.Translate( 이동방향 * 속도 * 변위 값 * Time.deltaTime, 기준좌표 )
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
moveDir = Vector3.forward * v + Vector3.right * h;
transform.Translate( moveDir.normalized * moveSpeed * Time.deltaTime , Space.Self );
Translate에서 moveDir은 moveDir.normalized로 넣어주어야 대각선 움직임 시 빨라지는 현상이 없어진다.
2. 회전
Tansform.Rotate( 회전할 기준좌표축 * Time.deltaTime * 회전속도 * 변위 입력 값 )
r = Input.GetAxis("Mouse X");
transform.Rotate( Vector3.up * Time.deltaTime * rotSpeed * r );
3. 카메라
1. 주인공 캐릭터 오브젝트의 차일드화하기
2. Utility의 SmoothFollow.cs 임포트해서 사용하기
3. 직접 스크립트 짜기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class FollowCam : MonoBehaviour { public Transform target; // 추적할 대상 public float moveDamping = 15.0f; // 이동 속도 계수 public float rotateDamping = 10.0f; // 회전속도 계수 public float distance = 5.0f; // 추적 대상과의 거리 public float height = 4.0f; // 추적 대상과의 높이 public float targetOffset = 2.0f; // 추적 좌표의 오프셋 // CameraRig의 Transform 컴포넌트 private Transform tr; void Start() { tr = GetComponent<Transform>(); } // 플레이어의 움직임이 Update()에서 일어나므로, 움직임이 끝난 후에 카메라 이동 시작 void LateUpdate() { // 카메라의 높이와 거리를 계산 var camPos = target.position - (target.forward * distance) + (target.up * height); // 이동할 때의 속도 계수를 적용 tr.position = Vector3.Slerp(tr.position, camPos, Time.deltaTime * moveDamping); // 회전할 때의 속도 계수를 적용 tr.rotation = Quaternion.Slerp(tr.rotation, target.rotation, Time.deltaTime * rotateDamping); // 카메라를 추적 대상으로 Z축을 회전시킴 tr.LookAt(target.position + (target.up * targetOffset)); } void OnDrawGizmos() { Gizmos.color = Color.green; // 추적 및 시야를 맞출 위치를 표시 Gizmos.DrawWireSphere(target.position + (target.up * targetOffset), 0.1f); // 메인 카메라와 추적 지점 간의 선을 표시 Gizmos.DrawLine(target.position + (target.up * targetOffset), transform.position); } } | cs |
* transform.LookAt()은 인자로 지정된 게임오브젝트의 위치로 바라보게 하는 역할을 한다.
카메라가 캐릭터의 머리 방향을 가리킬 수 있도록 target.up * targetOffset을 target.position에 + 해준다.
4. 레거시 애니메이션
레거시 애니메이션 : 3D Animation Tool에서 제작한 애니메이션
Animation 컴포넌트
메카님 에니메이션 : 모션 캡처 애니메이션, 리타깃팅을 이용해 기존 애니메이션을 재활용할 수 있다.
Animator 컴포넌트
* 유니티에서는 레거시 애니메이션은 하위 호환성을 고려한 유형이며 메카님 애니메이션을 사용하길 권장한다.
그러나 빠른 속도로 인해 아직 레거시 애니메이션이 많이 사용되고 있다.
cf ) Animation Type
1. None : 애니메이션을 사용하지 않음
2. Legacy : 하위 호환성을 유지하기 위한 이전 방식의 애니메이션
3. Generic : 메카님 애니메이션 / 인체형 모델이 아닌 3D 모델에 적용. 리타깃팅할 수 없다.
4. Humanoid : 메카님 애니메이션 / 리타깃팅이 가능하며, 사람과 같이 2족 보행하는 모델에 적용
- 주인공 캐릭터 프리팹을 누르고 Rig 탭의 Animation Type 속성을 Legacy로 변경
- 하나의 애니메이션 파일에 여러 애니메이션 클립이 분리되지 않은 상태라면 직접 분리해주어야 한다.
- 애니메이션 클립을 반복 동작하기 위해서는 클립의 Warp Mode 속성을 Loop로 바꾸어주면 된다.
- 하이어라키 뷰의 주인공 오브젝트를 클릭한 후 Animation 컴포넌트의 Animations에 애니메이션 클립들을 넣어준다.
- Play Automatically는 실행했을 때 기본 애니메이션 클립을 자동으로 실행하는 옵션이다.
- 플레이어의 동작을 담당하는 스크립트에 애니메이션을 실행하는 코드들을 추가해준다.
여러 클립이 사용되므로, 클립들을 모아둔 class를 하나 만들고 [System.Serializable]을 하여 클립들을 추가해주는 것이 좋다.
animation.Clip에 클립을 지정해준 뒤, animation.Play() 를 통해 애니메이션을 동작할 수 있다.
* 애니메이션 블렌딩
현재 수행 중인 애니메이션에서 다른 애니메이션으로 변경될 때 부드럽게 연결해주는 기능
애니메이션의 전환이 급격하게 이루어지지 않고 자연스럽게 해주는 것이 CrossFade 블렌딩 함수이다.
animation.CrossFade( 애니메이션 클립 명칭, 페이드아웃되는 시간 );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | if(v >= 0.1f) { anim.CrossFade(playerAnim.runF.name, 0.3f); } else if (v <= -0.1f) { anim.CrossFade(playerAnim.runB.name, 0.3f); } else if (h >= 0.1f) { anim.CrossFade(playerAnim.runR.name, 0.3f); } else if (h <= -0.1f) { anim.CrossFade(playerAnim.runL.name, 0.3f); } else { anim.CrossFade(playerAnim.idle.name, 0.3f); } | cs |
5. Level Of Detail ( LOD )
화면을 렌더링하는 카메라로부터 멀리 떨어질수록 낮은 폴리곤으로 변경해서 렌더링 부하를 줄여주는 기법
폴리곤은 그림을 그리는 기본적인 단위로, 많을수록 보다 현실적인 모습이 나타난다. 폴리곤이 많다는 것은 그만큼 처리량이 많다는 것이다.
따라서 폴리곤이 적다는 것은, 보다 렌더링의 부하가 적어지는 것이다.
캐릭터가 제작될 때 단계별로의 폴리곤이 캐릭터 프리팹의 하위항목으로 존재한다.
캐릭터에 LOD Group 컴포넌트를 추가해주면 기본적으로 4단계로 되어 있는데, 각 단계의 범위를 조절하거나 단계를 추가 및 삭제가 가능하다.
Culled는 완전히 보이지 않게되는 단계이다.
주인공 캐릭터에는 항상 카메라가 붙어다니므로 붙여줄 필요가 없지만, 만약 멀티플레이라면 이러한 컴포넌트가 필요하다.
6. 그림자
3D 오브젝트 중 Quad 모델을 캐릭터의 차일드로 두어 캐릭터의 그림자를 구현할 수 있다.
Quad 모델에 그림자 텍스처를 넣고 Shader의 옵션을 Mobile/Particles/Multiply로 변경해주면 자연스러운 그림자 효과가 표현된다.
단, 위와 같은 평면 그림자의 경우 부하가 적은 방식이지만, 굴곡이나 경사로가 있다면 그림자가 다른 메쉬에 묻혀 제대로 표현되지 않는다.
( 굴곡 등에 적용되는그림자가 무엇인지 조사하기 )
'Unity 공부시작' 카테고리의 다른 글
유니티 :: AddForce와 AddRelativeForce (0) | 2019.01.31 |
---|---|
유니티 :: Physics Manager, Rigidbody, Collider (0) | 2019.01.31 |
유니티 :: Rotate 함수 (0) | 2019.01.29 |
유니티 :: GetAxis와 GetAxisRaw (1) | 2019.01.29 |
유니티 :: 하늘 표현 방식 (0) | 2019.01.29 |