[프로토타입] 유니티 멀티게임 테스트 - 2

Private 2012. 11. 9. 12:49
반응형

1108.zip


프라우드넷을 이용한 멀티 플레이 테스트 


프라우드넷은 P2P를 지원하는 릴레이서버의 역할을 한다.

사실 P2P라고 하지만 서버를 통한 P2P라 완벽한 P2P라 할수 없다.

수퍼콘트라를 개발하면서도 느꼈지만 클라이언트쪽에서 처리 해야 할것들이 너무 많았다.


- 삽질이슈 

클라이언트가 서버에 붙게 되면 제일 처음 OnJoinServerComplete를 콜백한다.

이때 자신의 memberHostID를 알수있다고 생각했는데 콜백함수의 인자로부터 받아올것이라 착각했던것.

API를 겁나 처다봤지만 정작 NetClient는 보지 않고 자꾸 다른데서 찾을려고 했던것이 삽질의 문제였다.

NetClient의 속성중 LocalHostID가 있었는데 이것이 서버에 접속했을때 부여 받는 자신의 memberID인것이였다.

그것도 모르고 자꾸 다른 이벤트가 있는지 또는 OnJoinServerComplete에서 받은 인자replyFromServer 로부터 

자신의 아이디를 확인하려고 했던발상자체가 삽질의 근원이였다.


- 프로그래스 

1. 서버에 접속하기 위해 NetClient객체를 생성 

2. NetClient에 콜백함수로 받을 메서드 연결 

3. NetConnectionParam설정 

- 프로토콜 버젼, 서버포트, 서버아이피, 

- 유저데이터 (이건 아직도 어떻게 쓰는지 모르겠다, 아무리 보내도 받을수가 없는..)

4. NetClient의 FrameMove()를 업데이트에서 실행해주지 않으면 끝없는 나락에 빠질수 있으니 주의 

5. 서버에 접속하게 되면 제일먼저 호출되는 콜백함수 : JoinServerCompleteHandler

6. 다른 맴버가 접속하게 되면 나 자신도 OnP2PMemberJoinHandler가 호출된다.

7. 메시지 전송시 SendUserMessage를 사용하게 되는 이때 RmiContext를 설정해줘야 한다.

RmiContext rc = new RmiContext();

rc.enableLoopback = true; ( 나자신이 메시지를 받을것인지 설정여부 )

rc.reliability = MessageReliability.Reliable; 



메시지전송시 byte[]형식으로 보내고 받기 때문에 문자열일경우 반드시 변환후 전송하고 받고나서 다시 풀어줘야 한다.


이를 위해 만든 유틸 2가지 



1. ByteArrayToString

string ByteArrayToString(byte[] b){

byte [] dBytes = b;

string str;

System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); //.ASCIIEncoding();

str = enc.GetString(dBytes);

return str;

}


2. StrToByteArray 

byte[] StrToByteArray(string str){

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();

return encoding.GetBytes(str);

}



문제는 객체를보낼수 없다는것. 

이를 해결하기 위해서는 마샬러를 이용해서 Proxy, Stub를 구현해야 한다.

매우 귀찮은 일이지만 실제로 플젝에서는 반드시 사용해야 할듯 싶다.









드디어 접속시 자신의 아이디를 부여 받고 메시지를 전송하면 자신이외 P2P그룹에 포함되어 있는 클라이언트가 메시지를 전송 받는 간단한 테스트가 완료 되었다.


다음에는 플레이어를 만들고 멀티로 움직일수 있는 테스트를 진행해봐야 겠다.




반응형
: