공부하기 싫을 때 쓰는 블로그

[메타버스..?] 유니티 MLAPI multiplayer 셋업 본문

갈 곳 없는 이야기들

[메타버스..?] 유니티 MLAPI multiplayer 셋업

Dalcomi20 2021. 9. 22. 00:10
더보기

Writer Info > 전기과 3학년 대학생... 테크는 아마 네트워크나 디지털회로설계 중 하나?  

 코딩은 cpp 한학기 배웠고 C# 독학으로 작년 겨울에 unity랑 같이 공부함. 

Article Info > 이 글은 Unity를 깐지 일주일도 안된 독자들을 대상으로 쓴 글입니다. 30min read (영상 포함)

  2021년 9월 작성.

 

 

metaverse에 대해서 요즘 뉴스나 주식에서 많이 다뤄지고 있다. 

한국에서는 대표적으로 네이버에서 Zepeto를 서비스 중이다.

(잼민이들 많다고 그래서 접속은 안해봤지만 조만간 용기내어 들어가보고 후기 써볼 예정이다)

영상은 ITZY의 not shy 뮤비 제페토 버전. 

(카카오도 뛰어들려나 모르겠다. 삼성 SDI는 생각 있는 것 같던데..) 

https://www.youtube.com/watch?v=tvTdg7sgsgU 

뮤비 뿐만 아니라, 공식적인 비즈니스 미팅도 Zepeto에서 개최하기도 했다.

3살부터 태블릿이 가장 친한 친구인 한국만 그런 것은 아니다. 

 

얼마 전 facebook 사장이 자기회사를 metaverse 회사로 생각해달라고 한 건 유명한 일이다.

(일단 내가 알면 유명한거임)

instagram으로 잘 알려져 있는 facebook에서 무슨 정신으로 이런 얘기를 한 건지,(인별 버전 2인가?)

metaverse에 대해서 잘 정리해 놓은 WashingtonPost의 글을 첨부한다. (영어주의)

 

https://www.washingtonpost.com/technology/2021/08/30/what-is-the-metaverse/

뭐 결국 미래 먹거리 얘기이다. 내 취업 준비 이야기이도 하고,,

페북이 배팅하면 나는 올인해야지... 까진 아니고.... (사실 맞다) 그냥 코딩 공부할 겸 메타버스를 만들어보기로 했다.

 

어떤 메타버스냐고 하면... 나는 제페토 보단 19금게임 minecraft가 먼저 떠오른다.

 

초등학교 때 잠깐 했던 게임 (어 19금인데 어떻게 했지)이자 내 인생 마지막 게임이었다. (공부 처돌이가 되어서..)

기본적으로 블록들가지고 이것저것 짓는 멀티플레이어 게임이다.

사실 metaverse가 멀티플레이어 게임하고 비슷한거 아닌가.. 일단 지금 내 이해는 그정도 밖에 안되긴 하다. 

 

그럼 metaverse = 엄청 큰 멀티플레이어 게임.. 이라는 naive한 이해해서 시작하자면,

metaverse를 만들려면 일단 multiplayer게임을 만들 수 있어야 할텐데..

 

멀티플레이 게임을 만들려면 어떻게 해야할까..

cpp의 boost.asio를 써서 tcp endpoint만들고 socket으로 채팅창도 만들어보고

(코린이 쫄지마.. 그냥 예제코드 복붙하면 5분컷이다.)

데이터네트워크 강의를 학교에서 3주째 듣고 있지만,,

간단한 socket 채팅과 멀티플레이어 게임 사이에는 너무나도 먼 간극이 있는 것 같다..

내가 CPP 소켓에서부터 멀티플레이어 게임서버를 직접 만들려면... 오바고,

 

결국 Unity라는 게임엔진을 써보기로 했고, 무료로 다운로드 받았다.

https://unity3d.com/get-unity/download

 

Download Unity!

Unity is the ultimate game development platform. Use Unity to build high-quality 3D and 2D games, deploy them across mobile, desktop, VR/AR, consoles or the Web, and connect with loyal and enthusiastic players and customers.

unity3d.com

다운로드가 쪼께 오래 걸리니까 그동안은 이 글을 마저 읽으면 된다.

(비주얼 스튜디오를 따로 다운받아야 했던가? 하여간 installer가 뭐가뭐가 필요한데 없다 내가 다운 받을까 이런거 물어볼때 적당히 yes yes 하면 알아서 잘 된다..)

 

Unity에서 멀티플레이어 게임을 만들려면 MLAPI 라는 것을 이용하라고 권장하고 있다.

Multi... L? A? Player Interface?? 하여간 이게 네트워킹을 해주는 패키지 같으니까 설치해주자.

 

설치 방법은 아래 링크를 따라하자.

PC에 git이 설치되어 있지 않으면 그거 먼저 설치하고 컴퓨터를 재시작 하라고 하는게 조오오금 귀찮다.

 

Install MLAPI | Unity Multiplayer Networking

Learn how to install the MLAPI package on Unity, including instructions for 2019.4+, 2020.x, and 2021.x. The package installs as MLAPI Networking Library.

docs-multiplayer.unity3d.com

 

먼저 유니티에서 새로운 프로젝트를 생성하면, SampleScene에 MainCamera, DirectionalLight 가 달려 나온다.

거기에 Ground (terrain)과 Player를 만들어 주고, MLAPI component를 가진 NetworkManager 오브젝트를 만들어줬다.

2021년 9월 기준 이걸 하는 과정은 아래 영상을 따라하면 잘 된다

(따라하기 비디오래서 따라해봤는데 버전 안맞고 뭐 지는 PRO쓰고 난 아니라서 안되면 킹받지...

내가 해봤으니 걱정 안해도 된다.)

https://www.youtube.com/watch?v=qJMXv5J4wf4&list=PLbxeTux6kwSAseRmJeCyvkANHsI16PoM6&index=1 

저 영상에서 두 플레이어를 한 컴에서 돌릴 수 있게 Project Cloner라는 걸 다운받으라는데 아래에 링크가 있다.

 

GitHub - hwaet/UnityProjectCloner: A tool to let the user to create a duplicate project that links back to the original, for mul

A tool to let the user to create a duplicate project that links back to the original, for multiplayer testing - GitHub - hwaet/UnityProjectCloner: A tool to let the user to create a duplicate proje...

github.com

 

근데근데 따라하다 보면 쉽지 않다.. 당장 처음 Unity를 접하면 어떻게 화면을 움직여야 할지도 잘 모르겠다.

그럴 땐 아래 다섯가지만 외우자. 

 

1. 단축키 : q w e r 순서대로 손 모드, move(이동)모드, rotate(회전)모드, scale모드로 들어감.
(메뉴 상단 왼쪽에 있는 순서대로!)
2. Alt + 마우스 드래그 = view 각도 조절, 스크롤 = view 확대 축소, 손 모드에서 드래그 = view 이동
3. Ctrl + d = gameobject 복제, Shift + del = gameobject 삭제, Rename = F2
4. 재생버튼 = 게임플레이모드 시작, 재생버튼 다시 누르면 = 게임 종료.
5. 어떤 object를 Hierarchy 에서 선택(클릭) 후 Shift+Ctrl+F = 현재 보고 있는 위치로 Object를 이동.

 

Ctrl A(전체 선택), Ctrl I(선택 반전), Ctrl Z(실행취소), Ctrl Y(취소한 액션 다시 적용) 등

기본적인 단축키는 여전히 유효하다. 단축키 정말 어마어마하게 많지만 일단 저정도만 알고 나머진 아래 참조

(아래는 사실 hotkey 지정하는 방법인데 거기에 목록이 다 있으니 그걸 보면되지 싶다)

https://docs.unity3d.com/Manual/UnityHotkeys.html

 

Unity - Manual: Unity shortcuts

Customizing your workspace Unity shortcuts The Shortcuts Manager is the main tool for managing Keyboard shortcuts in Unity. You can also configure shortcuts for the Mac trackpad. The Shortcuts Manager The Shortcuts manager lets you view and manage keyboard

docs.unity3d.com

그리고 또 기본적으로 알고있어야 할 유니티 상식 :

(사실 구글 치거나 책 하나 보면 다 나오는데 진짜 책 하나 읽을 시간도 부족한 나같은 사람을 위해 1/100으로 압축)

1. 새 프로젝트 설정:

- Mobile build관련 : 모바일 게임을 만드려면 File > Build Settings 에서 mobile을 체크해주자!

- preferences 와 project settings는 Edit 메뉴에 있다. 만질 거 있으면 여기서 설정 하고 시작하자.

- Input 설정: Project Settings에 있다. Axes에서 마우스로 컨트롤 할건지, 키보드로 컨트롤 할건지 등을 조정해주자.

- package manager : Windows 메뉴에 있다. 여기서 package를 import해올 수 있다.

- Visual Studio Unity syntax highlighting: visual studio installer에서!

2. Hierarchy 와 Transform

유니티에서 게임에 등장하는 것들은 (Network Manager, Controller, SceneManager 등을 포함해서)

웬만해서는 모두 gameObject이다.

화면 왼쪽의 Hierarchy 탭에서 gameObject들의 child-parent 관계를 설정할 수 있다. 

 

거기서 child object를 추가하고 싶은 object에 마우스 우클릭 > 원하는거 추가.. 하면 해당 object의 child로 더해진다.

이미 만든 object를 다른 object의 child로 설정하려면 드래그앤드롭.

 

Child의 Transform = (position, rotation, direction)+이것저것 은 parent의 위치를 기준으로 한다.

스크립트를 짜다 보니 분명 영상 그대로 따라했는데 자꾸 게임 플레이모드에 들어가니까 

만든 캐릭터가 땅을 뚫고 떨어진다;; 알고보니까 Character Controller 컴포넌트가 attach된 gameobject가

땅 아래부분과 겹치면 캐릭터가 땅 아래로 떨어진다고 한다.

나는 Hierarchy에서 Player 라는 Empty Object에 -  Character Controller Component(저 초록색 선)를 두고,

그 Child로 Cylinder mesh(저 하얀 알약모양)를 두었는데 어찌 잘못 조작했는지

Player는 땅속에 들어가 있고 그 child인 cylinder만 땅 위로 올라가 있었다...

cylinder가 땅밖에 나와있길래 Player도 밖에 있는 줄 알았지..

 

이렇게 child랑 그 parent 의 transform이 다를 수 있다.

이럴 때 child의 transform은 parent를 기준으로 상대적인 것임을 기억하자.

transform에 대해서는 아래 공식 documentation이 잘 설명해 주고 있다.

 

https://docs.unity3d.com/ScriptReference/Transform.html

 

Unity - Scripting API: Transform

Every object in a Scene has a Transform. It's used to store and manipulate the position, rotation and scale of the object. Every Transform can have a parent, which allows you to apply position, rotation and scale hierarchically. This is the hierarchy seen

docs.unity3d.com

3. Component와 Inspector.

Unity 화면 오른쪽에 보면 Inspector창이 있는데 여기서 gameobject에 이런저런 component들을 더할 수 있다.

NetworkManager object에는 Network Manager 컴포넌트,

Network될 gameobject들에는 NetworkObject, NetworkTransform 컴포넌트 등을,

Character에는 Character Controller 컴포넌트,

그리고 직접 코딩한 script들을 script 컴포넌트로 더할 수 있다.

 

script Component의 경우 script를 짤 때 PUBLIC 으로 선언한 변수들은 inspector에서 확인할 수 있다.

예를 들어 저기 cc라는 놈은 character controller라고 내가 Player Movement 스크립트에서

public CharacterController cc;

이렇게 선언한 변수다. 스크립트에서 선언만 하고 정의를 안했는데, 

inspector에서 저 Character Controller탭을 끌어다가 저 cc 자리에 drag-drop하면 그게 cc에 들어간다.

 

컴포넌트에 대해서는 아래 공식문서를 참고하자.

https://docs.unity3d.com/ScriptReference/Component.html

 

Unity - Scripting API: Component

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

4. Prefab 그리고 Runtime Object Instantiation

프리팹은 미리 gameobject의 prototype같은 거다. 

gameobject를 만들어놓고 그걸 아래쪽에 Project > Assets 에 드래그해넣으면 prefab이 되어서

그때그떄 필요할 때 instantiate해서 쓸 수 있다.

 

prefab에 대해서는 이 페이지 설명이 제일 좋다.

 

https://docs.unity3d.com/Manual/InstantiatingPrefabs.html

 

Unity - Manual: Instantiating Prefabs at run time

Variables and the Inspector Order of execution for event functions Instantiating Prefabs at run time PrefabsAn asset type that allows you to store a GameObject complete with components and properties. The prefab acts as a template from which you can create

docs.unity3d.com

 

이 예제에서는 Player를 prefab으로 만들어 줬다. 

그리고 Network manager에서 Network prefab 에 추가해줬다.

저 default player prefab도 체크해주자.

그리고 두개의 editor에서 각각 Start Host, Start Client해서 돌려보면

해당 프리팹 두개가 이렇게 만들어진 것을 확인 할 수 있다.

게임 플레이 모드에서도 이 Hierarchy 창은 계속 업데이트 되고,

오브젝트들을 클릭해서 Inspector에서 상태를 볼 수 있다.

저 Player(Clone) object를 Hierarchy에서 클릭해서 inspector 에서 NetworkObject 컴포넌트를 보면,,

NetworkId 가 2로 되어 있는 것을 볼 수 있다.

네트워크에서 생성되는 오브젝트마다 NetworkId를 부여받는 구조 같다.

 

5. Scripting

새로운 스크립트를 만들려면 Assets > 마우스 우클릭 > Create > C#Script를 해주면 된다.

스크립트에 대해서는 네가지만.

1. gameobject에 component로 갖다 붙일 웬만한 스크립트는 Monobehaviour를 상속한다.

2. scirpt를 component로 gameobject에 추가하면 public 변수들은 Inspector에서 보인다. 

3. void Start()는 시작 시 처음 한번, void Update()는 매 프레임마다 실행된다. 

  Character를 움직여주는 MovePlayer는 매 프레임 실행되야 하므로 Update에서 불러준다. 대문자 U에 조심하자.

4. Rename할 때 조심해야 한다! VIsual Studio로 열었을 때 이름하고 저 assets에서 보이는 이름하고 달라지면 아예 스크립트를 못찾는다!

5. 게임플레이모드에서 디버깅용으로 로그를 찍고 싶으면 Debug.Log 를 사용하자.  

 

Scripting에 대해서는 아래 문서 참고.

https://docs.unity3d.com/ScriptReference/MonoBehaviour.html

 

Unity - Scripting API: MonoBehaviour

 

docs.unity3d.com

 

Next Steps

나는 이정도 단계에서 아래 first person controller 만드는 영상을 따라하면서 더 감을 익혔다..

영상에 보면 바닥에 계단이랑 slope랑 이것저것 강아지 agility 훈련장마냥 깔려있는데

그것들도 직접 만들어 보면서 한두시간 고생하다보면.. 나름 유니티에서 navigation하고 3d object 다루는데 익숙해진다.

 

https://www.youtube.com/watch?v=_QajrabyTJc 

이분 영상들 좋다. 좋아요 구독 눌렀다.

 

이번 글은 진짜 맨땅에 헤딩하는 느낌으로 그냥 무지성 따라하기였다면

다음 글은 조금이나마 더 insight-ful한, metaverse가 무엇이고, MMORPG 같은 것과는 무엇이 다르고(혹은 다를 것이고)

그것이 우리의 INTERNET VERSION2 가 되기 위해서는 어떤 기술적 과제들이 해결되어야 할 지 등을 다뤄보고자 한다.

 

 

Comments