2024-03-28
그동안 Github 에 올려두었던 게임 개발 종합반 1~5주차 스크립트를 정리해보는 시간을 가지려고 했지만, 사용된 코드가 광범위 하기도 하고, 여러 번에 걸쳐 포스팅하려고 하다보니 분류 하기도 쉽지 않았다.
매니저님과 상담하여 "총알 발사" 라는 하나의 액션을 위해 A-Z 까지의 과정을 함수와 컴포넌트로 정리하는 방법과, 클래스 별로 정리하는 방법을 추천해주셨다.
함수에 첫 포스팅으로 모든 Unity C# Script 의 기본 클래스인 MonoBehaviour 에 대해 정리해보려고 한다.
모노는 C# 컴파일러와 공통 언어 런타임을 포함하여, Ecma 표준을 준수하는 닷넷 프레임워크의 오픈 소스 버전이다.
유니티에서 Behaviour 는 활성화, 비활성화 할 수 있는 컴포넌트를 뜻한다.
C# Script 를 생성하면 아래 코드가 자동으로 생성된다.
MonoBehaviour 클래스는 기본적으로 모든 Unity 스크립트가 파생되는 기본 클래스이다.
Unity의 프로젝트 창에서 C# 스크립트를 생성하면 MonoBehaviour에서 자동으로 상속되고, Start( ), Update( ) 와 같은 라이프사이클 함수와 OnCollisionEnter( ) 등의 이벤트 함수를 제공한다.
프로젝트에서 MonoBehaviour 를 상속한 C# 스크립트는 하나의 컴포넌트의 역할을 한다
아래 그림을 볼 때, 좌측 상단의 Legend는 뭐지 하고 구글링을 하고 있었는데,
모서리가 둥근 흰색 박스는 User callback , 모서리가 둥근 회색 박스는 Internal function , 회색 박스는 Internal multithreaded function 을 뜻한다고 한다.
아직 Internal function 과 Internal multithreaded function 까지 공부하긴 벅차
LifeCycle을 따라 흐름만 익혀보려고 한다.
초기화 단계
함수 | 설명 | 조건 |
---|---|---|
Awake | 스크립트가 실행될 때, 단 한 번만 호출 | 오브젝트 활성화 여부와 상관 X |
Onable | 오브젝트를 활성화할 때마다 호출 | SetActive 함수 (비활성화 -> 활성화) |
Start | 초기화단계에서 가장 마지막에 호출 | 오브젝트 활성화 |
Awake 함수 호출 순서는 임의로 정할 수 없으므로 아래와 같은 코드는 NullRefereneceException 을 발생 시킬 수 있다.
class B 의 Debug.Log 를 Awake 가 아닌 Start 에 넣어주어야 한다.
using UnityEngine;
public class A : MonoBehaviour
{
public static string dynamicMember;
void Awake()
{
dynamicMember = "A의 멤버가 동적으로 생성되었습니다!";
}
}
public class B : MonoBehaviour
{
void Awake() // -> void Start()
{
Debug.Log(A.dynamicMember);
}
}
객체의 속성을 초기 값으로 설정하는 단계
함수 | 설명 | 조건 |
---|---|---|
Reset | 오브젝트에 처음 연결하거나 스크립트 속성을 초기화 | 오브젝트 생성 후 리셋을 눌러주거나 Reset( ) 호출 |
물리적인 계산을 진행하는 단계
함수 | 설명 | 조건 |
---|---|---|
FixedUpdate | 일정한 주기(0.02초)로 호출 | 물리 효과가 적용된 오브젝트 조정 |
OnTriggerXXX | 충돌을 체크 | 두 충돌 물체 중 하나는 IsTrigger 활성화 |
OnCollisionXXX | 충돌을 체크 | IsTrigger 비활성화 |
총알이 물체와 부딪혀 사라질 때는 OnTrigger.
자동차와 물체가 부딪혀 날아갈 때는 OnCollision.
일반적으로 OnCollision 에 비해 OnTrigger 가 물리적 연산이 적다.
OnTrigger 과 OnCollision 의 충돌 처리 함수는 따로 포스팅할 예정이다.
마우스 입력을 처리하는 단계
실질적인 게임 로직을 처리하는 단계
( 프레임 오차가 발생할 수 있으므로 물리적인 계산은 FixedUpdate )
함수 | 설명 | 조건 |
---|---|---|
Update | 매 프레임 마다 호출 | 스크립트 활성화 |
LateUpdate | Update 가 끝난 후 프레임 당 한 번 호출 | 일반적으로 3인칭 카메라에 활용 |
게임 오브젝트와 환경을 화면에 그려내는 단계
개발자가 씬 뷰에서 오브젝트의 위치나 범위 등을 시각적으로 확인할 수 있도록 도와주는 단계 ( 에디터에서만 활용 )
사용자 인터페이스 요소를 화면에 그리는 단계
특정 작업을 프레임의 마지막에 실행하고자 할 때
어플리케이션을 pause 했을 때
더 이상 사용되지 않는 오브젝트를 해제하는 단계
함수 | 설명 |
---|---|
OnApplicationQuit | 애플리케이션 종료 전이나 플레이 중지할 때, 모든 게임 오브젝트에서 호출 |
OnDisable | 해당 Behaviour가 비활성 상태일 때 호출 |
OnDestroy | 오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마친 후 호출 |
라이프 사이클을 찾아보며, 처음 들어보는 코루틴, 렌더링 관련 용어가 많았다. 해당 용어를 공부할 때마다 이 게시글도 함께 업데이트 해야겠다.