상속에는 한계가 있다. 코드 재사용성을 높여주나, 코드 재활용, 유지보수가 어려워질 수 있다.
유연한 설계와 유지보수를 위해 최근에는 상속보다 컴포넌트 방식이 선호되며, 유니티는 컴포넌트 기반 구조를 띄고 있다.
[컴포넌트 패턴]
클래스를 상속받는 대신, 빈 껍데기인 게임 오브젝트에 기능(컴포넌트)들을 조립하여 넣는 방식이다. 상속처럼 재사용성이 높으면서, 상속과 달리 독립적인 부품이기에 유연성이 높고 결합도가 낮다.
[컴포넌트 Componunt]
게임 오브젝트의 기능, 동작에 관여하는 구성요소.
독립적인 부품으로, 다른 컴포넌트에 의존하지 않는다.
인스펙터(속성 정보 확인 및 편집 창)를 사용하여 속성을 변경하거나 스크립트를 사용할 수 있다.
하나의 게임 오브젝트에 여러 컴포넌트를 연결할 수 있지만, 모든 게임 오브젝트는 단 하나의 Transform 컴포넌트만 가질 수 있다.
[게임 오브젝트 Game Object]
씬(게임 오브젝트를 시각적으로 편집 가능한 공간)에 존재할 수 있는 모든 것, 게임 오브젝트의 모양과 기능을 결정하는 컴포넌트를 담는 그릇.
모든 게임 오브젝트는 처음에 빈 껍데기이나, 껍데기에 컴포넌트를 조립하여 각자 고유한 기능을 가지게 된다.

* 하이어라키: 계층창. 현재 씬에 존재하는 모든 오브젝트들이 표기되며 부모자식관계를 설정할 수 있다.

[트랜스폼 Transform]
위치, 회전, 크기 컴포넌트. 가상의 공간에 오브젝트가 표시되려면 트랜스폼을 갖고 있어야 하며, 이는 삭제할 수 없다.
자식의 트랜스폼은 부모를 기준으로(Local) 값을 측정하며, 부모가 없는 경우 월드(Global)공간에서 값을 측정한다.

[MonoBehaviour]
유니티의 모든 스크립트가 상속받는 기본 클래스로, 에디터에서 스크립트를 게임 오브젝트에 연결할 수 있는 프레임워크를 제공한다. (상속 시 사용자 정의 컴포넌트 제작 가능)
| Update() | 게임 오브젝트 프레임 업데이트 처리 코드 (움직임, 동작 트리거, 입력 응답 등 게임 플레이 중 경과에 따라 처리하는 모든 작업) |
| Start() | 게임 시작 전(Update 호출 전) Unity에서 호출, 초기화 수행 코드 |
* 자동 생성되는 메서드. 해당 메서드를 사용하지 않는다면 지운다. 사용하지 않아도 매 프레임마다 호출을 받기 때문이다.
- Debug.Log(): Unity 콘솔 출력에 메세지를 출력하는 명령 (소스코드 오픈 전에 지우는 것이 좋다)
[이벤트 메서드]
모든 MonoBehaviour 컴포넌트가 수신할 가능성이 있는 사전 정의된 콜백(특정 조건 만족 시 실행하는 메서드)세트.
다음과 같은 조건 등에 의해 트리거된다.
1. [정기 업데이트 이벤트]
게임은 애니메이션 프레임이 즉석에서 생성되는 애니메이션과 유사하다.
게임 프로그래밍 핵심 개념은 각 프레임 렌더링 직전에 오브젝트 위치, 상태, 동작을 변경하는 것이다.
Update()는 Unity에서 이러한 종류의 코드가 주로 사용되는 곳이다. (Update: 프레임 렌더링/애니메이션 계산 전 호출)
물리 엔진은 프레임 렌더링과 유사한 방식인 이산 시간 단계(시간이 연속으로 흐르지 않고, 특정 간격(0, 1, 2...)단위로 끊어서 진행되는 것)로 업데이트 된다. 각 물리 업데이트 직전 FixedUpdate()가 호출된다.
씬의 모든 오브젝트에 Update() 및 FixedUpdate()가 호출된 시점에 추가 변경 사항을 적용하고 모든 애니메이션이 계산된 후 변경하는 것이 유용할 때도 있다. LateUpdate()는 이럴 때 사용된다.
- 카메라가 타겟 오브젝트에 대한 학습 상태를 유지해야 하는 경우(오브젝트 이둥 -> 카메라 방향 조정)
- 스크립트 코드가 애니메이션 효과를 오버라이드 해야 하는 경우(캐릭터 머리가 씬의 타겟 오브젝트를 향하도록)
2. [초기화 이벤트]
게임 시작 혹은 플레이 중 발생하는 업데이트 전 초기화 코드 호출.
Start()는 오브젝트 첫 번째 프레임 or 물리 업데이트 전 호출된다.
다양한 오브젝트의 Start(), Awake()가 임의 순서로 호출되더라도 Awake()의 모든 인스턴스는 첫번째 Start()가 호출되기 전 완료된다. (Start() 코드는 Awake() 단계에서 이전에 수행된 다른 초기화를 사용할 수 있다)
3. [GUI 이벤트]
씬의 메인 동작 GUI 컨트롤을 렌더링하고, 컨트롤 클릭에 응답하는 시스템은 주기적으로 호출되는 OnGUI() 에 배치.
게임 오브젝트 위에 발생하는 마우스 감지, 무기 타겟팅, 현 마우스 포인터 아래 캐릭터 정보 표시 등, 접두사 OnMouse로 지정된 이벤트 메서드(OnMouseOver(), OnMouseDown())를 사용하면 스크립트가 마우스로 사용자 행동에 반응한다.
4. [물리 이벤트]
물리 엔진은 해당 오브젝트 스크립트에서 이벤트 메서드를 호출하여 오브젝트 충돌을 보고한다.
접촉이 이루어질 때(OnCollisionEnter), 유지될 때(OnCollisionStay), 종료될 때(OnCollisionExit) 메서드가 호출된다.
OnTriggerEnter, OnTriggerStay, OntriggerExit 메서드는 오브젝트 콜라이더가 트리거(물리적으로 반응하지 않고, 단순히 무언가 들어갈 때 감지하는 콜라이더)로 설정될 때 호출된다.
물리 업데이트 중 두 개 이상 접점이 감지되어 충돌 세부 정보(위치, 들어오는 오브젝트 ID 등)를 제공하는 파라미터가 함수에 전달될 경우 해당 함수를 여러 번 연속적으로 호출할 수 있다.
[스크립트 라이프 사이클 Life cycle]
객체가 생성, 활성화, 업데이트, 종료되는 과정. 라이플 사이클에는 여러 이벤트 메서드가 존재하며, 이를 통해 게임 오브젝트의 동작을 제어할 수 있다.
이벤트 발생 시 스크립트에서 관련 콜백을 사전 지정된 순서로 호출하여 이벤트 응답 로직을 구현한다.
| 단계 | 메서드 | 용도 |
| 초기화 Initialization |
Awake() | 스크립트 실행 시 1번만 호출 스크립트 비활성화에도 호출(오브젝트 비활성화는 호출 X) 생성자처럼 게임 상태, 변수 초기화로 사용 오브젝트 초기화, 프리펩 인스턴스화 진행 후 호출(Find 함수 호출 안정) 코루틴으로 실행 X |
| OnEnable | 오브젝트 or 스크립트 활성화 시 호출 이벤트 연결 코루틴으로 실행 X |
|
| Start() | 스크립트 활성화 시 1번만 호출 오브젝트 or 스크립트 비활성화 시 호출X 코루틴으로 실행 O |
|
| 물리 엔진 Physics |
FixedUpdate | 고정된 프레임 주기로 호출 스크립트가 활성화 되어 있어야 호출 O |
| OnTriggerXXX | 두 오브젝트 충돌 체크 물리 연산 없이 통과 |
|
| OnCollisionXXX | 두 오브젝트 충돌 체크 물리 영향O, Rigidbody 필요 |
|
| Update | 매 프레임마다 호출되는 메서드. 디바이스 성능, 최적화에 따라 framerate가 변하므로 함수 호출 시간이 매번 달라진다. 스크립트가 활성화 되어 있어야 호출 O |
|
| LastUpdate | 모든 Update 함수 호출 후 1번씩 호출 스크립트가 활성화 되어 있어야 호출 O 카메라 이동 로직에 주로 사용 |
|
| 해제/종료 Decommissioning |
OnApplicationQuit | 응용 프로그램 종료 전 모든 오브젝트에서 호출 |
| OnDissable | 오브젝트 or 스크립트 비활성화 시 호출 이벤트 연결 종료 시 사용 코루틴으로 실행 X |
|
| OnDestroy | 오브젝트 생존 기간의 마지막 프레임 업데이트 후 실행 |
[Awake VS Start]
| 구분 | Awake | Start |
| 호출 시점 | 게임 오브젝트 초기화 (스크립트 생성 직후) | 모든 스크립트 Awake 끝, 첫 프레임 업데이트 직전 |
| 스크립트 비활성화 시 | 실행 | X |
| 주요 용도 | 변수 초기화, 다른 컴포넌트 참조 가져오기 | Awake에서 설정한 값을 바탕으로 한 추가 설정 및 로직 시작 |
[Awake()]
- Start() 호출 전 Scene(씬)의 모든 객체에 대해 호출
- 프리팹 인스턴스화 직후 호출
- 게임 오브젝트 비활성화 시 호출X
- 스크립트간 참조 설정 시 사용
- 모든 오브젝트가 초기화되고 호출되기 때문에 타 스크립트와 연결 보장
- 유니티의 MonoBehaviour를 상속 받은 클래스에서 사용 가능
[Start()]
- 스크립트 인스턴스가 활성화된 경우, 첫 번째 프레임 Update() 전 호출
- Awake와 동일하게 스크립트 수명 동안 한 번만 호출, MonoBehabiour를 상속 받은 클래스에서 사용 가능
(반대로 Awake는 스크립트 활성화 여부 관계 없이 스크립트 개체 초기화 시 호출된다)
- 씬 에셋에 포함된 모든 오브젝트에 대해 Update 등 이전에 호출된 모든 스크립트를 위한 Start 함수 호출
(게임플레이 중 오브젝트 인스턴스화 시엔 실행되지 않음)
[차이점]
- Awake와 Start의 가장 큰 차이는 실행되는 순서가 다른 것
- Awake는 스크립트 활성화 여부 관계 없이 스크립트 개체 초기화 시 호출
(비활성화 상태에서도 Awake는 호출되나, Start는 호출되지 않는다.)
Awake는 모든 오브젝트가 초기화되고 호출. 타 스크립트와 연결을 보장할 수 있다.
(하지만 모든 객체의 Awake 함수는 무작위로 호출된다. 때문에 한 객체의 Awake가 다른 객체보다 먼저 호출되거나 Awake에서생성한 참조가 Awake의 다른 스크립트에서 사용할 수 있음을 보장할 수 없다.)
Start는 게임플레이 도중 오브젝트를 인스턴스화 될 때 실행되지 않는다.
플로우 차트(Long ver)
플로우차트 범위는 모노 스크립팅 레퍼런스의 메세지에 문서화 된 적절한 콜백을 구현하여 모든 모노 스크립트에서 구독할 수 있는 빌트인 이벤트 함수로 제한된다. 또한 이벤트를 발생시키는 하위 시스템의 일부 추가 내부 메서드도 컨텍스트에 표시된다.

| 순서(상황) | 메서드(함수) | 용도 |
| 씬 시작(오브젝트당 한 번), Start 이전 | Awake | 오브젝트 새 인스턴스 생성 시 호출. 게임 오브젝트 비활성화 시 활성화 전까지 호출되지 않음 |
| OnEnable | Awake 이후(동일 오브젝트 한) ~ Start 전 호출 | |
| 에디터 | Reset | 오브젝트 첫 연결 or Reset 커맨드 사용 시 스크립트 속성 초기화 용도 |
| OnValidate | (오브젝트 역직렬화 포함)스크립트 속성이 설정될 때마다 호출(이 외 다양한 시기) |
|
| 첫 번째 프레임 업데이트 전 | Start | 스크립트 인스턴스가 활성화 된 경우, 호출 |
| 프레임 사이 | OnApplicationPause | 일반 프레임 업데이트 사이, 일시 정지가 감지된 프레임 끝에서 호출 게임 일시중지 그래픽스 표시를 위해 호출 후 추가 프레임 표시 |
| 업데이트 순서 | FixedUpdate | 게임 내 시간의 일정 간격으로 발생. 물리 계산 및 업데이트는 해당 함수 이후 즉시 수행. 프레임 속도와 독립적, 값에 Time.deltaTime을 곱할 필요가 없음. |
| Update | 프레임 업데이트를 위한 주요 함수. 프레임당 한 번 호출. | |
| LateUpdate | Update 끝, 프레임당 한 번씩 호출 3인칭 카메라. Update에서 캐릭터를 이동하고 회전 시 카메라 이동/회전 계산 수행 용. |
|
| 애니메이션 업데이트 루프 | MonoBehaviour. OnAnimatorMove |
애니메이션 루프 콜백 (내용 생략) |
| MonoBehaviour. OnAnimatorIK |
||
| StateMachine Behaviour 및 파생 |
추가 애니메이션 관련 이벤트 메서드 (내용 생략) | |
| 렌더링 (빌트인 렌더 파이프라인만 적용) |
OnPreCull | 카메라가 씬 컬링 전 호출 컬링에 따라 카메라에 보이는 오브젝트 결정(컬링 직전 호출) |
| OnBecameVisible/ OnBecameInvisible |
오브젝트가 카메라에 보이거나 보이지 않을 때 호출 | |
| OnWillRenderObject | 오브젝트가 표시되면 각 카메라에 '한 번' 호출 | |
| OnPreRender | 카메라가 씬 렌더링 시작 전 호출 | |
| OnRenderObject | 모든 일반 씬 렌더링 완료 후 호출 | |
| OnPostRender | 카메라가 씬 렌더링을 마친 후 호출 | |
| OnRenderImage | 이미지 포스트 프로세싱 용, 씬 렌더링 완료 후 호출 | |
| OnGUI | GUI 이벤트에 대한 응답, 프레임당 여러 번 호출 (레이아웃, 리페인트 이벤트 우선) |
|
| OnDrawGizomos | 시각화 목적, 씬 뷰에 기즈모를 그릴 때 사용 | |
| 코루틴 (Update 함수 반환 후 실행) (주어진 YieldInstruction 완료까지 실행(yield)을 일시 중지 가능 |
yield 코루틴 | 모든 Update 함수가 다음 프레임에 호출된 후 계속 진행 |
| yield WaitForSeconds | 모든 Update 함수가 프레임 호출 후 지정 시간이 지난 후 계속 진행 | |
| yield WaitFor FixedUpdate |
모든 스크립트에서 모든 FixedUpdate 호출 후 계속 진행 FixedUpdate 이후 다시 시작 |
|
| yield WWW | WWW 다운로드가 완료된 후 계속 진행 | |
| yield StartCoroutine | 코루틴 체이닝, 이론 코루틴 coroutineA가 yield StartCoroutine(coroutineB()); 가 완료될 때까지 기다린 후 계속 진행 | |
| 오브젝트 파괴 | OnDestroy | 오브젝트가 존재하는 마지막 프레임에 모든 프레임 업데이트를 마친 후 호출 |
| 종료 | OnApplicationQuit | 애플 종료 전 모든 게임 오브젝트에서 호출. 에디터에서 사용자가 플레이 모드 중지 시 호출 |
| OnDisable | 동작이 비활성화 되거나 비활성 상태 시 이 함수 호출 |
[씬 뷰 및 기타 단축키]
| 이름 | 단축키 | 의미 |
| 핸드 | Q | 화면 드래그 이동 |
| 무브 | W | 오브젝트(평행)이동 |
| 회전 | E | 오브젝트 회전 |
| 스케일 | R | 오브젝트 크기 조정 |
| 렉터 | T | UI, 2D오브젝트 크기 조정 |
| 이동회전스케일 통합 툴 | Y | |
| 화면 확대축소 | RC + W / S | |
| 화면 상하 이동 | RC + Q / E | |
| 화면 좌우 이동 | RC + A / D | |
| 화면 이동 | 휠 클릭 | |
| 오브젝트 포커싱 | 오브젝트 선택 + F |
[기타 팁]
[파일 정리]
Project - Asset 에 모음집 폴더를 미리 만들고 종류 별로 나눠서 보관한다. (폴더링과 정리는 중요하다)
Prefab, Scripts, Material 등...
[에셋 구매 팁]
에셋 구매 시 URP 지원 O 여부 확인할 것 (X 구매시 귀찮아진다)
습작은 로우폴리로 만들 것
[축 정렬 기준]
Y를 위, X를 오른쪽(Z축은 보이지 않음)

* 오브젝트의 정방향 기준과 월드의 정방향 기준은 다르다. (오브젝트는 항상 스스로를 원점으로 삼는다)
오브젝트의 앞은 월드의 오른쪽이다(큐브 y축 90도 설정 시, 월드 공간의 x축과 큐브 오브젝트 공간이 z축과 일치한다)


[트랜스폼 & 상속]
트랜스폼을 부모로 지정하는 경우, 부모의 위치를 <0,0,0>으로 설정한 후 자식 트랜스폼을 추가하는 것이 좋다.
(로컬 좌표가 전역 좌표와 동일하므로 자식이 올바른 위치에 있는지 확인하기 더 쉬워진다.)
출처 및 자료: 유니티 매뉴얼
https://docs.unity3d.com/kr/current/Manual/UnityManual.html
Unity - 매뉴얼: Unity 6 사용자 매뉴얼
렌더링 성능 향상 렌더링, 조명, 시각 효과의 최신 고급 기능을 사용하여 확장성을 갖춘 매력적인 비주얼로 더욱 멋진 씬을 구현할 수 있습니다. 멀티플레이어 게임 제작 Unity의 멀티플레이어 패
docs.unity3d.com
'개발일지 > Unity' 카테고리의 다른 글
| [Unity] Find, Coroutine (0) | 2026.05.28 |
|---|---|
| [Unity]Ray복습, UI, OverLap, Check (0) | 2026.05.27 |
| [Unity] Prefabs, RayCast (0) | 2026.05.26 |
| [Unity]Rigidbody, Collider (0) | 2026.05.26 |
| [Unity]이동, 회전 (0) | 2026.05.26 |