유니티 프로젝트 창에서 C# 스크립트를 생성하면 자동으로 상속되는 MonoBehaviour 클래스는 기본적으로 모든 유니티 스크립트가 파생되는 기본 클래스입니다. 아래와 같이 프로젝트에서 발생하는 상황에 따라 코드를 실행하는 등 대규모 이벤트 메시지 컬렉션에 대한 액세스를 제공합니다.
유니티 오브젝트의 생명주기
유니티 오브젝트는 명령 주기에 따라 해당하는 함수가 호출되며, 생명 주기는 다음과 같습니다.
초기화 > (활성화) > 프레임(물리 연산 > 게임 로직) > (비활성화) > 해체
초기화 영역
void Awake(){}
void Start(){}
활성화
게임 오브젝트가 활성화된 직후 실행되는 함수입니다.
void OnEnable(){}
프레임
물리 연산 영역과 게임 로직 영역이 프레임에 포함됩니다. 1초에 여러번 실행됩니다.
void FixedUpdate(){} // 물리 연산 영역
void Update(){} // 게임 로직 영역
void LateUpdate(){}
비활성화
업데이트 종료 후 게임 오브젝트가 비활성화되거나 비활성 상태일 때 실행되는 함수입니다.
void OnDisable(){}
해체 영역
게임 오브젝트가 삭제될 때 실행되는 함수입니다.
void OnDestroy(){}
Time.deltaTime
컴퓨터의 성능은 제각각이며, 초당 프레임 수(FPS, frames per second)(1초에 처리할 수 있는 프레임(이미지) 수) 또한 다릅니다. 유니티의 주요 작업 함수 Update는 프레임당 한 번 호출되기 때문에, 성능을 고려하지 않으면 개별 컴퓨터 간 동작이 달라집니다.
이를 위해 Time.deltaTime을 사용해 각 성능에 맞춰 스케일하여 처리합니다. Time.deltaTime는 이전 프레임을 완료하는 데 걸린 시간(초)이며, 이는 Update 함수의 호출 간격(1/fps)입니다. 성능이 낮을수록 값이 크며, 1초에 1프레임 처리될 경우 1, 1초에 10프레임 처리될 경우 0.1을 의미하게 됩니다.
void Update() {
transform.position = new Vector3(
transform.position.x,
transform.position.y + Time.deltaTime,
transform.position.z
);
}
위 코드는 오브젝트의 y축 위치를 Time.deltaTime만큼 증가하는 코드입니다. 프레임마다 y축에 1/fps만큼 증가시키므로 성능이 다른 컴퓨터 모두 동일한 동작을 수행하게 됩니다.
Lerp 함수
시작 값(a), 끝 값(b)가 주어졌을 때, 그 사이 값(t)를 선형적으로 추정하는 선형 보간 함수입니다. 유니티에서 자연스러운 이동, 전환 등에 사용됩니다. Lerp 함수의 파라미터는 a, b, t 값이며, 반환 값은 a * (1-t) + b * t입니다.
void Update() {
time += Time.deltaTime;
transform.position = Vector3.Lerp(startPos, targetPos, time);
}
Lerp 함수를 Update 함수에서 호출하면 작은 간격 단위로 반환 값을 증가시켜, 오브젝트가 부드럽게 움직이게 됩니다. 위 코드는 startPos에서 약 1초 동안 targetPos까지 이동합니다. (예를 들어, Time.deltaTime이 0.2(=5fps)라면, 5번 Update 함수가 호출(=1초)되어야 time이 1이 되어 targetPos를 반환해 목표 지점까지 부드럽게 이동합니다.)
에셋 스토어의 무료 에셋 DOTween을 통해 해당 동작을 간단히 구현할 수 있습니다.
코루틴(Coroutine)
코루틴(Coroutine)은 메서드 제어권을 유니티에 반환하고 특정 조건이 되면 중단한 부분에서 다음 프레임을 진행할 수 있는 메서드이며, Enumaerator를 이용해 여러 프레임에 걸쳐 실행됩니다. 순차적인 애니메이션, 이벤트 등에 사용할 수 있습니다. 프레임을 사용하는 모든 코드를 Update 함수에 삽입하면 너무 길어지는 문제가 발생하기 때문에, 코루틴을 사용해 지정한 시간 간격으로 처리하는 등 성능상 이점을 획득하며 구현할 수 있습니다.
코루틴은 다음과 같은 특징을 갖습니다.
코루틴의 일정 시간 대기, 실행 함수들은 YieldInstruction 클래스에 정의되어 있습니다. 자주 사용되는 함수는 다음과 같습니다.
yield return new WaitForSeconds(초); // 초 동안 대기 후 다음 코드 실행
yield return new WaitUntil(조건); // 조건이 참일 시 다음 코드 실행
해당 포스트는 게이머TV, [4. 유니티가 어려운 초보자를 위한 유니티 기초 강의], (2024, 9월 22일), 섹션 1. 유니티 기초 강의를 참고하여 작성하였습니다.
Corner Unity
Editor : 동동
[유니티 소소모임] 1주차. 유니티 기초 (Editor: Luna) (4) | 2024.10.04 |
---|---|
[유니티 소소모임] 1주차. 유니티 기초 (Editor: Hetbahn) (0) | 2024.10.04 |
[유니티 소소모임] 1주차. 유니티 기초 (Editor: Borybop) (0) | 2024.10.04 |
[유니티 소소모임] 1주차. 유니티 기초 (Editor: 니나노) (0) | 2024.10.04 |
[유니티 소소모임] 1주차. 유니티 기초 (Editor: Ijin) (1) | 2024.10.04 |