본문으로 건너뛰기
Unity C# 기초집LESSON 05

C#과 Inspector 연결

난이도초급
예상 시간35분
선수지식4강 PackageMover

5강. C#과 Inspector 연결

1. 이번 강의에서 해결할 문제​

속도를 바꾸려고 코드 파일을 수정하고, SpriteRenderer를 매번 검색합니다. 필요한 값과 참조는 Inspector에서 연결하되 null 상태를 조용히 방치하지 않게 만듭니다.

2. 학습 목표​

3. 핵심 개념​

[SerializeField] private는 다른 클래스가 값을 마음대로 변경하지 못하게 하면서 Inspector 직렬화와 편집을 허용합니다. 참조는 이름 검색보다 Inspector에서 명시적으로 연결하면 의존 관계가 눈에 보입니다.

용어 정리​

용어뜻이번 예제
직렬화값을 Scene·Prefab 에셋에 저장했다가 다시 복원하는 과정fallSpeed와 packageRenderer 연결을 저장합니다.
참조다른 객체나 Component를 가리키는 값Package Mover가 같은 오브젝트의 Sprite Renderer를 가리킵니다.
null참조가 아무 대상도 가리키지 않는 상태Inspector 슬롯이 None일 때입니다.
Awake직렬화된 값이 로드된 뒤 초기 설정을 검사하는 Unity 메시지첫 Update 전에 필수 참조를 검증합니다.
캡슐화필드의 변경 통로를 제한하고 클래스가 규칙을 지키게 하는 설계색 변경은 SetColor 메서드를 통해 수행합니다.

public 필드는 Inspector에 보이지만 어느 코드에서든 값을 바꿀 수 있어 잘못된 속도나 참조가 들어갈 통로가 많아집니다. [SerializeField] private는 디자이너가 Inspector에서 조정할 수 있으면서, 다른 C# 클래스에는 직접 변경을 허용하지 않습니다. 단, private라고 해서 Inspector 값이 자동으로 안전해지는 것은 아니므로 범위와 필수 참조를 검증해야 합니다.

4. 단계별 실습​

C# · 파일 경로: Assets/DeliverySorter/Scripts/Packages/PackageMover.cs

PackageMover.cs
using UnityEngine;

public sealed class PackageMover : MonoBehaviour
{
[SerializeField, Min(0f)] private float fallSpeed = 2f;
[SerializeField] private SpriteRenderer packageRenderer;

private void Awake()
{
if (packageRenderer == null)
{
Debug.LogError("Package Renderer is not assigned.", this);
enabled = false;
}
}

private void Update()
{
transform.position += Vector3.down * fallSpeed * Time.deltaTime;
}

public void SetColor(Color color)
{
packageRenderer.color = color;
}
}

코드 한 줄씩 이해하기​

  1. [SerializeField, Min(0f)]는 private fallSpeed를 Inspector에 저장하고 음수 입력을 UI에서 제한합니다. Min은 편집 편의를 위한 제한이므로 외부 데이터까지 완전히 검증하는 보안 장치는 아닙니다.
  2. packageRenderer는 Sprite Renderer Component를 가리킬 슬롯입니다. 선언만으로 자동 연결되지 않습니다.
  3. Unity가 Scene 값을 복원한 뒤 Awake를 호출하므로 첫 사용 전에 null을 확인할 수 있습니다.
  4. 연결이 없으면 Debug.LogError(..., this)로 어떤 GameObject의 설정인지 남기고 enabled = false로 이동만 중지합니다.
  5. 연결이 유효할 때 SetColor는 Renderer의 color를 바꿉니다. 호출자는 Renderer 필드 자체를 교체할 수 없습니다.

Inspector에 값을 연결하면 Scene 또는 Prefab에는 “Component의 복사본”이 아니라 해당 객체를 가리키는 직렬화된 참조가 저장됩니다. 참조 대상 Component를 삭제하면 슬롯이 Missing 상태가 될 수 있으므로 None뿐 아니라 삭제 후 오류도 확인해야 합니다.

Inspector 연결 작업​

  1. Hierarchy에서 PackagePrototype을 선택합니다.
  2. Package Mover의 Fall Speed를 2로 둡니다.
  3. 같은 Inspector의 Sprite Renderer Component 제목을 Package Renderer 슬롯으로 끌어 놓습니다. Hierarchy의 GameObject를 끌어 놓아도 Unity가 호환 Component를 찾을 수 있지만, 입문 단계에서는 어느 Component를 연결하는지 직접 확인합니다.
  4. Play해서 택배가 내려가는지 확인합니다. Console에 오류가 없어야 합니다.
  5. 정지한 다음 슬롯 오른쪽의 원형 선택 버튼으로 연결 대상을 확인합니다.

5. 코드가 동작하는 이유​

Unity는 Scene 또는 Prefab에 직렬화된 필드 값을 저장하고 로드한 뒤 생명주기 메시지를 호출합니다. Awake에서 필수 참조를 검사하면 첫 사용 시점의 모호한 NullReferenceException 대신 설정 오류를 즉시 보여 줍니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

실습 목표​

Inspector 값과 Component 참조를 저장하고, 올바른 연결과 누락된 연결이 실행 결과를 어떻게 바꾸는지 비교합니다.

시작 전 상태​

PackagePrototype에 Package Mover와 Sprite Renderer가 각각 하나씩 있고, Package Renderer 슬롯이 같은 오브젝트의 Sprite Renderer를 가리키는지 확인합니다.

1단계: 가장 작은 변경​

Fall Speed를 0, 2, 8로 바꿔 각각 Play합니다. 0에서는 멈추고, 8에서는 2보다 네 배 빠르게 내려가야 합니다. Play Mode 중 바꾼 값은 정지 후 원래 값으로 돌아갈 수 있으므로 비교할 값은 표로 기록합니다.

2단계: 참조를 비우고 결과 비교​

정지 상태에서 Package Renderer 슬롯을 None으로 만들고 Play합니다. Console에 Package Renderer is not assigned.가 한 번 표시되고 Package Mover가 비활성화되어야 합니다. 오류 항목을 클릭하면 해당 PackagePrototype이 선택되는지 확인한 뒤 참조를 다시 연결합니다.

3단계: 직접 적용​

Transform stopPoint 필드를 [SerializeField] private로 추가하고, Scene에 빈 GameObject StopPoint를 만든 뒤 Inspector로 연결하세요. Awake에서 이 참조도 검사합니다. 완성 코드를 복사하기 전에 다음 기준으로 직접 작성합니다.

4단계: 스스로 확인​

Prefab Mode에서 PackagePrototype Prefab을 열 수 있다면 기본 연결이 Prefab Asset에 저장됐는지 확인합니다. Scene 인스턴스에만 연결했다면 새로 만든 인스턴스에서는 슬롯이 비어 있을 수 있습니다. Prefab이 아직 없다면 이 차이는 9강에서 다시 확인합니다.

막혔을 때​

증상원인해결
슬롯이 Inspector에 나타나지 않음[SerializeField] 누락, 컴파일 오류, 지원하지 않는 필드 형태Console 오류를 먼저 해결하고 필드가 클래스 안에 선언됐는지 확인합니다.
드래그해도 슬롯에 들어가지 않음타입이 맞지 않는 객체를 드래그함슬롯 타입과 대상 Component 타입을 비교합니다.
슬롯에 Missing 표시연결한 Component 또는 오브젝트가 삭제됨Missing 참조를 지우고 현재 유효한 Component를 다시 연결합니다.
null 오류가 Update에서 계속 반복Awake 검증 뒤 실행을 중지하지 않음오류를 한 번 기록하고 enabled = false로 후속 사용을 막습니다.

8. 이해 점검 질문 3개​

9. 핵심 요약​

다음 강의 연결​

다음 강의에서는 Inspector로 연결한 값을 이용해 Transform과 Vector 방향을 계산하고, Local 좌표와 World 좌표의 차이를 움직임으로 확인합니다.

MINI QUIZ

C#과 Inspector 연결 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1다음 중 “C#과 Inspector 연결”의 핵심 요약을 실제 상황에 맞게 적용한 것은 무엇인가요?
  2. 문제 2‘GameObject.Find를 Update에서 반복’ 상태에 관한 “C#과 Inspector 연결” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

5강. C#과 Inspector 연결 미완료 상태