본문 바로가기
#DevStudy/Unity

Unity <-> Node.js 통신 (Socket.io)

by 검은_백조 2016. 9. 30.

이곳 저곳 검색하면서 공부한 내용을 정리.



1. 유니티용 Socket.io 라이브러리를 받아야 한다.

https://github.com/NetEase/UnitySocketIO

*링크의 주석을 보면 socketio4net.Client 를 베이스로 하여 유니티 용으로 만든 것이라는 설명이 있다.



2. bin 폴더에 있는 라이브러리 파일들을 유니티 프로젝트에 임포트한다.




간단한 에코서버 만들기


3. GameObject를 만들고 SocketManager.cs 스크립트 파일을 컴포넌트로 추가해준다.


4. SocketManager.cs 의 내용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using UnityEngine;
using System.Collections;
using SocketIOClient;
 
public class SocketManager : MonoBehaviour {
    string url = "http://127.0.0.1:999/";
    public static Client Socket { get; private set; }
 
    void Awake()
    {
        Socket = new Client(url);
        Socket.Opened += SocketOpened;
        Socket.Connect();
    }
 
    private void SocketOpened(object sender, System.EventArgs e)
    {
        Debug.Log("Socket Opened");
    }
 
    void OnDisable()
    {
        Socket.Close();
    }
}
 
cs


Awake 에서 Client 를 생성하고 접속을 시작한다.




5. 메세지를 보낼 UI를 작업하고 ChatTest.cs 스크립트를 컴포넌트로 추가해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class ChatTest : MonoBehaviour {
    public Text chatText;
    public Text chatWindow;
 
    List<string> buffer = new List<string>();
 
    // Use this for initialization
    void Start()
    {
        SocketManager.Socket.On("rMsg", (data) =>
        {
            Debug.Log(data.Json.args[0]);
            buffer.Add(data.Json.args[0].ToString());
        });
    }
 
    void Update()
    {
        if (buffer.Count <= 0return;
 
        foreach(var b in buffer)
        {
            chatWindow.text += b + "\n";
        }
        buffer.Clear();
    }
 
    public void SendChat()
    {
        SocketManager.Socket.Emit("sMsg", chatText.text);
        chatText.text = "";
    }
}
 
cs

SocketManager.Socket.On으로 서버로부터 수신한다.
리시브 함수에서 buffer리스트에 전달받은 텍스트를 추가해주고 update에서 리스트의 내용을 UI에 표시해주는 방법을 취하고 있는데,
리시브쪽에서 바로 UI에 표시하려고 하면 오류가 난다.

(쓰레드와 관련된 오류인 것 같다.)


검색해보니 일단 위와같은 방법으로 처리할 수 있다고 해서 쓰긴 했지만...

이 부분에 대해서는 좀 더 공부해봐야 할 것 같다.




6. 서버쪽 코드

1
2
3
4
5
6
7
8
9
var io = require("socket.io").listen(999);
 
io.sockets.on("connection"function(socket){
    console.log("A user connected");
 
    socket.on("sMsg"function(data){
        io.sockets.emit("rMsg", data);
    });
});
cs


socket.io 버전은 0.9.6 사용중



7. 실행 결과





다음에는 캐릭터 움직이는 걸 만들어봐야지

'#DevStudy > Unity' 카테고리의 다른 글

Unity <-> php 샘플 코드  (1) 2016.08.28
www 클래스 세션 유지 관련  (0) 2016.07.26
유니티와 안드로이드 연동  (0) 2016.07.21

댓글