[Unity] 유니티 기초 및 C# 실무 코딩 팁 정리

정광훈(Unity_9기)·2026년 2월 23일

TIL (Today I Learned)

목록 보기
107/110

유니티로 게임을 개발하면서 자주 헷갈리거나 알아두면 매우 유용한 에디터 기초 지식과 C# 코딩 팁들을 정리해 보았습니다.


1. 코루틴에서 Input.GetKeyDown 연속 눌림(스킵) 방지

UI 연출 등에서 유저의 키 입력을 기다리기 위해 yield return new WaitUntil()을 연속으로 사용할 때, 키보드 입력이 2번 연속으로 처리되는 현상이 발생할 수 있습니다.

원인: Input.GetKeyDown은 해당 키가 눌린 그 1프레임 동안 계속 true 상태를 유지합니다.
컴퓨터의 연산이 너무 빠르기 때문에, 같은 프레임 안에서 두 개의 WaitUntil을 모두 뚫고 지나가 버리는 것입니다.

해결: 두 대기열 사이에 yield return null;을 넣어 강제로 1프레임을 쉬어주면
키 눌림 판정이 초기화되어 깔끔하게 해결됩니다.

private IEnumerator WaitForEnter() 
{
    yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Return)); // 첫 번째 대기

    yield return null; // 💡 핵심: 1프레임 대기하여 GetKeyDown 판정 초기화

    // 이제 아래 대기열은 다음번 진짜 엔터 입력을 정상적으로 기다립니다.
    yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Return)); // 두 번째 대기
}

2. 씬 뷰(Scene View)에서의 Local과 Global의 차이

유니티 에디터 상단 툴바를 보면 오브젝트의 이동 기즈모 축을
Local 또는 Global로 변경할 수 있는 버튼이 있습니다.
이 둘은 오브젝트를 이동시키거나 회전시킬 때 기준이 되는 '축'이 다릅니다.

  • Global (월드 좌표계): 게임 세상 전체의 절대적인 기준축입니다.
    오브젝트가 아무리 삐딱하게 회전해 있더라도,
    기즈모의 화살표는 항상 맵의 절대적인 위, 아래, 양옆(X, Y, Z)을 가리킵니다.
    • 언제 쓰나요? 오브젝트의 현재 회전 상태와 무관하게 무조건 맵의 동서남북이나
      수직/수평으로 반듯하게 이동시키고 싶을 때 사용합니다.
  • Local (지역 좌표계):
    오브젝트 자기 자신만의 기준축입니다.
    오브젝트를 회전시키면 기즈모의 축도 오브젝트가 바라보는 방향을 따라 함께 회전합니다.
    • 언제 쓰나요? 자동차나 캐릭터가 회전한 상태에서,
      그 오브젝트가 바라보고 있는 '앞' 방향으로 그대로 전진시키고 싶을 때 사용합니다.

3. 리스트의 마지막 요소 확인하기 (C# 문법)

if (DataManager.Instance.androidPartsList[DataManager.Instance.androidPartsList.Count - 1] == HeadString)

이 코드는 "리스트에 가장 마지막으로(최근에) 들어온 데이터가 'HeadString'과 일치하는가?"
묻는 조건문입니다.

  • 원리 설명: C#에서 리스트의 인덱스는 0부터 시작합니다.
    따라서 리스트 안에 데이터가 3개 들어있다면, 인덱스는 0, 1, 2가 됩니다.
  • 즉, 데이터의 총 개수(Count)에서 - 1을 한 값이 항상 리스트의 맨 마지막 요소의 인덱스가 됩니다. 아이템을 획득한 순서가 중요하거나, 방금 막 먹은 아이템이 무엇인지 판별할 때
    아주 유용하게 쓰이는 패턴입니다.

4. name vs gameObject.name 의 미묘한 차이

유니티 스크립트(MonoBehaviour를 상속받은 클래스) 안에서 현재 오브젝트의 이름을 가져올 때,
아래의 세 가지 코드는 완전히 똑같은 결과를 냅니다.

  1. this.name
  2. name (보통 this.는 생략이 가능해서 가장 많이 씁니다)
  3. gameObject.name

기능적으로는 완전히 같아서 "내가 누구든 상관없이, 지금 코드를 실행하고 있는
내 오브젝트의 이름을 가져와라"
라는 아주 훌륭하고 재사용성이 높은 코드입니다.
하지만 실무에서는 소속의 명확성을 위해 약간 구분해서 쓰는 경향이 있습니다.

  • this.name (또는 name): "이 스크립트 객체 자체의 이름"이라는 느낌이 강합니다.
  • gameObject.name: "이 스크립트가 컴포넌트로서 붙어 있는 껍데기(게임 오브젝트)의 이름"이라는 뜻을 코드를 읽는 사람에게 직관적으로 명시하고 싶을 때 씁니다.
    (협업 시 가독성을 높여주는 좋은 습관입니다!)

0개의 댓글