상세 컨텐츠

본문 제목

[유니티 소소모임] 1주차. 유니티 기초 (Editor: 동동)

24-25/Untiy

by 롱롱😋 2024. 10. 4. 12:04

본문

728x90

 

 

 

MonoBehaviour 클래스 

유니티 프로젝트 창에서 C# 스크립트를 생성하면 자동으로 상속되는 MonoBehaviour 클래스기본적으로 모든 유니티 스크립트가 파생되는 기본 클래스입니다. 아래와 같이 프로젝트에서 발생하는 상황에 따라 코드를 실행하는 등 대규모 이벤트 메시지 컬렉션에 대한 액세스를 제공합니다.


유니티 게임 오브젝트의 흐름

유니티 오브젝트의 생명주기

유니티 오브젝트는 명령 주기에 따라 해당하는 함수가 호출되며, 생명 주기는 다음과 같습니다.

더보기

초기화 > (활성화) > 프레임(물리 연산 > 게임 로직) > (비활성화) > 해체

 

초기화 영역

    void Awake(){}
    void Start(){}
  • Awake: Start 함수 전에 호출되며 게임 오브젝트 생성 시 호출됩니다. 게임 오브젝트가 비활성 상태인 경우 호출되지 않습니다.
  • Start: 업데이트 시작 전에 호출됩니다.


활성화

게임 오브젝트가 활성화된 직후 실행되는 함수입니다.

    void OnEnable(){}

 

 

프레임

물리 연산 영역과 게임 로직 영역이 프레임에 포함됩니다. 1초에 여러번 실행됩니다.

    void FixedUpdate(){} // 물리 연산 영역
    void Update(){} // 게임 로직 영역
    void LateUpdate(){}
  • FixedUpdate: 물리 연산 실행 전 실행되며, 1초에 약 50번 실행됩니다. 프레임 속도가 낮은 경우 프레임당 여러 번 호출될 수 있으며 프레임 속도가 높은 경우 프레임 사이에 호출되지 않을 수 있습니다. 모든 물리 계산 및 업데이트는 해당 함수 종료 후 즉시 발생합니다.
  • Update: 물리 연산을 제외한 주요 로직을 업데이트하며, 프레임당 한 번 호출됩니다.
  • LateUpdate: FixedUpdate와 Update 종료 후 프레임당 한 번 호출됩니다. 일반적으로 3인칭 카메라 또는 후처리에 사용합니다.


비활성화

업데이트 종료 후 게임 오브젝트가 비활성화되거나 비활성 상태일 때 실행되는 함수입니다.

    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 함수에 삽입하면 너무 길어지는 문제가 발생하기 때문에, 코루틴을 사용해 지정한 시간 간격으로 처리하는 등 성능상 이점을 획득하며 구현할 수 있습니다.

코루틴은 다음과 같은 특징을 갖습니다.

  • MonoBehaviour을 상속받아야 함
  • StartCoroutine 함수로 실행
  • StopCoroutine 함수로 종료
  • IEnumerator을 반환
  • yield return을 통해 프레임 조율 (null(한 프레임 대기 시간) 또는 WaitForSeconds(지정 초) 반환)
  • yield break을 통해 종료
  • 코루틴을 실행하는 오브젝트가 비활성화/파괴 시 코루틴이 종료됨
  • 성능을 많이 사용하므로, 꼭 필요할 때만 사용하는 것이 바람직함 

 

코루틴의 일정 시간 대기, 실행 함수들은 YieldInstruction 클래스에 정의되어 있습니다. 자주 사용되는 함수는 다음과 같습니다.

yield return new WaitForSeconds(초); // 초 동안 대기 후 다음 코드 실행
yield return new WaitUntil(조건); // 조건이 참일 시 다음 코드 실행

해당 포스트는 게이머TV, [4. 유니티가 어려운 초보자를 위한 유니티 기초 강의], (2024, 9월 22일), 섹션 1. 유니티 기초 강의를 참고하여 작성하였습니다.

 

 

 

Corner Unity

Editor : 동동

728x90

관련글 더보기