유니티 연동 #1

CJB_ny·2022년 3월 7일
0

Unity_Server

목록 보기
52/55
post-thumbnail

유니티에서

이런 TryWriteBytes나 Span같은 것을 사용할 수 없을 것이니

유니티 프로젝트를 만들어서 나중에 수정을 해나가야 한다.

유니티 프로젝트

우리 CSHARP > Server 안에다가 생생 ㄱㄱ

우리가

여기 ServerCore를 빌드를 한다음에 ServerCore.dll 파일을 가지고와서 사용해도 되기는 하지만

나중에 디버깅을 할 때 문제가 발생한다.

그래서 처음에는 코드들을 수동으로 다 가지고 온다음에

나중에 수정을 하는게 좋다.

그래서

프로젝트 파일 뺴고 이렇게 복사해서

그다음 유니티 Scripts 에다가 복사한거

복붙 ㄱㄱ 프로젝트 파일뺴고

그리고 DummyClient > Packet폴더 && ServerSession복사후

유니티 프로젝트 파일 > Scripts 복붙 ㄱㄱ

그다음이제

이렇게 다 복붙 한다음에

뭐가 필요 없을지 생각을 해보도록 하자.

  1. JobQueue의 경우 WaitForSeconds라는 애로 Task관리가 가능하니까

삭제 ㄱㄱ

  1. Listener의 경우도 Server쪽에서 "대기"를 할 때 사용하고 있었다.

클라에서는 노필요하다.

  1. PriorityQueue도 딱히 필요없으니까 삭제 ㄱㄱ

이렇게 ㄱㄱ

이것들 NetWork >

옮기자.

그리고 에러가 뜨는데

보면은

이렇게 GenPacket쪽에서 에러가 뜨고있다.

다행이 NetWork쪽에서는 문제가 없네!

그러면 일단

수정을하고 다시 자동화 하는 작업이 귀찮기는 한데

일단 Span대신 뭘 사용할 수 있을 지 생각을 해보고 그것을 다시 자동화를 만들어 주도록 하자.


Spna을 Slice하는 대신 segment를 받아와서 이런식으로 사용이 가능했었다.

그래서 이버젼 사용 ㄱㄱ

그리고

string 부분도 보면은 count부터 offset을 시작했다가

chatLen만큼 길이를 Slice를 하고있었으니까

이렇게 chatLen을 추가를 해주도록 하자.

Read같은 경우에는 위에를 살짝 수정해주면되는데

Write같은 경우에는

TryWriteByte사용못하니까

이제부터 조금 복잡해지는 거같다.

우리가 TryWriteBytes를 사용했던 이유는 편리하기 떄문인데

원래는 BitConverter.GetBytes((ushort)PacketID.C_chat);이렇게하면

이것을 바이트 배열로 뱉어주었는데

그래서 매번마다 바이트 배열을 만들어서 뱉어주는게 마음에 안 들었는데

그래서 이미 만들어준 배열에 직접적으로 데이터를 집어 넣도록

TryWriteByte로 하고있었는데 지금 이방법이 안되는 것이다.

그래서 이것을 해결하는 다양한 방법이 있기는한데

1)

성능에 조금 손해를 보더라도 이렇게 바이트 배열을 만드는 것

그래서 이렇게 복사를 하는게 첫번째 방법

이런식으로도 가능


그리고 success로 관리하던 부분도 다 삭제를 하도록 하자.

일단 이렇게 ㄱㄱ

TryWriteBytes는 무조건

Array.Copy(BitConverter.GetBytes((ushort)PacketID.C_chat) , 0, segment.Array, segment.Offset + count, sizeof(ushort));

이런방식으로 수정 해야한다.

그리고 밑줄 부분은 거의 고정이라고 생각하면된다.

Write의 경우 이런식으로 수정을 하면 에러가 어느정도 해결이 될 것이다.

그리고 데이터 수정하는 부분 가서 간단하게 수정 ㄱ.

== Packetformat 수정 ㄱㄱ

packetformat의 read부분 부터 수정 ㄱㄱ

그리고 Write의 success, span삭제 ㄱㄱ

121번째 줄 맞춰 주기 위해서

120번째줄 처럼 한다.

이렇게 바뀜

또 그다음 최종 count넣는부분은 이렇게 수정 ㄱㄱ

Write는 이까지 됬고

그다음

memberListFormat이 있는데

이쉑도 같이 수정을 해야한다.

이렇게 수정 ㄱㄱ

그다음 수정은

readFormat 보면

Slice안 사용하기로 했으니까

이렇게 바꿔야 한다.

그리고 readStringFormat같은 경우도 수정 ㄱㄱ

이렇게 수정 하자.

그리고 readListFormat도 수정 ㄱㄱ

이렇게 바꿔치기 ㄱㄱ


그리고 이제 writeFormat부터 수정할 부분이 다시 많아진다.

이런부분부터 많아짐

이게

이게 전형적인 Write의 예시이다.

그래서 밑줄 부분 처럼 들어가는게 아니라

그래서 변수이름 {0}, 변수 형식 {1}이렇게 들어가게되는 것이다.

그리고


아까 밑에 부분 삭제를 해주면된다.

그리고 이부분 고쳐야하는데

writeFormat에서 했던것과 유사할 거같은데

여기에서

{0}뽑아온 부분

이렇게 수정 ㄱㄱ

그리고 마지막으로

이녀석있는데

이렇게 위에 Array.Copy로 해주도록 하자.

그리고 밑에 이렇게 수정 하면된다.

이렇게하고 이게 한번에 되면 굉장히 좋을 거같지만

그다음 빌드 > 배치파일 실행

그다음 ClientPacketManager가 어떻게 바뀌었는지 살펴보도록 하자.

그리고 혹시 모르니까

프로젝트 > 속성 실행 ㄱㄱ

그럼일단 패킷모아보내고 Flush하는 부분까지는 잘 된다.

이렇게해서 PDL수정하는 부분까지는 어느정도 완성 OK

그래서 이런 부분도 배치파일도 조금 수정해가지고

유니티까지 캐어를 할 수 있도록 추가를 해주도록 하자.

이경로로 들어가야 하니까

이렇게 들어가면된다.

그리고 클라패킷매니져도 똑같이 복사 ㄱㄱ

이렇게 코드수정하면

유니티쪽 코드까지 같이 수정이 될 것이다.


그래서 Client쪽 와가지고

보면은

Span부분이 잘 수정이되는지 보면된다.

그러면

잘 수정이 된다.


그럼이제 잘되는것 까지 확인을 했으니

일단 유니티로 ㄱㄱ

중간에 이부분 삭제 ㄱㄱ

그리고

유니티 Script > 산하에 NetWorkManager를 만든다.

이녀석은 이제

처음에 서버에 붙어가지고

뭔가 작업을 해야하는 부분을 넣어주기 시작해야 하는데

이 시작하는 부분은 DummyClient쪽 코드를 참고 하면된다.

DummyClient > Program

이렇게 ip = ipAddr, Port = 7777

을 가져와가지고 Connector를 이용해서 호출하고 있었는데

이부분 통째로 복사 > Start()넣기

using 추가해준다.

여기 SessionManager는 말그대로 더미클라를 몇백개씩 입장시키기위해서

테스트로 만든 것이였다.

유니티 같은 경우에는 하나만 들고있으면된다.

이렇게 만들어주고

실제로 Connect했을때 sessionFactory를 연결해줘야 한다

그러면 Connector에서 Connect함수까지 갔으면은

RegisterConnect 하고 ConnectAsync 호출하고

-> 이쪽에 연결해서 서버에 붙으면 OnCompletedConnect를 하게되면

이부분 호출되면서 > ServerSession

ServerSession이 뿅 튀어나게 된다.

그리고

OnRecvPacket이라는 애로 와가지고

ClientPacketManager >

이부분이 실행이 될 것이다.

그다음 최종적으로 여기

PacketHandler의 부분으로 들어오게 될 것이라는 결론을 얻을 수 있다.

그리고 이렇게 로그를 찍어보도록 하자.

그리고 이까지 했으면

서버를 구동을 하면서 동시에 유니티도 키면되는데

Server > DummyClient > Program

10개로

이렇게 수정 ㄱㄱ

그리고 이부분 실행하면

이렇게 잘 뜬다.

지금 실행시킨 상태에서 유니티를 실행을 해보도록 하자.

유니티에서 빈 오브젝트만들고 컴포넌트로 붙여줘야지 돌아감

그러면

이런식으로 콘솔로그가 잘 뜨고있다.

이 콘솔은 지금 유니티에서 전송한게 아니라

DummyClient와 Server가 계속 통신하는 와중에

Dummy클라가 보낸 메세지가 Server를 통해가지고

우리가 구동한 유니티 클라쪽으로 지금 이렇게 뜨고있는 것이다.

그래서 유니티를 이용해서 서버쪽에서 건내준 데이터를 파싱해서 사용하고있는것이다..

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

0개의 댓글