📕학습 개요

유니티 캠프 17일차.

이번 주 부터 다시 유니티 프로젝트를 시작한다. 지난 2주간 까마득한 콘솔 창만 바라보다가 다시 유니티를 만지게 되어 솔직히 조금 설래는 심정이다.

오늘은 유니티 강의를 들으며 배운 내용을 정리해보았다.

📖학습 내용

Lerp() - 선형보간

선형보간이란? a, b 값이 주어졌을 때 그 사아이 위치한 값을 추정하기 위해 직선 거리에 따라 선형적으로 계산하는 방법이다.

유니티에서 선형보간 함수를 사용할 때 매개변수는 다음과 같다.

  1. a : 시작 값
  2. b : 끝 값
  3. t : 보간 값(0 ~ 1)

공식

Lerp(a,b,t) = a + (b-a) * t

유니티에서는 다양한 방식으로 선형 보간을 활용할 수 있다.

Lerp 의 다양한 활용법

부드러운 움직임

오브젝트가 이동할 때, 부드러운 움직임을 위해 두 점 사이의 구간을 지속적으로 이동시키는 방법이 있다.

void Update()
{
	a = Mathf.Lerp(a, b, 0.5f);
}

t 에 특정한 상수가 아닌 Time.deltaTime을 이용하여 정확한 이동 변화량을 계산하는 방법도 존재한다.

아래 코드는 t가 증가함에 따라 a 에서 b로 부드럽게 이동하도록 만든 예시이다.

IEnumerator MoveRoutine(Transform transform, Vector2 target)
{
    Vector2 start = transform.position;
    Vector2 row = new Vector2(start.x, target.y);
    float elapsed = 0f;
    while (elapsed < 1.0f)  //카드를 세로로 펼치기
    {
        transform.position = Vector3.Lerp(start, row, elapsed / 1.0f);
        elapsed += Time.deltaTime;
        yield return null;
    }
    elapsed = 0f;
    while (elapsed < 1.0f)  //카드를 가로로 펼치기
    {
        transform.position = Vector3.Lerp(row, target, elapsed / 1.0f);
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.position = target; // 최종 위치 보정
}

스케일 조정

transform.localScale = Vector3.Lerp(
    transform.localScale, new Vector3(2, 2, 2), Time.deltaTime * 3f);

회전

transform.rotation = Quaternion.Lerp(
    transform.rotation, targetRotation, Time.deltaTime * 2f);

색상 변경

Color applyColor = Color.Lerp(
    prevColor, nextColor, (stackCount % 11) / 10f);

여태 Lerp를 오브젝트 이동시킬 때나 사용했는데, 그 외에도 다양한 값을 부드럽게 변화시키는 데 사용 가능한지 몰랐다. 특히 색상 변경에도 Lerp가 사용할 수 있다는 점이 신기했다.

주의할 점

  • t값은 보통 0~1 사이로 사용되며, 1을 넘으면 보간을 넘어가는 값이 된다.
  • Lerp는 무한히 가까워질 뿐 정확히 도달하지는 않기 때문에, 일정 거리 이하로 가까워지면 값을 고정하는 로직을 사용해주는 것이 좋다.

전처리기 지시문(Preprocessor directive)

전처리기 지시문이란? #if 처럼 # 을 붙혀서 사용되며, 컴파일 타임에 코드의 일부를 조건적으로 포함하거나 제외할 수 잇게 해주는 기능이다. 일반적인 조건문과 달리 런타임이 아닌 컴파일 시점에 작동한다.

  • 전처리기 조건문 키워드 모음
    • #if
    • #elif
    • #else
    • #endif
    • #define
    • #if UNITY_EDITOR - 에디터 환경에서만 실행
    • #if UNITY_ANDROID, UNITY_IOS 등 - 플랫폼별 조건
    • #if DEBUG - 디버그 빌드 전용 코드
    • #if DEVELOPMENT_BUILD - 개발용 빌드 시 작동
    public void OnClickExit()   //게임 종료 버튼 클릭
    {
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#else
        Application.Quit();
#endif
    }

위 코드와 같이 게임 종료 버튼을 눌렀을 때, 에디터 환경에서 실행중인 경우와 실제 게임을 빌드하는 경우를 구분할 수 있어 게임 테스트 시 매우 유용하게 사용할 수 있다.

주의할 점

  • #if 는 일반적인 조건문과 다르게 변수 조건을 사용할 수 없다. 오직 정의된 심볼만 사용할 수 있다.
  • #if 블록 내에 컴파일 오류가 나면, 해당 조건이 false일 경우에도 오류가 발생할 수 있으니 주의해야 한다.

🏁오늘 배운 핵심 내용 정리

  • Lerp 메서드를 통해 이동 뿐만 아니라 크기, 스케일, 색상 등 다양한 요소의 부드러운 변화를 연출할 수 있다.
  • 전처리기 지시문을 통해 코드의 일부를 조건적으로 포함하거나 제외시킬 수 있다.

댓글남기기