유니티 연동 #4

CJB_ny·2022년 3월 10일
1

Unity_Server

목록 보기
55/55
post-thumbnail

1. 유니티 코드 작업

이어서 유니티 작업 ㄱㄱ

유니티의

clientPacketManager로 오면 PacketHandler를 만들어 주지 않아

에러가 발생한거 확인 가능

그래서 더미클라 > PacketHandler 있는 내용들

복사 ㄱㄱ

그런데 이제 유니티쪽은 더미클라 PacketHandler보다

조금더 상세하게 받아 볼 필요가 있다.

유니티 설정은

이정도로 해주고

유니티에서 NetWorkManager에서 패킷 보내는거 다 하고있었다.

나중에 MMO를 만들면 여기 Player들이

여기 돌아다니기 시작할 것인데

이것들을 관리를 해주어야 하니까

Player만들고

MyPlayer 만들어주자 (만든 이유는 나중에 설명)

그리고

Player에서는

이렇게하고

이동하는 패킷은

내 플레이어 == MyPlayer에서 관리를 하는게 조금 더 맞다고 생각이 드니까

MyPlayer에서 관리를 해주도록 하자.

그리고 Player를 상속받도록 해주고

NetWorkManager에 있던거 가져오도록 하자.

이렇게 하자.

그리고 이동패킷은 0.25초마다 보낼 꺼니까 이렇게 수정 ㄱㄱ

이제 이것을 패킷을 통해서 보내줘야 하는데

NetWorkManager에서 _session을 물고있었는데

패킷을 통해서 보내주는 방법이 여러 방법이 있기는 하지만

Send라는 함수 하나 파줘서 전달만 해주도록 하겠다.

그런데

일반적인 C#문법으로 하면되는게

모노가 붙어있어서 NetWorkManager는 어디에서 기생해서만 존재를 할 수 있기 떄문에

유니티에서

이 오브젝트에 컴포넌트로 붙어있어서 호출이 되는 녀석이기 때문에

그말인 즉슨

NetWorkManager라는 오브젝트 찾기 > 컴포넌트를 찾아서 단계별로 접근 해야됨

MyPlayer >

Start를 할 때 한번만 찾아오도록 ㄱㄱ

그다음

이렇게 ArraySegment로 만들어 가지고

Send를 호출하게 되면은

좌표들이 알아서 네트워크 쪽으로 보내주게 될 것이다.

2. 유니티 PacketHandler 작업

처음에

들어오면 이 패킷으로 들어온 나에게 누가누가 있는지 알려 줄것이고

내가 입장을 한 상태에서 다른 누군가가 입장을 하면 이것으로 알려 주게 된다.

(나에게)

누군가가 나가면

누군가가 이동하면

이거.

지금 Player.cs, MyPlayer.cs를 중아에서 관리를 할 필요가 있다

내 플레이어는 하나니까 이렇게, 다른애들은 Dic로 관리 ㄱㄱ

그리고 싱글톤 ㄱㄱ

이까지하고

이제 PacketHandler에서 이용자가 들어왓거나 떠났거나, 움직인다거나 하면은

이제 여기서 뭔가를 처리를 해주어야 한다.

가장 기본적인 Add부터 만들어 주자.

맨처음에 게임에 접속을 할 때 S_PlayerList로 목록이 온다.

값들이 이런게 넘어 온다는 것을 알 수 있는데

하나씩 하나씩 다 파싱을 해서 한번은 유니티상에서 만들어 주어야 한다.

Resources > Player prefab으로 만들자.

이렇게하고 이녀석을 생성하려면

프리팹을 사용하려면 리소스를 한번 로드를 한다음에 Instantiate를 해가지고

생성 해주어야 함!

이렇게 해주면되는데

이것을 한번만 해주는게 아니라

여러번 ㄱㄱ

foreach를

이렇게 돌면서 각각의 맞는 컴포넌트를 붙여 주어야 한다.

그리고 위치는 이런식으로 넣어주면 될 것이다.

이렇게까지하면

S_PlayerList로 들어오는 애들은 이렇게 쭉 핸들링 해주었다.

이제 PacketHandler로 와서 연동을 시켜주면 된다.

이렇게 Add로 패킷을 전달만 해주면

S_PlayerList pkt = packet as S_PlayerList를 PlayerManager에서

알아서 파싱을 해가지고

Player들을 다 만들어주는 작업을 할 것이다.

그래서 나머지 Handler들도 인터페이스만 맞춰주자 일단.

이렇게 일단 맞춰주자 ㄱㄱ

그래서 다시 PlayerManager > 가서 맞춰준 인터페이스 구현해주면된다.

이렇게 일단 해주자.

왜 S_이냐면은 Serverd -> 클라들한테 보내줘야 하니까? 이다.


EnterGame은 내가 접속한 상태에서 누군가가 접속을 한다면

나포함 다른 애들한테 알려줘야 하는것이다.

그래서 결국에는 Add와 비슷한 작업을 해야하는데

EnterGame에서는 "나 == isSelf == _myPlayer"일 경우는 절대 없다.

왜냐하면

Add에서 이미 isSelf일 경우 처리를 해주었기 때문이다.

이렇게 처리 ㄱㄱ.

Leave는 나일 경우랑 다른 플레이어 나갈 경우 생각.

"나"일 경우 Destroy를 해주고 null로 밀어 버리기

다른 플레이어 일 경우 해당 아이디로 Remove.


이제 Move만 처리해주면되는데

이것도 "나"를 이동하는지 다른 플레이가 이동을 하는지 구분 ㄱㄱ.

이 부분에 들어오면은 지금 내 player를 이동시키는 부분이 되는데

나중에 컨텐츠를 다룰 때 다시 얘기를 할 것이지만

"이동 동기화"가 사실은 "서버 && 클라"에서 맞출 때

가장어려운 부분중 하나이다.

이것을 자연스럽게 맞추기가 생각보다 까다롭다.

그래서 "이동 동기화" 맞추는 방법이

1) Server에서 "허락" 패킷이 왔을 때, 그제서야 이동하는 방법

2) 일단 Player 이동시키고(클라에서는 먼저 이동 시키고 있다가), 서버에서 응답이 오면 그거에 따라서 조금 보정하는 방법

지금은 1)번 방법으로 만들도록 하겠다.

이렇게 좌표를 넣어 줘서 수정하면된다.

그래서 일단 여기까지 만들었다면 대부분의 기능들이 다 들어 간것이다.


추가로 PacketQueue만 수정 ㄱㄱ

지금 NetWorkManager >

Update문 안에서 이렇게 Pop을 하는데

이렇게하면 매프레임마다 하나의 패킷만을 처리를 할 수 있다는 것인데

이렇게 하는것보다

그 프레임안에 처리할 수 있는것들은 다 처리를 하는게 좋으니까

PacketQueue.cs에다가 인터페이스를 하나 더 만들어 주도록 하겠다.

PopAll이라는 거 하나 만들어 주도록 하자.

그러면 이제 NetWorkManager에서

PopAll로 조금더 많은 패킷을 처리를 할 수 있도록 해주자.

그래서 이제 Pop을 하는게 아니라

PopAll로 해당 프레임에 foreach로 하나씩 하나씩 실행을 하게끔 맞춰 주도록 하자.

이렇게 되면 아까와는 다르게 하나의 패킷만 실행하는게 아니라

"해당 프레임"에 들어온 모든 애들을 다

이렇게 꺼내가지고 실행을 하게끔

foreach로 해준다.

이렇게 하면 조금더 많은 패킷 처리 가능하다.

그리고

이제 Server 실행 > 유니티 실행하면

지금 이렇게 뜨는데

이것들은 더미 클라에서 보낸 것들을 유니티에서 보여주고 있는 것이다.

그렇다는 것은 결국

실제 MMO라고 했다면은

Dummyclient는 수많은 유저들이 각각이 캐쉬에서 명령을 내린것을

우리가 시뮬레이션 하고 있던 것이다.

이녀석들이 이동하는 것을 우리가 실시간으로 보고 있는 것이다.

그리고 "나"는 가만히 있는데

이것은

Move는 이런식으로 아이디를 찾아 주고있어서 되는데

지금 Add에서

아이디를 등록을 해주지 않아서 못찾는 중일것이다.

if, eles 둘다 아이디를 등록을 해주도록 하자.

그런데 이렇게하고 해도 에러가 뜨는 중이다.

흐음... ->

Server > GameRoom에서

Enter부분에서 이부분 까지는 ㄱㅊ은데

바로 밑에 S_BroadcastEnterGame은 방금 들어온

S_PlayerList에 들어간 애는 제외를 하고 보내는게 맞는데

이것을 수정을 해주도록 하자.

Client > PlayerManager >

Enter에서 이렇게 수정 ㄱㄱ

그리고 500명으로 수정하고

테스트 해보면 잘 뜬다

500명을 한공간에 때려 박아 넣어도 잘됨!

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글