Unity 이론
MonoBehaviour
System.Object
└── UnityEngine.Object
└── UnityEngine.Component
└── UnityEngine.Behaviour
└── UnityEngine.MonoBehaviour
UnityEngine.Component
UnityEngine.Behaviour
UnityEngine.MonoBehaviour
- C# 코드를 컴포넌트로 인식시켜준다.
- Unity 생명주기 함수를 감지하여 Unity 실행 사이클에 진입할 수 있게 해주는 클래스이다.
- 코루틴을 지원한다.
Unity 이벤트 함수
- Unity가 리플렉션으로 코드를 스캔한다.
- 이벤트 함수는 매번 리플렉션하지 않고 함수 주소를 캐싱한다.
- 이벤트 함수와 동일한 이름의 함수가 있으면 콜백으로 등록하여 이벤트 핸들러처럼 호출된다.
MonoBehaviour 내부에 생명주기 함수가 선언되어 있지 않다.
- 이벤트 함수를 선언하지 않으면 Unity는 그 함수를 콜백으로 등록하기 않아서 해당 생명주기 함수는 실행되지 않는다.
- 빈 함수라도 있으면 Unity가 그 함수를 호출한다.
- Initialization
1) Awake()
2) OnEnable()
3) Start()
- Physics
4) FixedUpdate()
5) OnTriggerXX()
6) OnCollsionXX()
7) yield WaitForFixedUpdate()
- Input Event
8) OnMouseXX()
- Game Logic
9) Update()
10) yield WaitForSeconds()
11) 애니메이션 업데이트
12) LateUpdate()
- Scene Rendering
- Gizmo Rendering
13) OnDrawGizmos()
- Decommisioning
14) OnApplicationQuit()
15) OnDisable()
16) OnDestory()
Initialization
Awake()
OnEnable()
Start()
- 첫 Update() 함수가 실행되기 전에 호출된다.
호출 여부
- 오브젝트를 활성화 상태로 생성
Awake() > OnEnable() > Start()
- 오브젝트를 비활성화 상태로 생성
- 비활성화 오브젝트를 활성화
OnEnable() > Start()(실행된 적 없으면)
Physics
FixedUpdate()
- 일정한 시간 간격(
Time.fixedDeltaTime)마다 호출된다.
- 물리 연산과 관련된 로직이 필요할 때 사용한다.
- 한 프레임당 두 번 실행될 수도 있다.
Game Logic
Update()
- 함수는 매번 리플렉션하지 않고 함수 주소를 캐싱한다.
LateUpdate()
- 애니메이션 업데이트 후에 호출된다.
- ex) 카메라 트레킹, UI 정보 갱신
Fake Null
- Unity에서
UnityEngine.Object를 Destroy()로 파괴했을 때, GC에 의해 메모리에서 완전히 해제되기 전까지 == null 비교에서는 null처럼 보이지만, 실제로는 여전히 메모리에 존재하는 객체 상태를 말한다.
Physics
transform.position: 월드 좌표
Vector: 구조체
- 구조체이기 때문에 실제
transform.position의 복사본을 반환한다.
transform.position.x = 3f;: 컴파일 에러
transform.localPosition: 부모 게임 오브젝트 기준 로컬 좌표
transform.localScale:부모 게임 오브젝트 기준 배율
transform.parent: 부모 게임 오브젝트
Pivot & Anchor
- Pivot
- UI 객체 본인의 기준점이다.
- ex) 왼쪽 위 모서리를 기준으로 회전하려면: pivot = (0, 1)
- Anchor
- 부모 UI
RectTransform의 범위 안에서 UI 객체가 고정될 위치이다.
- ex) 부모 왼쪽 아래 고정: anchorMin = (0, 0) / anchorMax = (0, 0)
부모 전체에 꽉 차게: anchorMin = (0, 0) / anchorMax = (1, 1)
Rotation & Quaternion
- Rotation
- 오일러 각도(x, y, z)로 회전을 표현한다.
- 사람이 보기에 직관적이다.
- Quaternion
- 수학적으로 4개의 값(x, y, z, w)로 회전을 표현한다.
- 짐벌락이 발생하지 않는다.
- 짐벌락: 같은 방향으로 두 회전축이 겹치는 현상
- 보간을 자연스럽게 적용할 수 있어 회전을 부드럽게 처리할 수 있다.(Lerp(), Slerp())
transform.eulerAngles = new Vector3(0, 180, 0);
transform.rotation = Quaternion.Euler(0, 180, 0);
기타
LINQ(Language Integrated Query)
- C#에서 컬렉션(List, 배열 등)을 SQL과 비슷한 방식으로 간결하게 필터링, 정렬, 변환할 수 있게 해주는 문법
List<int> nums = new List<int> { 1, 2, 3, 4, 5 };
var even = nums.Where(n => n % 2 == 0).ToList(); // 짝수만
ScriptableObject
- 데이터를 에셋으로 저장하고 공유할 수 있는 클래스
- 메모리 상에서 하나만 존재하며, 코드 없이도 인스펙터에서 조작 가능
[CreateAssetMenu(menuName = "MyGame/EnemyData")]
public class EnemyData : ScriptableObject
{
public string enemyName;
public int hp;
}
Invoke()
- 지정한 함수(메서드)를 일정 시간 뒤에 자동으로 호출해주는 함수
- 복잡한 흐름 제어 어려움
- 매개변수 전달 불가능
Invoke("Attack", 2.0f); // 2초 후에 Attack() 함수 호출
InvokeRepeating("Heal", 1f, 5f); // 1초 후 시작, 5초마다 반복
CancelInvoke("Attack");