카테고리 없음

2025.05.21 7주차 수요일

mochoa 2025. 5. 21. 19:47

오늘의 학습 키워드

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 회전 충돌 가능

디버깅 과정

  1. CameraContainer가 회전하면서 Player도 같이 회전시킴
  2. 캐릭터의 모델과 움직임 방향이 불일치
    회전이 일치하지 않아 시점과 움직임이 분리
  3. 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 핵심 요약

"카메라와 캐릭터 회전을 분리해서

카메라는 자유롭게, 캐릭터는 수평 방향만 부드럽게 따라가게 하자."

 

해결하면서 느낀 점

이번 문제를 해결하면서 새삼 느낀 건,
게임 속 자연스러운 회전, 그림자, 색 변화 같은 “사소한” 연출들조차도
하나하나 다 깊은 고민과 구조적인 설계가 들어간 결과라는 점이다.

카메라 하나, 쉐이더 하나, 색상 하나에도
“왜 이 방향으로 회전하지?”, “왜 밤에 어두워 보이지 않지?”
같은 수많은 시행착오와 의도된 결정이 숨어 있었다.

지금껏 해왔던 게임들이
단순히 예쁘고 편한 게 아니라,
엄청난 세심함의 결과물이었다는 걸 체감하게 되었다.