1. Unity의 라이프 사이클 (Life Cycle)
Unity에서 MonoBehaviour 기반 스크립트는 특정 순서로 호출되는 메서드들을 통해 작동합니다.
이 흐름을 라이프 사이클이라고 부릅니다
기본흐름
[객체 생성 시]
→ Awake() → OnEnable() → Start()
[게임 루프]
→ Update() → LateUpdate() (매 프레임)
→ FixedUpdate() (물리 연산 주기)
[비활성화 / 제거 시]
→ OnDisable() → OnDestroy()
메서드 호출 시점 특징 및 용도
| Awake() | 오브젝트가 씬에 로드될 때 1회 | 가장 먼저 실행됨. 다른 컴포넌트 참조 가능 |
| OnEnable() | 오브젝트가 활성화될 때마다 | 이벤트 구독 등 추천 |
| Start() | 첫 프레임 전에 1회 | 대부분의 초기화 여기에 작성 |
| Update() | 매 프레임 호출 | 키 입력, 이동 등 일반 로직 |
| FixedUpdate() | 일정 시간마다 호출 (0.02초 기본) | 물리 연산 (리짓바디 이동 등) |
| LateUpdate() | Update 끝난 뒤 호출 | 카메라 따라가기 등 |
| OnDisable() | 비활성화 시 | 이벤트 구독 해제, 리소스 정리 |
| OnDestroy() | 객체 삭제 시 | 메모리 해제, 최종 정리 |
2. 배열 vs 리스트 (Array vs List)
배열
고정된 크기의 데이터 집합
컴파일시 크기를 알 수 있어 메모리 효율이 높고 빠르다
int[] scores = new int[3]; // 크기 3 고정
scores[0] = 10;
크기 변경이 불가 하고 Add(), Remove() 같은 메서드가 없다.
리스트
크기가 자동으로 조절되는 제네릭 컬렉션
using System.Collections.Generic 필요
메서드가 풍부하고 다루기 쉬움
List<string> items = new List<string>();
items.Add("포션");
items.Remove("포션");
요소 추가 삭제가 쉽다
반복문, 조건 검색, 정렬 등 다양한 기능을 제공한다.
항목 배열 (T[]) 리스트 (List<T>)
| 크기 변경 | ❌ 불가능 | ✅ 가능 (Add, Remove) |
| 성능 | ✅ 빠름 (고정 크기) | 약간 느림 (동적 메모리 할당) |
| 선언 방식 | int[] arr = new int[3]; | List<int> list = new List<int>(); |
| 유니티 Inspector 노출 | ✅ 가능 ([SerializeField]) | ✅ 가능 (List<T> 지원됨) |
| 반복문 사용 | ✅ for, foreach | ✅ 동일하게 가능 |
3. 프로퍼티(Property)
프로퍼티는 필드(변수)에 접근하기 위한 ‘읽기/쓰기 함수’를 변수처럼 보이게 만든 문법입니다.
C#에서는 필드에 바로 접근하면 보안성 / 캡슐화 문제가 생기므로
필드는 private, 프로퍼티로 제한된 공개를 합니다.
public class Player
{
private int hp;
public int HP
{
get { return hp; }
set
{
// 값을 안전하게 제한
hp = Mathf.Clamp(value, 0, 100);
}
}
}
자동 프로퍼티
public string Name { get; set; } // 내부 필드 자동 생성됨
읽기/쓰기 둘 다 가능
필요 시 init 또는 get; private set;으로 제한 가능
Unity에서 프로퍼티 언제 쓰나?
캐릭터 체력, 스탯 조작할 때 제어 로직 넣고 싶을 때
Inspector에는 필드를 [SerializeField]로 노출하고,
내부에서는 프로퍼티로 안전하게 조작