유니티로 게임을 개발하면서 자주 헷갈리거나 알아두면 매우 유용한 에디터 기초 지식과 C# 코딩 팁들을 정리해 보았습니다.
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)); // 두 번째 대기
}
유니티 에디터 상단 툴바를 보면 오브젝트의 이동 기즈모 축을
Local 또는 Global로 변경할 수 있는 버튼이 있습니다.
이 둘은 오브젝트를 이동시키거나 회전시킬 때 기준이 되는 '축'이 다릅니다.
if (DataManager.Instance.androidPartsList[DataManager.Instance.androidPartsList.Count - 1] == HeadString)
이 코드는 "리스트에 가장 마지막으로(최근에) 들어온 데이터가 'HeadString'과 일치하는가?"를
묻는 조건문입니다.
0부터 시작합니다.0, 1, 2가 됩니다. Count)에서 - 1을 한 값이 항상 리스트의 맨 마지막 요소의 인덱스가 됩니다. 아이템을 획득한 순서가 중요하거나, 방금 막 먹은 아이템이 무엇인지 판별할 때name vs gameObject.name 의 미묘한 차이유니티 스크립트(MonoBehaviour를 상속받은 클래스) 안에서 현재 오브젝트의 이름을 가져올 때,
아래의 세 가지 코드는 완전히 똑같은 결과를 냅니다.
this.namename (보통 this.는 생략이 가능해서 가장 많이 씁니다)gameObject.name 기능적으로는 완전히 같아서 "내가 누구든 상관없이, 지금 코드를 실행하고 있는
내 오브젝트의 이름을 가져와라"라는 아주 훌륭하고 재사용성이 높은 코드입니다.
하지만 실무에서는 소속의 명확성을 위해 약간 구분해서 쓰는 경향이 있습니다.
this.name (또는 name): "이 스크립트 객체 자체의 이름"이라는 느낌이 강합니다.gameObject.name: "이 스크립트가 컴포넌트로서 붙어 있는 껍데기(게임 오브젝트)의 이름"이라는 뜻을 코드를 읽는 사람에게 직관적으로 명시하고 싶을 때 씁니다.