728x90

음 소켓 통신을 필요로 했기 때문에 ..

우선 node.js socket.io 를 설치 해줍니다..

 

npm install -g socket.io

 

저는 node.js를 작업할 툴로 이클립스를 사용하고 있기 때문에 이클립스가

D경로에 있습니다 .

 

그래서 그런지 간단한 서버를 작동해도 socket.io를 설치했음에도 모듈을 못찾는다는 에러가 나오더군요 (아마 설치된 경로나 이런걸 못찾고 있는듯..) 이럴때는

 

인터넷에 검색해보시면 또 많은 방법이 나오는데 저 같은 경우는

 

작업하는 폴더에서 쉬프트 + 오른쪽 클릭 하셔서 여기서 명령창 열기를 한후 npm install socket.io@0.9.6 명령어를 사용하여 작업 폴더에 모듈이 바로 설치되게 했습니다.

 

이러니 오류없이 잘 되더군요 근데 명령어 뒤에 보시면 0.9.6 버전을 설치했는데

음 무슨 이유인지는 모르겠으나 최신버전으로 하니 작동이 안되더군요 아무 반응이 없음..

그래서 다른 버전으로 했더니 잘 반응하고 작동을 했읍니다..

 

우선 유니티에서 셋팅을 해줘야 할것이 있습니다.

socket.io 플러그인을 설치해줘야 하는데

https://github.com/NetEase/UnitySocketIO 이 링크로 가시면 다운 받으실수 있습니다.

(다른 소켓 라이브러리들도 많음... 더 좋은게 있을수도)

 

귀찮으시면 바로 받으세요 ..

UnitySocketIO-master.zip

받으시면 SocketIO\Bin\Debug\ 폴더 안에 있는 모든 파일들을 유니티 프로젝트에 복사해줍니다.

 

 

그럼 셋팅은 완료됫고 이제 유니티에서 소켓을 생성하고 서버에 연결후 데이터를 받아오는거 까지 해보겠습니다.

 

 

우선 위에 SocketIOClient 네임 스페이스를 추가해주셔야 됩니다. using SocketIOClient;

 

url은 이제 서버의 ip주소 와 포트번호를 입력해주시고..  127.0.0.1은 자기 컴퓨터 주소입니다..

정말 되게 테스트만 해본거라 딱히 뭐 코드도 별로 없습니다.

 

유니티 플레이를 하게되면 소켓을 생성한후 해당 url로 소켓을 연결하고

람다식을 이용했는데.. 람다식은 그냥.. 코드 내용을 간결하게 하면서 사용할수 있는.. 익명 함수라고.. 설명하면 될듯하고... 굳이 안해도 되는데 그냥 한번 써보고 싶었음...

 

아무튼 socket.on 함수는 서버쪽에서 MsgRes 라는 이벤트가 발생하면 보내오는 데이터를 받아서 간단하게 출력하는 부분입니다.

 

test() 함수는 버튼을 누르면 반응하게 만들었고 버튼을 클릭했을시 socket.emit 함수를 발생시키는데 emit는 Msg라는 이벤트를 작동해라 라고 서버에게 넘겨주면서 동시에 데이터로 문자열을 보내고 있습니다.

 

유니티는 이정도로 셋팅을 했고.. 이제는 nodejs 서버쪽을 해보겠습니다..

 

socket.io 모듈을 불러오고.. 포트번호 999로 설정해 줍니다.

 

connection 이벤트가 발생할시 .. 즉 클라이언트에서 연결 요청이 올시 연결됫다라는 connected! 문자 출력한번 해주고요..

 

그후 연결된 소켓으로 Msg 이벤트가 요청이 오면 받은데이터를 콘솔로 출력후 emit 함수로 다시 클라이언트에게 MsgRes 이벤트를 발생시키게 함과 동시에 데이터를 보내주는 역할을 하는 서버입니다..

 

이제 node.js 를 통해서 server 를 실행시켜 주시고

 

유니티를 플레이한후 버튼을 눌러주시면..

 

유니티 콘솔창에는 제가 서버로 보냇던 데이터 문자열이 다시 저에게로 돌아와서 출력이 되었고

node.js 에선 음.. 한글 인코딩이 좀 이상하게 깨지긴 햇는데 아무튼 서버에서도 재대로 데이터를 받았고 뭐 자기 할일을 잘했다는걸 볼수 있습니다.

 

우선 연동 확인 테스트 까진 됬고 이제 좀 더 공부해보면서 본격적으로 더 해봐야 겠습니다~

 

 

 

 

 

 

728x90
Posted by 정망스
,
728x90

처음 프로그래밍을 할때부터 이클립스로 보통 export 하면

생기는 라이브러리가 .jar 파일을 많이 접했는데 이게 예전부터 보아왔고 사용했고, 그래서 지금도 엄청 익숙한데

 

저번 메시지 푸쉬 기능을 한번 해보면서

 

좀 내 기준에선 새로운걸 발견한 듯 하여 까먹지 않으려 일단 적어 본다.

 

결론부터 적자면 aar 이라는 나에게 있어서는 새롭게 보는 라이브러리 형태 파일인대.

 

기존에 jar 파일 형식은 유니티에서 약간 사용하기가 번거로운 부분이 많은가 보다 ..

 

보통 안드로이드에 필요한 리소스들, xml등은 res 파일에 추가 되는데 유니티에서 안드로이드와

같이 작업하긴 위해선 이 jar 파일과 + res 파일을 같이 옴겨서 사용해야 햇나보다.

 

리소스를 사용하지 않으면 문제가 없을테지만 말이다.

 

버전업 되어 나온지 유니티 5 이상부턴 aar 이라는 안드로이드 프로젝트 라이브러리 또한

사용할수 있게 지원한다는 것 같다.

 

aar 파일은 이미지, xml 등을 모두 같이 한번에 모듈화 할수 있는 듯 하다.

 

나도 최근에 google play services를 사용해보려고 라이브러리를 찾던중 아무리 찾아도 안보이길래

 

검색을 통해서 알아보니 sdk 매니저를 통해 받은 경로를 뒤져보니 각각에 필요한 기능들 별로 aar 파일이 제공되어 있었다.

 

아무래도 안드로이드를 기반으로 만드는거면 aar을 더 권장하는 목적으로 그러는거 같기도 하고.. (이건 그냥 내 생각..)

 

아무튼 새로운걸 알아 냈다.~

728x90
Posted by 정망스
,
728x90

출처 : http://mentum.tistory.com/76

 

큐브의 정점 갯수는 몇개인가? 8개?


맥스에서 기본 큐브를 생성한다음에 FBX로 유니티에 불러와보자.



 



그러면 놀랍게도 정점갯수가 24개로 표기되어있다.


이유는 두가지가 있는데, 1. 하드엣지를 표현하기 위해서 2. 분리된 uv섬 때문이다.

 

(맥스의 기본 큐브는 6개의 면이 각각 분리되어 uv가 겹쳐져있다.)



 


일단 하드 엣지를 없애기위해 노말을 꺼주면





20개가된다..? 이 현상은 왜인지 모르겠다.






그리고 맥스에서 UV를 한개로 합치고 와보면, 다시 24개가 되는데 


노멀도 none으로 - 혹은 맥스 내에서 스무스로 설정 했을경우 최종적으로 8개가 될 수 있다.



즉, UV가 합쳐져있고, 하드엣지가 아닐경우 합쳐서 계산한다.

   하드엣지이거나, UV가 분리되어있을경우 무조건 정점이 두개로 분리되어버린다.

 

728x90
Posted by 정망스
,
728x90

 

 

Network.Instantiate은 처음엔 네트워크 상에서 그냥 생성하는건가 보다 하고 생각했는데 아닌거 같다.

번역이 뭔가 어설프긴한데 모든 클라이언트에 instanted 한다는거 봐선 내부적으로 뭔가 RPC처럼 비슷하게 돌아가서 모든 클라이언트에게 그 오브젝트를 만들어라고 명령을 내리는 듯한 그런 구조로 돌아가는거 같다.

 

networkView를 이용해서 transform(Vector3)은 position, rotation, scale 이렇게 3개만 sync가 가능하다고 한다.

transform.parent 와 같은 hierarchy에 대한 것은 sync가 안된다고 한다.

 


Network.Instantiate를 통해 생성된 네트워크 개체는

그 개체를 생성한 클라이언트 쪽에서만 제어가 되고.. 제어된 개체는 연결된 다른 클라이언트에서
transform, animation 등이 싱크된다.
하지만 그 개체를 생성하지 않은 다른 클라이언트에서 컨트롤 하는것은 다른 클라이언트에 반영되지 않는다.

 


Network.Instantiate 는 buffered 되어.. 나중에 접속한 유저에게도 똑같이 buffered에 쌓인 순서대로  객체를 생성한다.

 

그렇지만. Network.Destroy는 buffered 되지 않기 때문에 Destroy되는 그순간 접속해 있지 않은 클라이언트들은Destroy가 되지 않는다.


그래서 해결책으로는


Network.Instantiate 할때 그룹ID를 특정 int 값으로 부여해주고.

Network.Destroy시 그룹ID로 다시 한번 Network.RemoveRPCsInGroup(그룹ID); 로 처리해주어야 한다.

 


 

networkView.RPC 메서드를 쓸때 두번째 파람인..RPCMode를 쓸때 주의하자!!


A,B 두개의 클라이언트만 접속해있을때.. 두 클라이언트에서.. 어떤 gameObject를 지우거나..

비활성화(SetActiveRecursively(false)) 하면..

그 후 접속한.. C,D 클라이언트에서도 반영이 되게 해야 하는데..

이때.. 모든 RPC 명령들이 RPC buffer에 저장이 되어 있어야만..

제대로 반영이 된다..


이때 반드시 RPCMode를 RPCMode.AllBufferd로 설정해야 한다!!

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침