오늘의 학습 키워드
1. 캐릭터가 밤에 검정색으로 변하는 문제 해결기
2. 3인칭 캐릭터 회전을 자연스럽게 만드는 방법
증상
- 낮에는 잘 보이던 캐릭터가 밤만 되면 완전히 검정색으로 변함
- 조명, Emission, Gradient, Ambient Light 다 건드려도 해결 안 됨
디버깅 과정
1. 처음 의심한 ambient light
RenderSettings.ambientLight = Color.black;
2. 로그 찍어보기
var smr = GetComponentInChildren<SkinnedMeshRenderer>();
Debug.Log("현재 색상: " + smr.material.color);
콘솔 결과
현재 색상: RGBA(1.000, 0.950, 0.750, 1.000)
3. Emission 설정도 해봄
mat.EnableKeyword("_EMISSION");
mat.SetColor("_EmissionColor", Color.white * 2f);
여전히 어두움
결정적 원인 발견
Shader가 Unlit/Transparent 였음
Unlit Shader = 조명, 그림자, Emission 무시
★조명에 반응할 수 있는 Shader (UnityChan/Eye, Standard, URP/Lit)로 바꾸자마자 문제 해결! ★
해결 후 정리
항목적용 여부결과
ambientColor | 있음 | 밤에 어둡게 유지됨 (자연스러움) |
Directional Light | 작동 | 캐릭터가 조명에 반응 |
Emission 적용 | 작동 | 밤에도 흐릿하게 빛남 |
Shader 변경 | 성공 | 캐릭터가 밤에도 보임 |
요약
- 문제의 핵심은 Shader였음 (Unlit/Transparent)
- 조명 반응이 필요하다면 반드시 Lit, Standard, Toon 기반 Shader 사용
- 디버깅할 땐 꼭 Renderer.material.color, Shader.name, _EmissionColor 확인할 것
TIL 핵심 한 줄 요약
"Unity에서 어두운 밤에 캐릭터가 안 보일 땐 Shader부터 의심하자."
목표
플레이어가 카메라의 방향을 따라 자연스럽게 회전하게 만들기
(ALT F4, Only UP! 같은 느낌)
문제 상황
- 마우스로 카메라를 회전시키면 카메라는 잘 움직임
- 하지만 캐릭터가 바로 돌아서 뒤통수밖에안보임
초기 구조
- Player 오브젝트 안에 CameraContainer가 자식으로 있음
- 카메라는 PlayerController에서 직접 돌림 (transform.eulerAngles += ...)
- 캐릭터와 카메라가 항상 동시에 회전
발생한 문제들
회전이 너무 직접적임 | 시점이 확확 움직여서 부자연스러움 |
캐릭터 모델만 회전 안 됨 | 애니메이션 방향과 실제 방향이 안 맞음 |
마우스 회전이 느리거나 끊김 | Rigidbody와 Transform 회전 충돌 가능 |
디버깅 과정
- CameraContainer가 회전하면서 Player도 같이 회전시킴
- 캐릭터의 모델과 움직임 방향이 불일치
→ 회전이 일치하지 않아 시점과 움직임이 분리 - LookDir을 Debug.Log로 찍어보니,
카메라가 바라보는 방향과 캐릭터가 보는 방향이 안 맞음
Debug.DrawRay(transform.position, lookDir, Color.red);
Debug.Log("LookDir: " + lookDir);
해결 전략
핵심은 카메라는 자유롭게 회전,
플레이어는 카메라의 수평 방향만 천천히 따라감
최종 구조
카메라 (ThirdPersonCamera.cs)
public class ThirdPersonCamera : MonoBehaviour
{
public Transform target;
public Vector2 sensitivity = new Vector2(3f, 1.5f);
public float distance = 4f;
public float height = 2f;
public float minX = -60f;
public float maxX = 75f;
private Vector2 currentRotation;
void LateUpdate()
{
Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
currentRotation.x += mouseDelta.x * sensitivity.x;
currentRotation.y -= mouseDelta.y * sensitivity.y;
currentRotation.y = Mathf.Clamp(currentRotation.y, minX, maxX);
Quaternion rotation = Quaternion.Euler(currentRotation.y, currentRotation.x, 0);
Vector3 cameraPos = target.position - rotation * Vector3.forward * distance + Vector3.up * height;
transform.position = cameraPos;
transform.LookAt(target.position + Vector3.up * 1.5f);
}
}
플레이어 회전 (PlayerRotation.cs)
public class PlayerRotation : MonoBehaviour
{
public Transform cameraTransform;
void Update()
{
Vector3 lookDir = cameraTransform.forward;
lookDir.y = 0f;
if (lookDir.sqrMagnitude > 0.01f)
{
transform.rotation = Quaternion.Slerp(
transform.rotation,
Quaternion.LookRotation(lookDir),
Time.deltaTime * 10f
);
}
}
}
최종 결과
회전이 뚝뚝 끊김 | 부드럽게 돌아감 |
시점 따라 즉시 회전 | 딜레이 있는 자연스러운 회전 |
모델 방향 불일치 | 애니메이션 방향과 일치 |
TIL 핵심 요약
"카메라와 캐릭터 회전을 분리해서
카메라는 자유롭게, 캐릭터는 수평 방향만 부드럽게 따라가게 하자."
해결하면서 느낀 점
이번 문제를 해결하면서 새삼 느낀 건,
게임 속 자연스러운 회전, 그림자, 색 변화 같은 “사소한” 연출들조차도
하나하나 다 깊은 고민과 구조적인 설계가 들어간 결과라는 점이다.
카메라 하나, 쉐이더 하나, 색상 하나에도
“왜 이 방향으로 회전하지?”, “왜 밤에 어두워 보이지 않지?”
같은 수많은 시행착오와 의도된 결정이 숨어 있었다.
지금껏 해왔던 게임들이
단순히 예쁘고 편한 게 아니라,
엄청난 세심함의 결과물이었다는 걸 체감하게 되었다.