8일차 요약(캐릭터 애니메이션, Light, UI)
캐릭터 애니메이션
- 캐릭터 애니메이션을 직접 만든다면 pivot위치에 주의해야 한다.
- pivot을 설정할 때는 자식으로 pivot을 추가한 뒤, 위치를 조정하고 부모-자식 관계를 뒤집는 게 편리하다.
- Loop Animation이라면 시작과 끝에서 걸리는 보간을 유의하여 제작해야 한다.
Light
- RealTime: Directional Light, Point Light, Spot Light
- Baked: Area Light
- Skybox는 환경광(주변광)의 역할을 한다.
UI
- Unity에 UI를 출력하기 위해서는 Canvas라는 것이 꼭 필요하다.
- Canvas는 UI를 붙이는 Panel역할을 한다고 생각하면 된다.
- RectTransform을 이용할 때, Alt를 누른 채로 클릭하면 UI에 바로 적용된다.
- 만약, UI에서 한글이 깨진다면 한글을 지원하는 Font Asset을 만들어서 적용해야 한다.
- code를 추가하여 다른 언어도 지원할 수 있다. (FontAsset을 만드는 시간이 조금 소요된다.)
캐릭터 애니메이션
걸을 때 다리가 움직이는 애니메이션을 만들어 보자.
우선, 다리의 기준점(pivot)이 도형의 중앙에 있을 것이다.
이 상태에서 다리의 회전을 걸면 중앙을 기준으로 회전하기 때문에 도형의 윗부분이 몸 밖으로 삐져나올 수 있다.
따라서, pivot을 이동시켜 줘야 한다.
부모를 만들어 원하는 위치로 이동시킨 뒤 다리를 자식으로 추가하면 된다.
하지만 pivot을 바로 만들면 위치 설정이 쉽지 않으므로 다리에서 자식을 만들고 부모를 기준으로 위치를 이동시키면 된다.
(local좌표 기준 이동)
이후, 부모-자식 관계를 뒤집으면 된다.
pivot을 설정했다면 pivot을 회전시켜 Animation을 만들면 된다.
이제 Animator에서 어떤 State를 실행할지 설정해 주면 된다.
bMove가 true라면 Walk Animation이 실행되도록 설정했다.
이제 Script에서 이동키가 눌린다면 해당 변수를 true로 변경해 주고 그렇지 않다면 false로 변경해 주면 된다.
private void Move()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v);
float magnitude = Mathf.Clamp(dir.magnitude, 0f, 1f);
dir.Normalize();
transform.position += dir * movementSpeed * Time.deltaTime * magnitude;
if (h != 0 || v != 0)
{
transform.LookAt(transform.position + dir);
animator.SetBool("bMove", true);
}
else
{
animator.SetBool("bMove", false);
}
}
현재 State가 변화되는 시점이 실행 중인 Animtion을 모두 실행한 후 다음 State로 넘어간다.
그렇기 때문에 입력에 대해 바로 수행되지 않는 것처럼 보인다.
이를 수정하기 위해서는 Transition의 ExitTime을 수정해 주면 된다.
이를 사용하지 않도록 수정하면 된다.
또한, Transition Duration을 0으로 수정하면 된다.
Transition Duration이란 다음 State로 넘어가기 위한 보간을 진행하는 시간이다.
마지막으로 걷는 Animation을 프레임에 맞게 잘 설정하였지만 Loop을 통해 끝 부분에서 다시 시작되는 부분에서 약간의 버벅거림이 있다.
두 개의 Animation(Walk1 → Walk2)가 실행될 때, Blend 되기 때문에 Animtion 실행시간이 변화되는 것이다.
애니메이션의 그래프를 보면 이해할 수 있다.
그래프의 커브가 완만하게 시작하고 종료되는 것을 확인할 수 있다.
이를 위와 같이 수정하면 더욱 자연스러운 Animtion을 만들 수 있다.
Light
- Directional Light
- 직선의 모든 범위에 영향을 미치는 조명
- 태양과 동일하다고 생각하면 된다.
- Point Light
- 특정한 위치에서 발광하는 조명
- 전구와 동일하다고 생각하면 된다.
- Spot Light
- 원뿔 모양의 조명
- 손전등, 무대 조명 등과 동일하다고 생각하면 된다.
- Area Light
- 사각형 혹은 타원 모양의 조명
- 간판과 동일하다고 생각하면 된다.
- Baked Light로 미리 설정해서 사용하는 것이다.
Light에 대한 Stencil을 적용하는 방법은 다음과 같다.
Light Component에는 Cookie라는 Param이 존재하는데 이에 Cookie 타입의 Texture를 넣으면 다음과 같이 적용할 수 있다.
Skybox
배경을 표현하는 Asset이다.
Skybox를 표현하는 방법은 총 세 가지이다.
- CubeMap
- 6Side
- Panorama
Skybox를 설정하는 방법은 적용하고 싶은 Asset을 Drag 해 배경에 넣어도 되고 다음과 같이 설정해도 된다.
Skybox는 앞서 말한 Light Component와 더불어 빛에 대한 설정을 할 수 있다.
Skybox는 환경광이라 하며 광원이 직접적으로 보이진 않지만 Scene에 빛을 추가할 수 있다.
UI
UI 종류
- Overlay
- Screen Space에 붙는 UI
- Camera
- World Space에 3D로 보이는 UI
Canvas
UI를 만들기 위해서는 Canvas를 만들어야 한다.
Canvas에 UI를 추가하여 화면에 Render 한다고 생각하면 된다.
- Canvas Scaler
Canvas의 스케일을 조정하는 방법이다.
해상도에 맞춰 UI를 어떻게 늘리거나 줄일지에 대한 설정을 하는 것이다.
Rect Transform
Anchor를 설정하여 UI의 크기나 위치를 조정하는 툴이다.
Anchor가 어떻게 설정되었느냐에 따라 오른쪽에 나오는 param의 이름이 변하는 것을 확인할 수 있다.
그냥 클릭하면 Anchor만 조정하지만 Alt를 누른 채로 누르면 UI도 해당 Anchor를 기준으로 채워준다.
TMP vs Text
Text는 Legacy Component인데 랜더링 품질이 좋지 않거나 문제가 있어 TMP(Text Mesh Pro)라는 신버전 Text Component를 지원한다.
하지만, Text는 한글이 제대로 출력되지만 TMP는 깨져서 나온다.
품질이나 기능지원 때문에 TMP를 사용하는 것을 권장한다.
한글이 깨지는 것을 해결하는 방법은 Font Asset을 생성하는 것이다.
LiberationSans SDF 적용 | BMJUA_ttf SDF 적용(한글 지원 font) |
추가적으로 다른 나라의 언어를 지원하는 경우에는 Font Asset Creator를 사용하면 된다.
- 32-126 : 영어
- 44032-55203 : 한글의 범위
- 12593-12643 : 한글 자모음
- 8200-9900 : 특수문자
Sequence에 추가하여 Font Asset을 추가할 수 있다.