유니티를 시작하기에 앞서 가장 먼저 공부해야 하는 것은 유니티의 동작 원리와 Monobehaviour 이다.
유니티 프로그램의 원리
유니티는 컴포넌트 기반 아키텍처를 사용한다. 게임 오브젝트는 여러 컴포넌트로 구성되어 있으며, 각 컴포넌트는 특정 기능을 담당한다. MonoBehaviour를 상속받은 스크립트는 게임 오브젝트의 동작을 정의하는 주요 컴포넌트이다.
- 게임 오브젝트(GameObject): 씬 내의 모든 개체를 의미한다. 각 게임 오브젝트는 여러 컴포넌트를 가질 수 있다.
- 컴포넌트(Component): 게임 오브젝트에 붙여서 특정 기능을 수행하는 모듈.
- 씬(Scene): 게임의 각 단위를 구성하는 환경. 게임 오브젝트와 컴포넌트들이 배치되어 있다.
즉 유니티는 레고를 조립하듯, 컴포넌트와 게임 오브젝트들을 이리저리 조립하여 게임을 만드는 엔진이다. 유니티는 OOP의 원리를 정확히 따르고 있는 게임 엔진이다. 가끔씩 C++ 나 자체 엔진을 사용하던 회사에서 일하던 분들이 유니티로 코딩할 때 유니티의 기능을 사용하지 않고 직접 클래스를 구현한다거나 상속관계로 복잡하게 얽혀 있는 스크립팅을 하는 경우를 보았는데, 유니티에 적합한 프로그래밍이 아니라고 생각한다.
유니티의 MonoBehaviour 란?
MonoBehaviour는 Unity 기본 클래스 중 하나로 모든 스크립트가 상속해야 하는 클래스이다. 이 Monobehaviour를 통해 Unity 엔진의 다양한 기능을 사용할 수 있다.
(물론 상속하지 않고 자체 클래스를 만들어서 상속받아 프로그래밍 하는 경우가 있으나 유니티 게임 개발에서, 특히 주니어 레벨이라면 절대로 추천하는 방법이 아니다. 현업에서 요구하는 역량도 아니라고 생각한다.)
생명 주기 메서드: Monobehaviour는 여러 생명 주기 메서드를 제공하여 게임 오브젝트의 다양한 상태에서 호출된다.
유니티 MonoBehaviour 주요 메서드 개요
유니티 스크립트를 만들면 자동으로 MonoBehaviour 를 상속받은 상태이고 start와 update 함수가 보일 것이다. 이는 유니티의 생명 주기 메서드인데, 다음과 같은 종류가 있다.
- Awake: 모든 스크립트와 객체가 초기화된다.
- OnEnable: 객체가 활성화될 때 호출된다.
- Start: 초기화 작업을 수행하며, 게임 시작 시 한 번 호출된다.
- Update: 매 프레임마다 호출되어 게임 로직을 업데이트한다.
- LateUpdate: 모든 Update 호출이 완료된 후에 호출된다.
- FixedUpdate: 고정된 간격으로 호출되어 물리 연산을 처리한다.
- OnDisable: 객체가 비활성화될 때 호출한다.
- OnDestroy: 객체가 파괴될 때 호출한다.
public class ExampleScript : MonoBehaviour
{
void Awake()
{
// 스크립트가 인스턴스화될 때 실행되는 초기화 코드
Debug.Log("Awake 호출됨");
}
void Start()
{
// 초기화 코드
Debug.Log("게임이 시작되었습니다!");
}
void Update()
{
// 매 프레임마다 실행되는 코드
transform.Translate(Vector3.forward * Time.deltaTime);
}
void LateUpdate()
{
// 매 프레임마다 실행되지만 Update 후에 실행되는 코드
camera.transform.position = player.transform.position + offset;
}
void FixedUpdate()
{
// 물리 업데이트
rb.MovePosition(rb.position + Vector3.forward * Time.fixedDeltaTime);
}
}
Start, Update, LateUpdate, FixedUpdate 등의 메서드를 통해 게임 오브젝트의 동작을 제어하고, Awake와 OnEnable등 메서드를 통해 초기화 작업을 처리한다.
또한 MonoBehaviour는 게임 오브젝트에 컴포넌트로 추가되어 게임 오브젝트의 동작을 제어하고 확장할 수 있다. 코루틴을 사용하여 비동기 작업을 쉽게 구현할 수 있다는 것도 장점이다.
유니티 이벤트 실행 순서 개요 (실행 시퀸스)
Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행된다. 이 순서에 익숙해 져야 전체적인 프로그래밍 로직을 짤 수 있다.
https://docs.unity3d.com/kr/2022.3/Manual/ExecutionOrder.html
유니티는 싱글 쓰레드
유니티는 기본적으로 싱글 쓰레드 환경에서 동작한다. 이는 게임의 주요 루프(프레임 업데이트)가 단일 메인 쓰레드에서 실행된다는 것을 의미한다. 하지만 유니티는 특정 작업에 대해 멀티 쓰레딩을 지원하며, 개발자는 필요한 경우 멀티 쓰레딩을 직접 구현할 수 있다.
싱글 쓰레드 환경의 특징
- 메인 스레드: 유니티의 메인 루프(업데이트 루프)는 메인 스레드에서 실행된다. 이 루프는 프레임마다 모든 게임 오브젝트의 Update, FixedUpdate, LateUpdate 메서드를 호출한다.
- 안전성: 싱글 쓰레드 환경은 멀티 쓰레드 환경에서 발생할 수 있는 동기화 문제나 데이터 경쟁 상태를 방지하여 코드 작성이 비교적 간단하고 안전하다.
- 일관성: 모든 게임 로직이 동일한 스레드에서 실행되므로 예측 가능하고 일관된 동작을 보장한다.
유니티 멀티 쓰레드에 대한 내용은 추후 다룰 예정이다.
'유니티 C# > 유니티 프로그래밍' 카테고리의 다른 글
[유니티 C#] Update, LateUpdate, FixedUpdate (0) | 2024.06.09 |
---|---|
[C# Basics] Static과 싱글턴 패턴 - Unity 예시를 통해 알아보자 (0) | 2024.04.10 |