-
내일배움캠프 41일차 TIL - 2D/3D 게임 심화 개발TIL/Unity 2024. 6. 13. 12:04
[한 줄 요약]
유니티 심화 주차 강의를 학습하고 UGUI, 멀티플레이어, URP, 유한상태머신 등에 대해 학습했다. 또한 수준별 특강으로 NavMesh에 대해서 학습했다.
[학습 내용]
유니티 심화 주차 강의 2D
UGUI
UGUI
유니티의 기본 UI 시스템으로 게임 내의 사용자 인터페이스를 구축하는 데에 사용한다.
Canvas
UGUI에서 모든 UI 요소는 Canvas 컴포넌트 내에 배치된다. 3가지 렌더모드를 지원한다.
- Screen Space - Screen Overlay
카메라 설정이나 월드의 변화에 상관 없이 독립적으로 화면 위에 렌더링 한다. - Screen Space - Camera Overlay
특정 카메라가 실제 평면을 찍고 있는 것처럼 그린다. Order in layer에 따라 그려지지 않을 수도 있다. - World Space
월드 상의 공간에 게임 오브젝트처럼 UI를 그릴 수 있다.
Rect Transform
UI에서 기본 transform 대신 사용되는 요소로, 위치, 크기, 회전, 스케일 등을 지정하는 데에 사용된다. 앵커 및 피벗을 사용하여 부모와의 상대적인 위치를 지정한다.
- 앵커
UI 요소의 위치가 부모 요소에 의해 어떻게 정의되는가를 결정한다. UI 요소가 화면의 다양한 해상도와 크기에 동적으로 적응할 수 있게 해준다.
- 위치 지정 : 부모의 좌하단을 (0, 0), 우상단을 (1, 1)로 정의하고 처리를 결정한다.
- 스트레치 모드 : 특정 방향(가로, 세로, 또는 둘 다)으로 꽉 차도록 확정된다.
- 피벗
오브젝트 자체의 크기가 변하거나 회전할 때 어떻게 변화해야 할지를 정의한다.
TextMeshPro
원래 에셋스토어에 있는 인기 유니티 에셋에서 시작되었으나, 유니티 테크놀로지 사에 인수되어 유니티의 기본 기능으로 포함되었다. 텍스트에 관련된 고급 렌더링 시스템을 제공한다.
Coroutine
Coroutine
코루틴은 하나의 작업을 여러 개의 프레임에 분산할 때 사용한다. 주로 프레임 간의 지연, 비동기 작업, 시간에 따른 애니메이션 작업 등에 사용된다. IEnumerator 반환 타입의 함수에서 yield return을 사용하여 구현할 수 있고, StartCoroutine과 StopCoroutine 메서드를 통해 코루틴을 중지할 수 있다.
- yield return null : 다음 프레임까지 대기
- yield return new WaitForSeconds(float n) : n초 동안 대기
- yield return new WaitFixedUpdate() : 다음 프레임의 FixedUpdate까지 대기
- yield return WaitUntil(조건식) : 조건을 만족할 때까지 대기
- yield return startCoroutine(string s) : 다른 코루틴 s가 끝날 때까지 대기
- yield return new www(string s) : 웹 통신 작업 s가 끝날 때까지 대기
Switch식
Switch식
C# 8.0부터 지원하는 방식으로, 기존 switch문의 case 부분을 간결하게 표현한 식이다.
예제 코드
Func<float, float, float> operation = modifier.statsChangeType switch { StatsChangeType.Add => (current, change) => current + change, StatsChangeType.Multiple => (current, change) => current * change, _ => (current, change) => change };
멀티플레이어
틱 빈도(Tick Rate)
게임 서버가 로직을 업데이트하는 빈도이다. 높을 시 부드러운 경험을 제공해주지만, 서버 부하를 증가시킬 수 있다.
연결 해제(Disconnect)
네트워크 불안정으로 인한 플레이어의 연결 해제는 게임 플레이에 부정적인 영향을 미칠 수 있다. 재연결 시 어떻게 처리될 지에 대한 방법을 정의해야 한다.
클라우드 및 멀티플레이어 솔루션
Photon PUN2
- 유니티와의 긴밀한 통합으로 인해 많은 인디 개발자들에게 선호
- 빠른 프로토타이핑과 멀티플레이 기능을 구현
- 자동 확장(Auto Scaling), 간단한 매치 메이킹
- 동시 접속 유저 수가 적은 게임에 적합
UGS(Unity Gaming Service)
- 유니티 게이밍 서비스 내의 NetCode for GameObjects는 멀티플레이어 게임 개발을 위한 유니티의 공식 솔루션
- 안정적이고 확장 가능한 멀티플레이어 게임 구축 가능
- 자동 확장, 복잡한 매치 메이킹
- 동시 접속 유저 수가 적은 게임에 적합
Firebase(Google 사)
- 간단하고 빠르게 기초적인 백엔드 기능 구현
- 인증, 데이터베이스 관리 등 다양한 기능 제공
- 초기 단계의 프로젝트에 적합
- 데이터 서버 저장, 인증 기능 등을 적용해야 하는 싱글 플레이어 게임에 적합
PlayFab(Microsoft 사)
- 클라우드 기반 백엔드 플랫폼
- 한국에서는 커뮤니티 지원이 다소 부족
- 데이터 서버 저장, 인증 기능 등을 적용해야 하는 싱글 플레이어 게임에 적합 (Firebase에 비해 게임에 조금 더 특화)
뒤끝(Back-End)
- 한국어 지원과 친절한 문서로 한국 개발자들에게 인기
- 길드, 우편함 등의 기능을 포함한 포괄적인 서비스 제공
- 비용이 다소 높을 수 있음
- 양산형 게임 중 데이터 서버 저장, 인증 기능 등을 적용해야 하는 싱글 플레이어 게임에 적합
포톤(Photon)
특징
- Real-Time, Multiplayer
- Dead-easy API
- Loadbalanced
주요 클래스
- PhotonNetwork
- ConnectUsingSettings()
포톤 클라우드에 접속한다. 연결 상태는 PhotonNetwork.IsConnected로 확인 - CreateRoom(string RoomName)
JoinRoom(String RoomName)
방을 생성하거나 생성된 방에 접속한다. - Instantiate()
네트워크로 동기화되는 오브젝트를 생성한다.
- ConnectUsingSettings()
- MonoBehaviourPunCallbacks
포톤은 주요 이벤트들을 콜백으로 관리하며, 이를 오버라이딩하여 주요 로직을 쉽게 관리할 수 있다.
- OnConnectedToMaster()
포톤 서버에 접속 시 호출된다. - OnJoinedRoom()
플레이어가 방에 입장하면 호출된다. - OnPlayerEnteredRoom(Player newPlayer)
새로운 플레이어가 접속했을 때 발생한다. - OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changeProps)
커스텀 프로퍼티가 변경되었을 때 발생한다. - OnRoomListUpdate(List<RoomInfo> roomList
방 목록이 변경되었을 때 발생한다.
- OnConnectedToMaster()
주요 컴포넌트
포톤은 포톤뷰(PhotonView)를 통해 네트워크 동기화를 진행하며, 포톤뷰를 추가한 오브젝트들은 동기화의 대상인 게임오브젝트가 된다. 그리고 변경된 상태를 알리기 위해 다양한 방법을 사용하는데, 대표적인 방법은 RPC가 있다.
포톤은 뷰를 컴포넌트에 등록하는 것만으로 복잡한 동기화를 간편하게 할 수 있도록 만들어졌는데, 대표적인 것이 TranformView, AnimatorView, RigidbadyView이다. 이것들을 사용하면 RPC 없이도 자동으로 상태가 동기화된다.
RPC(Remote Procedure Call)
동기화에 대한 기능을 하며, 포톤뷰가 장착된 게임오브젝트의 상태를 동기화하는 데 사용한다. [PunRPC] 애트리뷰트를 부착하여 사용하며, 실행 시에는 PhtonView.RPC("method", target, [prameter])의 형태로 작성한다.
멀티플레이 환경에서의 작동 원리는, 마스터 오브젝트를 하나 두고 여러 유저들에게 복제(Clone)된 마스터 오브젝트를 나눠준다. 각 유저 A, B, C가 가진 오브젝트에 변경 사항이 있다면, 이를 복제하여 다른 유저들에게 알려주고 변경사항을 모든 유저에게 똑같이 적용시킨다.
유니티 심화 주차 강의 3D
유한 상태 머신(FSM, Final State Machine)
FSM 개념
유한한 개수의 상태들로 구성된 기계 및 패턴을 말하며, 상태와 상태 간의 전환을 기반으로 하는 동작기반 시스템이다.
구성 요소
- 상태(State) : 시스템이 취할 수 있는 다양한 상태
- 전이 조건(Transition Condition) : 상태 간 전환을 결정하는 조건
- 동작(Action) : 상태에 따라 수행되는 동작 또는 로직
동작 원리
초기 상태에서 시작하여 상태 전이을 수행한다. 상태 전이은 전이 조건을 충족할 때 발생하며, 전이 조건은 입력, 시간, 조건 등으로 결정된다. 상태 전이 시 이전의 상태 종료 동작과 새로운 상태 진입 동작이 수행된다.
Switch-Case문을 활용한 FSM
FSM을 가장 간단하게 구현할 수 있는 방법이나, 코드가 길어지는 등의 유지보수의 어려움이 생길 수 있다.
상태 패턴(State Pattern)을 활용한 FSM
객체지향의 다형성을 활용하는 방법으로, 상태를 명확하게 정의하고 상태 간 전환을 일관되게 처리할 수 있다. 복잡한 동작을 상태와 전이 조건으로 나누어 구현하므로 코드 유지보수가 용이하다.
Character Controller
Character Controller 컴포넌트
유니티에서 물리엔진이 아닌 캐릭터의 움직임을 프레임 기반으로 처리하며, 주로 3D 캐릭터를 제어하는 데에 사용된다. Rigidbody 컴포넌트와 물리 처리를 사용하지 않는 3인 또는 1인 플레이어에 주로 사용한다. 그래서 중력과 점프 기능 등을 직접 개발해야 한다. 이외에는 충돌 처리, 바닥 검출, 움직임 제한 등을 지원한다.
URP(Unity Rendering Pipeline)
유니티의 렌더링 파이프라인
- Built-in : 기본 파이프라인, 커스텀 확장에 제한적이다.
- SRP(Scriptable Rendering Pipeline)
- URP
- HDRP
URP
- Cross-Platform Compatibility : 유니티가 지원하는 모든 플랫폼에서 동작한다.
- Performance and Scalability : 성능과 확장성에 초점을 둔다. 저사양 환경에서도 뛰어난 성능을 낼 수 있고, 그래픽 설정이 편리하다.
- Modern Rendering Features : 현대적인 기술(라이트 유형, 표준 쉐이딩 모델, 환경 리플렉션 등)을 제공한다.
- Customizability : 사용자 정의 파이프라인 등으로 유연성을 높였다.
- Graphics Quality : 향상된 라이트 모델, 표면 쉐이딩, 포스트 프로세싱 효과 등으로 높은 품질의 그래픽을 제공한다.
- Simplicity : 기존 렌더링 시스템에 비하여 단순하기 때문에 사용하기 쉽다.
NavMesh 특강
Navigation(Obsolete)
Baked Agent Size
- Agent Radius : NavMesh Agent 컴포넌트가 달린 이동 예상 객체의 지름
- Agent Height : 이동 예상 객체의 높이
- Max Slope : 올라갈 수 있는 최대 경사각
- Step Height : 한 번에 올라갈 수 있는 턱의 높이
Generated Off Mesh Link
OffMeshLink는 지나갈 수 없는 길이라도 링크(일종의 포탈)를 통해 길로 인식할 수 있게 해준다. 아래의 설정값은 자동으로 만들어진 경우 어디까지 링크로 만들 것인지 설정하는 값이다. 보통 위에서 아래로 진행하는 경우만 자동 생성된다.
- Drop Height : 위에서 아래로 떨어질 수 있는 높이
- Jump Distance : 점프할 수 있는 거리
Areas
각 지역의 cost를 올려주는 것과 같은 개념이다. A* 알고리즘을 기반으로 하고 있기 때문에 cost가 높으면 그 곳을 지나가는 경로의 우선순위가 낮아진다.
Navigation
기존 Navigation(Obsolete)과의 차이
새로운 버전의 Navigation이 나왔기 때문에, 이제는 더 이상 위의 기존 네비게이션을 사용하는 것이 권장되지 않는다.
Agent type
다양한 이동 객체의 속성들을 이름을 정의하여 저장해놓을 수 있다.
NavMesh Modifier
경로를 계산할 때 이 컴포넌트가 추가된 오브젝트를 포함할 것인지 무시할 것인지 선택할 수 있다.
NavMeshLink
OffMeshLink는 수동으로 transform을 지정해줘야 하는데, NavMeshLink는 간편하게 지정해줄 수 있다.
Agent Link Mover
Method 속성을 통해 이동할 때 순간적으로 이동할지, 혹은 서서히 이동할지, 혹은 점프하듯이 이동할지 선택할 수 있다.
NavMesh Plus
2D용 NavMesh
유니티 정식 지원은 아니고 따로 깃허브에 올라와있다.
링크
https://github.com/h8man/NavMeshPlus
[회고]
오늘 강의를 다 끝내려고 했는데, 생각보다 진도가 늦게 나간 거 같다. 오늘 밤에 조금 더 들어보고 내일 프로젝트를 시작할 수 있게 해야겠다.
'TIL > Unity' 카테고리의 다른 글
내일배움캠프 43일차 TIL - 유니티 심화 주차 개인 과제 1 (0) 2024.06.17 내일배움캠프 42일차 TIL - 3D 게임 심화 개발 (0) 2024.06.14 내일배움캠프 40일차 TIL - 2D 게임 심화 개발 1 (0) 2024.06.12 내일배움캠프 39일차 TIL - 3D 게임 기초 개발 - 팀 프로젝트 6 (1) 2024.06.11 내일배움캠프 38일차 TIL - 3D 게임 기초 개발 - 팀 프로젝트 5 (0) 2024.06.10 - Screen Space - Screen Overlay