본문 바로가기
Game Programming

Unity3D와 StreamSocket 그리고 Window 8.1 App

by 게임혼 2014. 7. 7.

현재 버전까지의 (4.5.1, 실제 안정적인 버전은 4.3.4) 유니티에서는 윈도우 스토어용 앱 제작에 어려움이 있는데


가장 큰 부분중 한가지가 소켓 통신 부분이었습니다.


기존의 System.net 사용이 제약되어 socket부분이 streamsocket으로 변경되어야 하기 때문인데 이 부분은


모바일 기기와의 호환성 문제로 인한 부분이 큽니다.


일단 내부적으로 유니티가 직접적인 사용이 어렵기 때문에 개인적인 솔류션으로 알아 본 부분이


streamsocket을 이용한 socket 대체와 eventhandler를 이용한 다이렉트 통신부를 만들어서 연결하는 것입니다.


테스트는 문제 없었지만 스트림 속성이라 기존의 연결 취약성에 대한 코드가 그다지 필요하지 않게 되었습니다.


ssl 처리를 위한 추가적인 연산이 필요하게 되었고 (물론 제거 가능합니다.) 여러모로 iOS의 iostream 기반 통신과


유사합니다.


그러나 현 상황을 보면 유니티에서 socket 을 직접 넣어줄지도 모르겠습니다. (이 부분도 스트림소켓 기반이 될 것으로 보여지지만요)


자 주요 내용 정리 들어갑니다.


1. https://github.com/windowsgamessamples/UnityPorting 포팅용 라이브러리 제작에 대한 참고 소스입니다.

내부를 보면 Platformer, Apps, Plugin 3가지 폴더가 있습니다. 이 중에서 플러그인 기반 폴더만 가지고 컴파일하고

제작하는 방식으로 진행했습니다.


2. 전처리 부분

#if NETFX_CORE || WINDOWS_PHONE

이 부분이 폰인지 아닌지 체크하는 부분입니다.


3. EventHandler 사용, 이벤트 헨들러는 System.EventArgs 를 사용합니다.

Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원 당연 안전입니다.


플러그인 소스의 TcpClient에다 public event EventHandler _cb; 때려박고


public class JnetMessage
    {
        public string cmd, value;
        public JnetMessage(string c, string v)
        {
            cmd = c;
            value = v;
        }
    }

    public class JnetEventArgs : System.EventArgs
    {
        public JnetEventArgs(JnetMessage msg, int error)
        {
            this.msg = msg;
            this.error = error;
        }

        // The fire event will have two pieces of information--
        // 1) Where the fire is, and 2) how "ferocious" it is.

        public JnetMessage msg;
        public int error;
    }


이런식으로 메세지 클래스와 EventArgs를 재정의 합니다.


4. 유니티 소스와 연동합니다.

유니티 소스 상에서는


public void _RcevWinRT(object sender, System.EventArgs data)
      {
          JnetMessage msg = ((JnetEventArgs)data).msg;
          Debug.Log("_RcevWinRT " + msg.cmd + "/" + msg.value);
      }

이런식으로 소스에 기입한 뒤 tcpClient._cb += new System.EventHandler(_RcevWinRT);

로 할당 해줍니다. 중첩될 수 있으므로 당연히 초기 1번만 해주도록 합니다.


5. 주의점

스트림소켓 기반이라 기존의 Disconnect 방식이 다릅니다.

실질적으로 stramsocket을 Dispose하면 연결도 끊어지는 것으로 보여집니다. TcpClient 에서는 이 부분을 활용하여 Disconnect를 추가 구현하면 될 것으로 보여집니다.


끝으로 콘솔창 메세지 출력은 System.Diagnostics.Debug.WriteLine 입니다.ㅎㅎ;





'Game Programming' 카테고리의 다른 글

Unity3d Assembly.Load 문제  (0) 2014.09.15
MBCS 에서 글자깨짐  (0) 2014.08.18
Windows Store / Microsoft.Advertising.WinRT  (0) 2014.06.26
Windows Store 삽질  (0) 2014.06.08
유니티 힌지 조인트 부분 정보  (0) 2014.05.31