
유니티 내부에서 어떤식으로 게임이 동작하는지 알아보자
유니티 - 이벤트 함수의 실행 순서(라이프 사이클)
게임 오브젝트들로 이루어져 있고, 이들은 속성(컴포넌트) 들을 가짐. 무게, 모양, 재질 등클래스와 비슷한 기능을 한다. 상속은 탄탄한 구조를 만들 때 쓰기 좋지만, 유연한 대처를 하기 힘들다. 컴포넌트는 그 부분을 해결해준다.유연성, 비의존적, 독립적 특성을 가지고 잇다게임 오브젝트에 컴포넌트를 붙였다, 뗐다 하는 식으로 구현한다컴포넌트에는 점프가 없다. 점프를 구현하려면 어떻게 해야될까? 여기서 지금까지 배운 C#이 등장한다스크립트를 새로 추가해서 컴포넌트로 만든 다음, 게임 오브젝트에 추가하면 점프를 할 수 있다public class Jumper : MonoBehaviour
{
public Rigidbody rigid;
public float power;
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
rigid.AddForce(Vector3.up * power, ForceMode.Impulse);
}
}
}MonoBehaviour
Script를 만들면 자동으로 이 클래스를 상속받는다. 컴포넌트의 기본 클래스- Object - Component - Behaviour - MonoBehaviour 순으로 상속된다
게임 오브젝트에 스크립트를 컴포넌트로 연결할 수 있게함
참고 유니티 - 직렬화

게임 오브젝트를 파일이나 메모리, 데이터 베이스와 같은 저장할 수 있는 형태로 바꾸는 것을 직렬화 라고 한다
유니티 에서의 직렬화는 데이터 구조 또는 게임 오브젝트 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 포맷으로 변환하는 자동 프로세스
유니티는 게임 오브젝트를 직렬화를 이용해서 인스펙터 창에 표현을 한다. 실제로 씬 파일을 텍스트 파일로다가 불러오면 게임 오브젝트 들이 직렬화 된 것을 볼 수 있다. 이 직렬화 된 파일을 역직렬화 해서 빌드 한다
직렬화로 표현 가능한 변수
드래그&드롭만 해도 참조 시킬 수 있다
데이터 구조 또는 게임 오브젝트 상태를 보관 및 관리하는 용도로 쓰임인스펙터 창에서 오브젝트의 직렬화된 멤버변수 값을 보여줌드래그&드랍 방식으로 연결// C#
public int value;
public float jumpPower;
public bool boolValue;
public int movePower;
// Unity
public Color color;
public Vector3 position;
public Gradient gradient;
public AnimationCurve curve;
// 열거형
public enum Type { Normal,Special}
public Type type;
// 직렬화 가능한 필드의 배열 및 리스트
public int[] array;
public List<int> lists;
public Rigidbody rb;
-Atrribute
[] 대괄호 안에 표현클래스, 속성 또는 함수 위에 쓰는 마커. 에디터 상에서 분류체계로 쓰일 수도 있고, Range의 경우 슬라이드도 가능하다참조타입을 모아두려고 Reference로 제목을 지정했다[Header("Reference")]
public GameObject go;
public Rigidbody rig;
public 접근제한자여도 에디터 상에서 숨길 수 있다[HideInInspector]
public int publicValue;
double이 기본형이라, float로 쓰고 싶을 경우 f지정자를 사용하거나(10f), (float)와 같은 명시적 형변환을 사용한다 [Range(0, 100)]
public float rate;
[TextArea(3, 5)]
public string textField;
[SerializeField]
private int privateValue;
직렬화 가능 속성을 포함 시킨다[Serializable]
public struct StructType
{
public int value1;
public string value2;
}
public StructType structField;
[Serializable]
public class ClassType
{
public int value1;
public string value2;
}
public ClassType classField;
렌더 파이프라인을 떠올리면 된다. 이제 거기에 게임 내부의 처리인 Update가 추가된다Start -> 게임 루프(Render - Input - Update - Result) -> End 순으로 배웠다. 유니티에서는 이러한 개념을 이벤트 함수로 나타낸다. 이것이 라이프 사이클이다유니티 에서는 유니티 이벤트 함수들이 라이프 사이클을 이룬다메시지에 반응하는 함수MonoBehaviour 클래스의 메시지와 같은 이름의 함수가 반응컴포넌트는 라이프 사이클의 순서에 맞게 만들어야 한다. 라이프 사이클은 이벤트 함수들의 순서다라이프 사이클을 순환하면서 한 프레임씩 출력한다. 라이프 사이클에 있는 모든 함수는 모든 게임오브젝트에 보낸다. 이를 메시지 브로드캐스팅이라고 한다
오브젝트 : 게임오브젝트,컴포넌트,스크립트 등 모든 요소들이 오브젝트다
아래는 실행 순서다
Awake()에 쓰지 말고 Start() 또는 OnEnable()에서 쓰는것이 좋다Update() 이전에 호출됨SetActive() : 활성화, 비활성화 바꾸기
OnEnable() : 활성화 시 1회 호출
enabled : SetActive(true), SetActive(false)와 같다
Awake() 이후 오브젝트의 생성 및 활성화시 첫 1회만 호출Update 직전에 1회 수행함FixedUpdate 전 시간을 확인해서 0.02초가 지났으면 Physics 쪽만 진행. 안지났으면 넘어가고 Logic(Update)쪽 진행을 한다오브젝트와 스크립트의 생존 및 활성화 시에만 수행함FixedUpdate에 넣지 않도록 해야한다Update() 이후에 수행하지만 실행과 정지를 사용자가 자유롭게 사용할 수 있는 서브루틴Update() 이후에 호출됨OnEnable()과 마찬가지로 이벤트를 붙일 때, 뗄 때 많이 사용된다게임의 프레임 마지막마다 호출
씬의 모든 게임오브젝트의 Update가 진행된 후 호출
역할 : 게임프레임의 진행 결과가 필요한 동작이 있는 기능 구현
애니메이션 같은 곳에 쓰인다
[RuntimeInitializeOnLoadMethod]
- 씬에 포함시키지 않아도 알아서 실행되어서 초기설정을 진행할 수 있다
Awake()보다 먼저 실행 되어서, 랜덤으로 Awake() 되는게임 오브젝트들 보다 우선적으로 깨워서 초기화를 할 수 있다.싱글톤과 궁합이 좋다[RuntimeInitializeOnLoadMethod] public void Init() { 초기화 내용 }