[Unity Skill] Unity 이론

scarleter99·2024년 11월 11일

[Unity] Unity Skill

목록 보기
1/6
post-thumbnail

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가 그 함수를 호출한다.
  1. Initialization
    1) Awake()
    2) OnEnable()
    3) Start()
  2. Physics
    4) FixedUpdate()
    5) OnTriggerXX()
    6) OnCollsionXX()
    7) yield WaitForFixedUpdate()
  3. Input Event
    8) OnMouseXX()
  4. Game Logic
    9) Update()
    10) yield WaitForSeconds()
    11) 애니메이션 업데이트
    12) LateUpdate()
  5. Scene Rendering
  6. Gizmo Rendering
    13) OnDrawGizmos()
  7. Decommisioning
    14) OnApplicationQuit()
    15) OnDisable()
    16) OnDestory()

Initialization

  • Awake()
    • 객체가 생성될때 호출된다.
  • OnEnable()
    • 컴포넌트가 활성화될 때 호출된다.
  • Start()
    • 첫 Update() 함수가 실행되기 전에 호출된다.

호출 여부

  • 오브젝트를 활성화 상태로 생성
    • Awake() > OnEnable() > Start()
  • 오브젝트를 비활성화 상태로 생성
    • Awake()
  • 비활성화 오브젝트를 활성화
    • OnEnable() > Start()(실행된 적 없으면)

Physics

  • FixedUpdate()
    • 일정한 시간 간격(Time.fixedDeltaTime)마다 호출된다.
    • 물리 연산과 관련된 로직이 필요할 때 사용한다.
    • 한 프레임당 두 번 실행될 수도 있다.

Game Logic

  • Update()
    • 함수는 매번 리플렉션하지 않고 함수 주소를 캐싱한다.
  • LateUpdate()
    • 애니메이션 업데이트 후에 호출된다.
    • ex) 카메라 트레킹, UI 정보 갱신

Fake Null

  • Unity에서 UnityEngine.ObjectDestroy()로 파괴했을 때, GC에 의해 메모리에서 완전히 해제되기 전까지 == null 비교에서는 null처럼 보이지만, 실제로는 여전히 메모리에 존재하는 객체 상태를 말한다.

Physics

Transform

  • transform.position: 월드 좌표
    • Vector: 구조체
    • 구조체이기 때문에 실제 transform.position의 복사본을 반환한다.
      • transform.position.x = 3f;: 컴파일 에러
  • transform.localPosition: 부모 게임 오브젝트 기준 로컬 좌표
    • Vector
  • transform.localScale:부모 게임 오브젝트 기준 배율
    • Vector
  • transform.parent: 부모 게임 오브젝트
    • Transform: 클래스

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");

0개의 댓글