unity engine

C++서버 C#클라이언트(유니티엔진 연동)에 대해서 공부하고 코딩짜면서..

sieunju 2016. 8. 1. 12:12
반응형

안녕하세요 j.sieun 입니다. 

이번글에는 제가 현재 C++ 서버와 C#클라(유니티 엔진)를 연결해서 데이터를 받고 보내는 걸 구현하고 있다가

깨닭은 점에 대해서 말해보도록 하겠습니다. 

(소스는 공개 못하는 점에 정말 죄송합니다. ㅠㅜ)


우선 C++ 서버는 아는 분께 도움을 받아서 (라이브러리 함수 이해하는데 시간 꽤걸렸습니다ㅜㅡ;)

암튼 TCP/IP에 대해서 공부하고 C#클라이언트와 유니티를 공부하면서 테스트 해보고 중간중간에 

중단 점걸어서 값이 어떻게 바뀌는지 보면서 여러가지 시행착오를 겪으면서 알게된 사실을 적어보도록 하겠습니다. 


우선 공부할때 참고가 되었던 도서는 

이석현 지음 - "유니티 개발자를 위한 C#으로 온라인 게임 서버 만들기"


박상현 지음 - "C# 5.0 프로그래밍"


이 되겠습니다. 

물론 또 동영상으로는 윤성우 의 열혈 TCP/IP 소켓 프로그래밍 책을 사서 인터넷으로 동영상을 보았습니다. 


우선 C#으로 온라인 게임 서버 만들기 책은 작은 포켓 형식인 책이라서 들고 다니기 쉽다보니 밥먹으면서 보고 어디 갈때 항상 챙기고 제가 작성한 소스에 오류가 날때 마다 뭐 놓친게 있는지 봤던 내용 또 보고 

밤에는 인강 보면서 어떤 식으로 데이터가 송,수신 되는지 감을 익히는데 참고가 되었습니다. 또한, C# 프로그래밍

책은 중간 중간에 제가 Java를 전에 많이 사용했다보니 변수 선언이라던지 지역변수,기타 출력문,객체 생성 이런게 좀 다르다 보니 메서드나 변수를 참고하기위해서 봤습니다.


그러면서 현제 알게 된 사실은,

1. 유니티는 싱글(단일) 스레드로 진행이 됩니다.

고로 "+=" 를 제대로 사용해야 합니다.(무슨 의미인지 공부하시다보면 알게됩니다.)

2.C# 소켓은 byte 배열 형식 쉽게 말해서 buffer 형식으로 데이터를 전송됩니다.

고로 C++ 서버는 byte로 인식해야 합니다. (머..구조체로 보내면 값을 가져오는게 편하긴 하지만...)

3.C#에서 데이터 전송하기 전에 구조체 (struct) 에다가 값을 입력하고 난후 그걸 byte [] 로 형변환 해서 

보내야 하는데 그것을 위해선 마샬링을 사용해야 합니다.(하지만 InPtr 을 잘봐야 한다.)

4.제가 자바 공부하면서 소켓을 while(true)이렇게 계속해서 데이터를 주고 받도록 했는데, 

유니티는 싱글 스레드다 그래서 네트워크 게임으로는 적절하지 못한 방식이라서 비동기 처리 방식으로 

코딩을 해야 합니다. "SocketAsyncEventArgs" 이걸 사용해야 합니다. 비동기란 뜻은 

쉽게 말해서 "데이터 보낼께 받으면 문자줘"  이렇게 생각하면 좀더 쉽게 이해하기 편할거 같습니다.

5.클라가 서버한테 데이터를 보낼때 패킷은  header(헤더) + data(데이터) 이런 형식으로 보내는데, 

서버가 그걸 받아들일때 규약이 있습니다. 앞에 헤더가 서버가 받아들이는 형식과 다르면 데이터를 

안받습니다. 그래서 패킷을 header(헤더) + type(타입.경로) + data(데이터)  이렇게 byte[] 해서 보내야 합니다. 


현재는 C++ C# (유니티) 비동기식 데이터 송수신 하는거 까지 가능하지만, 걱정이 되는건

대량으로 클라이언트가 서버에 들어왔을때 서버가 받아들일수 있는 용량이 어느정도인지, 또한 데이터 분배를

잘해야 되서 이건 이제 해결해야 할 문제이긴 합니다.(한마디로 데이터를 중복해서 복사하는 그런 서버로 만들면 안된다는 소리입니다.)


저 처럼 대학생신분으로 서버 클라를 만들어서 그걸 게임엔진에 적용하는 분들이 

있으실거라 생각이 듭니다. 

그래서 "같은" 신분으로 "같은" 눈높이로 글을 적어보았습니다. 

도움이 되길 바라겠습니다.

감사합니다.

반응형

'unity engine' 카테고리의 다른 글

같이 앱 게임 만드실분..  (0) 2016.04.13