2022.09.19 ~ 20 경일 메타버스 25주차 1 ~ 2일 특강 수업내용. 유니티 복습 정리
Toolbar / Hierarchy Window / Game View / Scene View / Overlays / Inspector Window / Project Window / Status Bar
이 외의 UI는 Window 메뉴에서 열 수 있다.
간단한 조작법은 알아야 한다.
Scene & GameObject
Unity에서 존재하는 모든 오브젝트를 말한다.
기능을 구현하는 컴포넌트(Component)의 컨테이너 역할을 한다.
GameObject는 계층적으로 다른 GameObject를 가질 수 있다.
모든 GameObject는 Transform을 가진다.
Transform은 좌표계에서의 위치, 회전, 스케일을 표현한다.
Transform은 월드 혹은 부모 GameObject로부터의 상대적인 좌표를 나타낸다.
움직임이 없는 GameObject는 Static으로 설정
프로토타입을 만들 때 사용하는 Primitive GameObject가 있다.
Component
GameObject의 기능적인 단위. 즉, 하나의 기능을 담당하는 스크립트.
Unity는 다양한 Component를 내재하고 있다.
우리만의 Component를 작성하기 위해선 C# 문법을 알아야 한다.
public 필드의 경우 Unity Editor 상에서 인터페이스로 나타난다.
혹은 SerializeField 특성을 사용
모든 Component는 MonoBehaviour를 상속 받는다.
MonoBehaviour에는 Unity 엔진에 의해 호출되는 여러 이벤트 메시지가 정의되어 있다.
Awake() → OnEnable() → Start(0 → FixedUpdate() → Update() → LateUpdate() → OnDisable() → OnDestroy()
각 이벤트 메시지가 언제 호출되는지 정확히 알아야 정확한 구현이 가능하다.
Input Manager : Unity에 내장된 기본 입력 방법
Input System : 추가 패키지
Interaction ( Collision )
GameObject가 어떤 다른 것과 상호작용할 수 있는지를 정의
Layer Matrix 설정 방법 알아야 함.
Layer 체크는 비트를 사용
0번부터 31번까지 사용 가능
Character Control : 아래의 두 방법은 게임 플레이 설계에 따라 다르게 적용한다.
Rigidbody
Character Controller
혼용은 권장되지 않음
물리 기능을 제공하는 Component
힘과 관련된 기능을 제공
Collider와 함께 사용해서 충돌 처리에 사용
Kinematic Rigidbody : 물리 엔진 대신 스크립트에 의해서 동작하는 Rigidbody
Rigidbody는 최상위 GameObject에 단 하나만 부착해야 한다.
물리적인 표면을 제공하는 Component
하나의 GameObject에 여러 개의 Collider를 부착할 수 있다.
Rigidbody 없이도 Collider를 부착할 수 있으며, 이를 Static Collider라고 한다.
다른 Collider의 진입을 허용하려면 Trigger로 만들어주면 된다.
Collider에 의해 충돌이 발생할 때 호출되는 이벤트 메시지가 존재한다.
OnCollisionEnter / OnCollisionStay / OnCollisionExit
OnTriggerEnter / OnTriggerStay / OnTriggerExit
충돌은 이산적 → 연속적으로 바꾸려면 Rigidbody에서 CCD(Continuous Collision Detection) 설정이 필요
스크립트를 이용해서 상호작용
Raycast
Overlap
시간에 기반한 동작을 편하게 구현할 수 있는 서브루틴
StartCoroutine()으로 코루틴을 시작할 수 있고, StopCoroutine()으로 코루틴을 중지할 수 있다.
StartCoroutine()으로 같은 이름의 코루틴을 여러 번 실행할 수 있다.
StopCoroutine()으로 등록된 코루틴 중 첫 번째 것만 중단시킨다.
코루틴은 반드시 GameObject가 Active여야 한다.
Update() 이후에 실행된다.
위 두 가지 기능은 MonoBehaviour에 포함되어있다.
유한 상태 기계로 애니메이션을 구성할 수 있다.
각 상태에 따른 동작을 StateMachineBehaviour로 표현할 수 있다.
제공하는 추상 메소드 다섯 가지
OnStateEnter / OnStateExit / OnStateUpdate / OnStateMove / OnStateIK
Animation Event를 통해 애니메이션 실행 중 특정 시점에 메소드를 호출할 수 있다.
Audio
Audio Source : 소리를 내는 컴포넌트
Audio Listener : 소리를 듣는 컴포넌트
UI를 배치하는 컴포넌트
모든 UI 오브젝트는 Canvas의 자식으로 존재해야 한다.
Render Mode에 대한 이해가 필요하다.
Screen Space - Overlay : 스크린 공간에 덧씌워지는 UI로 Main UI를 표현하는 데 사용
Screen Space - Camera : 특정 카메라로부터 일정 거리에 배치되는 UI
World Space : 가상 세계에 배치되는 UI
Layout
Layout Group : Layout Element를 관리하며 Layout을 구성하는 컴포넌트
Layout Element : 구성 요소
단순히 정보를 제공하는 UI
Text / Image
유저와 상호작용할 수 있는 UI
Button / Toggle / Toggle Group / Slider / ScrollBar / Dropdown / Input Field / Scroll View
재사용 가능한 GameObject
Scene에 동일한 GameObject를 배치하거나, 프로그램 실행 중 인스턴스화를 할 때 사용
Resource Management
Resources API
Resources라는 특정 폴더에 있는 여러 에셋을 불러올 수 있다.
현재는 사용되지 않는다. ⇒ 최적화 이슈 때문 (빌드에 포함되어 용량이 커진다)
Tip
Unity GC
압축이 일어나지 않아 메모리 단편화가 발생하기 쉽다.
참조 타입의 객체를 생성할 때는 항상 주의해야 한다.
Object Pooling으로 미리 사용할 객체를 다 만들어 재사용한다.
Unity 2021 버전 이후부터 ObjectPool을 지원한다.
참고
Hash값 사용하기
Animator나 Material 사용 시 Hash값 사용
유용한 메소드
UnityEngine.Object 서브 클래스에 대해서 Null 체크 되도록 피하기
Update() 같은 반복적으로 호출되는 메소드에서 컴포넌트 등의 Null 체크를 하지 않도록 주의한다.
Unity 자체적으로 관리를 하기에 C, C++ 등의 다른 언어에 비해 자원을 많이 사용한다.
Conditional