유니티 기초 간단 정리

김찬수·2023년 5월 10일
0

Unity

목록 보기
1/15

게임 오브젝트
게임 내 존재하는 모든 객체
기능을 정의하고 있는 컴포넌트들을 관리하는 객체

Mesh Renderer
Mesh Filter를 기반으로 그려주는 컴포넌트
Material, Lighting, Probes, Additional Settings 설정 가능

.NET in Unity
Unity는 C# 스크립트 코드를 컴파일하기 위한 스크립트 백엔드 환경이 존재
IL2CPP - AOT 컴파일 방식
Mono - JIT 컴파일 방식
IL2CPP를 사용하는 것이 성능적으로 더 좋음
C#코드를 컴파일하면 스트리핑을 실시해 애플리케이션 크기를 줄임
스트리핑은 사용되지 않는 코드를 삭제하는 것인데 이 때문에 원치 않게 버그를 맞이할 때도 있음

유니티에서 처음 컴포넌트를 만들게 되면 C# 프로젝트가 생성이 됨
Assembly-CSharp, Assembly-CSharp-Editor
게임 플레이와 관련된 여러가지 코드가 들어감

3rd-party 라이브러리를 사용하려면
1. [Plugins] 폴더 생성
2. 버전에 맞는 csvHelper파일 넣기

네이티브 메모리 : 엔진이 내부적으로 사용하고 있는 메모리 관리 시스템. 유저가 직접적으로 접근하거나 조작할 수 없음.

관리되는 메모리 : 가비지 컬렉터에 의해 자동으로 관리되는 메모리. 세대별로 관리되지 않고 메모리의 압축 또한 일어나지 않음. 그래서 메모리 단편화가 일어나 힙이 쉽게 확장될 수 있음.

유니티에는 특수 폴더가 있음
Assets : 메인 폴더.
Editor : Editor 기능을 확장하기 위한 코드가 들어감. 커스텀 에디터 창을 만들 수 있음.
Resources

스크립트 컴파일 순서
Unity Editor > Assembly-Csharp > Assembly-Csharp.dll > 실행파일
UnityPlayer.dll > 실행파일

게임엔진(유니티)으로 개발하는 이유
1. 환경 구현
2. 게임플레이 구현
3. UI 구현
이외에도 각종 구현에 유리하기 때문

게임 오브젝트를 어떻게 구성할 것인가? 가 중요한 포인트가 됨
어떠한 오브젝트에서 어떤 컴포넌트를 부착할 것인지, 어떤 효과를 줄 것인지 등등 여러 가지를 고려해야함
여러 기능을 구현하다보면 유니티에서 제공하는 컴포넌트만으로는 모든 기능을 구현하기가 어렵기 때문에 필요하다면 직접 컴포넌트를 만들어줘야 함

컴포넌트 제작하기
컴포넌트는 기능성을 담당하는 객체
유니티 프로그래머는 애플리케이션을 구현하기 위해 필요한 컴포넌트를 스스로 제작할 수 있음

어떤 것을 컴포넌트로 만들어야 하는가?
1. 게임 루프에 종속이 되어야 하는것들을 컴포넌트로 만들어야 함
2. 어떠한 이벤트 함수를 받아서 처리해야 하는 스크립트만 MonoBehaviour를 상속받아서 컴포넌트화 시켜주어야 함
3. 데이터만 다루는 스크립트를 굳이 컴포넌트로써 사용할 필요가 없음

User Data - mono state로 구현하면 편함
(싱글톤 패턴을 변형한 것이기 때문에 결합도는 올라감)

  • 유저 데이터 : 유저가 가지고 있는 재화, 퀘스트의 진행상태, 유저의 레벨, 롤에서의 유저가 저장해놓은 스펠과 특성 등등
  • 아이템 중에서도 와드나 포션의 남은 갯수를 표현하는 것, 아이템이 랜덤하게 상태를 변형시키거나 하는 것 등등은 아이템이지만 유저데이터

Game Data

  • 게임 데이터 : 롤에서 유저가 조종하게 되는 챔피언, 아이템 등등

유니티에서 제공하고 있는 프레임워크
프레임워크를 제공하고 있는 class가 MonoBehaviour
MonoBehaviour에서 어떤 메소드가 정의되어 있고, 이벤트 함수가 언제 호출이 되는지 알아둬야 한다.

모듈
Debug - 디버그를 위한 기능
GameObject - 게임오브젝트와 관련된 기능
Transform - 트랜스폼과 관련된 기능
Vector2/Vector3 - 벡터
Quaternion - 사원수
Physics - 물리와 관련된 기능
Resources - [Resources] 폴더 아래에 존재하는 에셋 접근
AssetDatabase - [Assets] 폴더 아래에 존재하는 에셋과 관련된 기능
Mathf - 수학
Time - 시간
Random - 랜덤
Input - 입력

입력
InputManager(Old) : 가상 축을 이용해 워크플로우를 구성
조건문을 이용해서 입력 처리, 입력 값을 저장하는 컴포넌트를 생성하여 처리

Input System(New) : 새로운 입력 시스템 소개 | Unity Blog
Input System을 사용하면 여러 플랫폼에 대응하기 유리해짐

직렬화 (SerializeField)
스크립트는 직렬화되며 직렬화된 데이터를 유니티 데이터가 파싱해서 인스펙터 인터페이스로 구성

시간
유니티는 2가지 시간을 가지고 있음

  • deltaTime, fixedDeltaTime(고정)

FixedDeltaTime = (time - fixedTime) / fixedDeltaTime

벡터
방향과 크기를 가지고 있음
다양하게 활용할 수 있으나, 위치를 지정할 때 주로 이용
다양한 보간법을 사용하면 좀 더 역동적인 움직임을 구현할 수 있음

회전

오일러 각
각 축에 대해서 회전값을 나타내는 방식
각 축에 대한 회전을 차례대로 계산하여 최종 회전을 얻어냄 -> 짐벌락 발생할 수 있음

사원수(Quaternion)
3차원 공간의 회전을 한 번에 계산하기 위해 사용 -> 짐벌락 발생x

물리

리지드바디(Rigidbody)
물리에 기반한 움직임을 구현하도록 도와주는 컴포넌트 -> Rigidbody
리지드바디가 부착된 게임오브젝트의 트랜스폼은 유니티에 내장된 물리 엔진에 의해서 계산됨
리지드바디에는 힘을 부여할 수 있다.
리지드바디가 부착된 게임오브젝트에 키네마틱으로 설정을 해주면 물리 엔진의 영향을 받지 않지만, 다른 리지드바디 게임오브젝트에는 물리적인 영향을 줄 수 있음

콜라이더(Collider)
물리적인 표면을 정의하는 컴포넌트

  • 프리미티브 콜라이더
    Box / Sphere / Capsule
  • 트리거 콜라이더
    충돌 감지 전용 콜라이더

충돌이라는 것은 게임오브젝트 간 상호작용이 일어난 것을 의미한다. 우리가 기능을 구현하려면 충돌 시점이 필요하다.

충돌 콜백
유니티에서는 리지드바디와 콜라이더를 어떻게 조합하냐에 따라서 충돌 콜백이 보내질 수도 있고, 보내지지 않을 수도 있다.

정적 콜라이더(Static)
콜라이더 컴포넌트만 있고, 움직이지 않는 게임오브젝트

동적 콜라이더(Dynamic) / 리지드바디 콜라이더
리지드바디 / 콜라이더 컴포넌트가 있고, 움직임이 있는 게임오브젝트

키네마틱 리지드바디 콜라이더 (Kinematic)
리지드바디 / 콜라이더 컴포넌트가 있는데, 리지드바디에 키네마틱이 체크. 이 게임오브젝트는 다른 오브젝트에게서 물리적인 영향을 받지 않지만, 다른 오브젝트에 물리적인 영향을 주고 싶을 때 사용
충돌 콜백은 충돌한 양측 모두에게 전달된다.

OnCollision : 둘 중 하나라도 동적 콜라이더일 때

OnTrigger : 둘 다 정적 콜라이더(or 트리거)라면 발생X

레이어
게임오브젝트의 그룹
충돌과 렌더링에 사용

연속 충돌 검사(CCD)
빠른 속도로 움직이는 게임오브젝트에 대한 충돌을 감지할 수 있게 할 수 있다.

Physics
콜라이더를 코드로 검출할 수 있다.

Cast / Overlap / Check
여러 개를 검출할 때 NonAlloc 사용 가능

Prefabs
완성된 게임오브젝트를 재사용하기 위해서 사용

애니메이션
메카님(Mecanim)

애니메이션 클립 : 시간에 따른 각 컴포넌트의 프로퍼티 변경에 대한 데이터와 이벤트 관리

애니메이터 : FSM(유한 상태 머신 : Finite State Machine) 기반으로 애니메이션 관리

오디오

AudioListener
Audio를 듣는 주체를 정해줄 수 있는 컴포넌트로 게임 내 단 하나만 존재해야 함
기본적으로 메인 카메라에 장착되어 있음

Audio Source : Audio를 재생하는 컴포넌트

Audio Mixer : Audio를 믹싱하는 컴포넌트

UI
런타임용으로 구성할 수도 있고, 에디터를 위해서 구성할 수도 있다.
UI Toolkit / UGUI / IMGUI 가 있음

UGUI
Canvas : UI 요소가 배치될 수 있는 영역

  • 모든 UI 요소는 캔버스의 자식 게임오브젝트로 존재해야 함
  • 첫 번째 자식부터 순서대로 그려나감
  • 캔버스에 속해있는 UI 요소 중 하나라도 변경 사항이 있다면 캔버스의 모든 UI 요소를 다시 그림
  • 따라서 관련 있는 UI 요소끼리 모아 캔버스를 최대한 작게 분할해야 함

Render Mode

  • Screen Space - Overlay
  • Screen Space - Camera
  • World Space

Canvas Scaler : 캔버스에 속한 모든 UI 요소의 스케일을 조정하는 컴포넌트
Scale With Screen Size를 많이 사용함

초보 개발자가 기억이 나지 않을 때 꺼내어 보기 위해 기록하는 공간입니다. 틀린 점이 있다면 댓글로 알려주시면 정말 감사하겠습니다.

profile
프로그래머 지망생

0개의 댓글