서론

정보를 찾으며 짤막한 실력으로 열심히 제작하여 결국 WinForm + Unity 를 구현하는데 성공하였고 한국에서는 정보가 없어서 주로 중국, 미국 등 외국 사이트에서 찾은 정보를 취합하여 구현하였습니다. 

혹시 Unity 와 WinForm 을 사용하는 응용프로그램을 제작하는 분들을 위해 이 글을 작성합니다.


1편에서는 UForm 의 전반적인 내용을...

2편에서는 UForm 의 통신방법을...

3편에서는 UForm 의 완성모습을...


할 것입니다. 그럼 아무쪼록 잘 부탁드리옵니다.


Unity + WinForm 은?

Unity + WinForm (줄여서 UForm 유폼 이라고 부르것다.) 은 찾아본 결과 2가지의 방법으로 구현이 가능한거 같다. 더 있을수도 있으나. 열심히 찾아본 결과 2가지 방법이 있었다.

  1. Unity exe 파일을 로드하는 방법

Unity 에서 PC 버전으로 Porting 한 exe 파일을 WinForm 에서 그냥 불러오는 방법이다. 

자세한 내용은 필자가 찾아서 번역해둔 다른 글을 참고하기 바란다 : 

  1. UnityWebPlayer 를 이용하여 로드하는 방법

내가 사용한 방법으로써 외국에서 유폼을 제작할 때 가장 많이 쓰는 방법 같다. 

자세한 내용은 필자가 이 작업을 하며 가장 도움을 되며 기초를 잡게 해준 블로그 글에서 보기 바란다. : 


두 가지 중 편하고 자신의 목적에 맞는 방법을 사용하자.

물논 이 글에서 필자가 설명하는 방법은 2번째 방법인 WebPlayer 를 이용한 방법이다. 첫번째 방법을 하고자 하면 아마 이 글이 도움이 안될것이다...


UForm 을 제작해보자~!

2015/07/20 - [Programming/Unity3D] - UForm 을 제작하기 전 준비하기


먼저 윗 링크에 들어가 개발환경구축을 끝내주자. (정말 간단하게 필요한 내용만 적어놨기 때문에 이해가 안되면 댓글로 내용추가를 요청해주십시요)


윗 링크에서의 모습이 UForm 의 완성모습이라고 해도 과언이 아니다. 머... 저기서 통신 부분이 없으면 그냥 Unity Launcher 랑 다름이 없는 상황이기는 하지만, 윗 링크에 나오는 내용만 잘 따라했다면 사실상 거의 다 완성한것이다. 


필자가 UForm 을 제작하면서 가장 시간을 소비했던 부분이 통신 부분이었다. 클라이언트 개발 부분은 금방 끝났는데 통신에서 발생한 어이없는 버그로 인해 여러가지 방법을 전부 구현해보고 실패해보며 결국 중국 사이트에서 찾아낸 방법으로 해결하여 결국 완성했다... (사실... 갓 학교를 졸업하고 갓 회사에 들어간 초급프로그래머인 본인의 매우 허접한 실력으로 인해 벌어진 시간날림이었지만 말이다...)


2편에서 본격적으로 다룰 통신방법에 들어가기 앞서 여기에서 필자가 구현하다가 실패한 내용을 적어보겠다. 


UForm 만 제작하려는 분은 이 아래 부분은 안 읽으셔도 됩니다. (거의 쓸모있는 내용은 없다.)


아오... 왜 그러세요 Socket 님....

UForm 의 겉모습을 몇시간만에 구축을 한 후 (사실 정보를 찾는 시간이 매우 길었다,..) 매우 신나는 마음으로 블로그(기초 블로그) 내용을 보고 TCP Socket 통신을 말끔하게 구현하였다. 

버튼식의 서버 연결은 디버깅에는 좋았지만 상용화 나 사용자의 편의상 프로그램이 실행됬을 때 자동연결을 시켜야 하므로 기쁜 마음으로 코드를 개조, 실행 하였고....



"삽질의 세계에 어서 와"


내가 연것은 프로그램의 Socket이 아니고 삽질의 판도라 상자였던 거시였다!!!!!


딱 하나의 버그가 일어났는데, Socket 에 이상한 값이 들어가는 것이다. System.IO 에서 발생한 문제라고 catch 에서 알려주지만... 이게 웃긴게 버튼으로 연결했을 때는 빠릿빠릿 잘 움직이던 코드가 그저 WinForm Load 에서 불렀을 뿐인데 터지면서 버그를 뿜뿜뿜 뿜어내는 거시다....


( 필자는 대학교 시절 서버를 등한시 여기며 공부를 거의 안했고 클라만 죽어라 파고 회사에 취업하여 그런 행동을 하였던 과거의 나를 매우 부들부들하게 생각하였다.... 이 버그도 결국 해결하기는 했지만 아마 나의 허접한 서버 실력에 의한 버그이지 않았을까 생각해본다....)


그렇게 다급히 Debug 를 통해 왜 버그가 일어나는지 알아보았고 알아낸 문제점은 하나였다.

Unity 와 WinForm 의 로딩속도 차이로 인한 Socket 터짐 현상


문제점도 알았으니 꼼수이지만 WinForm Timer 를 이용해 0.5 의 대기시간을 주었고 당연하다는 듯이 실행이 된다!

하지만 이럴 경우 성능이 좋은 컴퓨터와 안 좋은 컴퓨터 간의 차이로 인한 버그가 또 일어날수도 있을 것 같아 곧바로 폐기...


그리하여 보편적인 SendMessage 로 로딩이 끝나면 매세지를 보내자! 생각하고 짜니 유니티 -> 윈도우 가 안 먹힌다...? 그래서 이 것도 폐기! 

(하지만 결국 이 방법으로 해결을 하였다.. 자세한 내용은 2편에서..)


다음으로는 PipeLine !! 열심히 짜서 돌려보니.... WebPlayer 에서는 Pipe 를 지원하지 않는다고 한다... (Pipe 이외에 여러가지를 지원하지 않는다.)


이후 3가지의 방법을 더 했지만 글이 더 길어질꺼 같아 여기다가 기술은 하지는 않겠다...


정리하며....

필자의 2주일간의 삽질을 봐주셔서 감사하고.... 2편으로 돌아오겠습니다...



  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기