게임엔진관련/유니티 엔진

[Unity] 유니티 WebSocket 웹소켓 관련

AlrepondTech 2019. 11. 25. 10:44
반응형

 

 

 

=======================

=======================

=======================

 

 

 

 

 

유니티 웹소켓, Socket IO 추가하기.

 

https://assetstore.unity.com/packages/tools/network/socket-io-for-unity-21721

여기 유니티에셋 스토어에서 무료로 받아서 유니티 에디터로 가서 설치한다.

 

 

에셋스토어에서 Socket.IO 로 찾아주어도 된다.

 

 

 

빨간표시와 같이 "Import"를 눌러서 프로젝트에 설치해준다.

 

그러면 "Assets"->"SocketIO" 폴더가 생기게 될것이다.

 

그림과같이 "SocketIO"->"Prefabs" 으로가서 "SocketIO"를 그림1과 같이 눌러주면 WebSocket 설정을 그림2와

같이 할수있다. (여기서 자신이 연결할 설정을 해주자)

 

 

 

설정을 모두 마치면 "SocketIO"와 같이 폴더가 생기가 그림"1", "2", "3" 번 순서대로 찾아가서 Prefabs를 찾아

Hierarchy에 그림2의"SocketIO"Prefabs를 드래그하여 옮겨준다.

 

 

 

 

 

여기에서 코드제어를 하려면 프로젝트안에 설치된폴더"SocketIO"->"Scripts"->"Test" 폴더로 가면

폴터안에 테스트 코드가 있다.

using System.Collections;
using UnityEngine;
using SocketIO;

public class TestSocketIO : MonoBehaviour
{
	private SocketIOComponent socket;

	public void Start() 
	{
		GameObject go = GameObject.Find("SocketIO");
		socket = go.GetComponent<SocketIOComponent>();

		socket.On("open", TestOpen);
		socket.On("boop", TestBoop);
		socket.On("error", TestError);
		socket.On("close", TestClose);
		
		StartCoroutine("BeepBoop");
	}

	private IEnumerator BeepBoop()
	{
		// wait 1 seconds and continue
		yield return new WaitForSeconds(1);
		
		socket.Emit("beep");
		
		// wait 3 seconds and continue
		yield return new WaitForSeconds(3);
		
		socket.Emit("beep");
		
		// wait 2 seconds and continue
		yield return new WaitForSeconds(2);
		
		socket.Emit("beep");
		
		// wait ONE FRAME and continue
		yield return null;
		
		socket.Emit("beep");
		socket.Emit("beep");
	}

	public void TestOpen(SocketIOEvent e)
	{
		Debug.Log("[SocketIO] Open received: " + e.name + " " + e.data);
	}
	
	public void TestBoop(SocketIOEvent e)
	{
		Debug.Log("[SocketIO] Boop received: " + e.name + " " + e.data);

		if (e.data == null) { return; }

		Debug.Log(
			"#####################################################" +
			"THIS: " + e.data.GetField("this").str +
			"#####################################################"
		);
	}
	
	public void TestError(SocketIOEvent e)
	{
		Debug.Log("[SocketIO] Error received: " + e.name + " " + e.data);
	}
	
	public void TestClose(SocketIOEvent e)
	{	
		Debug.Log("[SocketIO] Close received: " + e.name + " " + e.data);
	}
}

이샘플 코드를 참고하여 소켓으로 연결된 코드들을 제어해가며 코딩해가면 된다.

 

//-------------------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------------------

 

 

//클래스의 싱글톤은 https://202psj.tistory.com/1247 여기를 참조하시면 됩니다.   

public class CWebSocket : CSingletonGObj
{
    public class CWSoc
    {
        CWS _wsocket = null;

        Dictionary<string, List<Action>> _handlers = new Dictionary<string, List<Action>>();

        public void Init(CWS ws)
        {
            if (ws == null)
                return;

            _wsocket = ws;
            _wsocket.On(CWS.ST_OPEN, OnOpen);
            _wsocket.On(CWS.ST_CLOSE, OnClose);
            _wsocket.On(CWS.ST_MESSAGE, OnMessage);
        }

        public void Connect()
        {
            if(_wsocket != null)
            {
                _wsocket.Connect();
            }
        }

        public void OnOpen(SocketIOEvent e)
        {
            //Debug.Log("[WebSocketIO] Open received: " + e.name + " " + e.data);

            if (_handlers.ContainsKey(CWS.ST_OPEN))
            {
                foreach (Action handler in this._handlers[CWS.ST_OPEN])
                {
                    try
                    {
                        handler(e);
                    }
                    catch (Exception ex)
                    {
#if SOCKET_IO_DEBUG
debugMethod.Invoke(ex.ToString());
#endif
                    }
                }
            }
        }

        public void OnClose(SocketIOEvent e)
        {
            //Debug.Log("[WebSocketIO] Close received: " + e.name + " " + e.data);

            if (_handlers.ContainsKey(CWS.ST_CLOSE))
            {
                foreach (Action handler in this._handlers[CWS.ST_CLOSE])
                {
                    try
                    {
                        handler(e);
                    }
                    catch (Exception ex)
                    {
#if SOCKET_IO_DEBUG
debugMethod.Invoke(ex.ToString());
#endif
                    }
                }
            }
        }


        public void OnMessage(SocketIOEvent e)
        {
            //Debug.Log("[WebSocketIO] Message received: " + e.name + " " + e.data);

            /*
            if (e.data == null) { return; }

            Debug.Log(
                "#####################################################" +
                "THIS: " + e.data.GetField("this").str +
                "#####################################################"
            );
            */

            if (_handlers.ContainsKey(CWS.ST_MESSAGE))
            {
                foreach (Action handler in this._handlers[CWS.ST_MESSAGE])
                {
                    try
                    {
                        handler(e);
                    }
                    catch (Exception ex)
                    {
#if SOCKET_IO_DEBUG
debugMethod.Invoke(ex.ToString());
#endif
                    }
                }
            }
        }

        public void On(string ev, Action callback)
        {
            if (!_handlers.ContainsKey(ev))
            {
                _handlers[ev] = new List<Action>();
            }

            _handlers[ev].Add(callback);
        }

        public bool IsConnect()
        {
            return _wsocket.IsConnected;
        }

        public void EmitString(string val)
        {
            if (IsConnect())
            {
                _wsocket.EmitString(val);
            }
        }
    }
 

    //"Socket IO Unity"의 Prefabs오브젝트경로 "SocketIO"->"Prefabs" 에서 "SocketIO_CWS" 이름으로 넣어준다.
    private const string PREFAB_OBJ_PATH = "SocketIO/Prefabs/SocketIO_CWS";

    // Use this for initialization
    void Start()
    {
    }

    public CWSoc CreateWSoc(string url)
    {
        //Awake에서 미리 소켓셋팅이 되기때문에Prefabs복사전에 설정을 미리 해주어
        //복사를 해주면 Awake이벤트에 가면서 설정셋팅이 된다.
        GameObject resWS = (GameObject)Resources.Load(PREFAB_OBJ_PATH);
        CWS ws = resWS.GetComponent();
        ws.url = url;
        ws.ackExpirationTime = 1800;
        ws.pingInterval = 25;
        ws.pingTimeout  = 60;

        GameObject cpyPrefab = Instantiate(resWS) as GameObject;
        CWS cpWS = cpyPrefab.GetComponent(); //copy ws

        CWSoc soc = null;
        if (cpWS != null)
        { 
            soc = new CWSoc();
            soc.Init(cpWS);
        }

        return soc;
    }


    // Update is called once per frame
    void Update()
    {
    }
}

 

 

//CWebSocket 클래스사용 예제

public class CTest
{

    CWebSocket.CWSoc _wSoc = null;
    CWebSocket.CWSoc _wSoc2 = null; 

  
    public void Connect()
    {
        if (_wSoc == null)
        {

                //websocket 주소는 "ws://111.18.25.129:8989" 이런게 할수도 있고
                //또는 "ws://111.18.25.129:8989/test/live"이렇게도 된다
                string addr = "ws://111.18.25.129:8989/test/live";
               
                _wSoc = CWebSocket.Inst.CreateWSoc(addr); 
                _wSoc.On(CWS.ST_OPEN, OnOpen); 
                _wSoc.On(CWS.ST_CLOSE, OnClose); 
                _wSoc.On(CWS.ST_MESSAGE, OnMessage); 
                _wSoc.Connect(); 
      

     
                string addr2 = "ws://111.18.25.129:8989";
                _wSoc2 = CWebSocket.Inst.CreateWSoc(addr2); 
                _wSoc2 .On(CWS.ST_OPEN, OnOpen2); 
                _wSoc2 .On(CWS.ST_CLOSE, OnClose2); 
                _wSoc2 .On(CWS.ST_MESSAGE, OnMessage2); 
                _wSoc2 .Connect(); 
      

         }
    }

 
    public void OnOpen(SocketIOEvent e)
    {
        Debug.Log("[CNetWeb] Open received: " + e.name + " " + e.data);
        
        JSONObject json = new JSONObject();
        json.AddField("PktKind", pkMOOLogin);
        EmitString(json.Print());
    }
    
    public void OnClose(SocketIOEvent e)
    {
        Debug.Log("[CNetWeb] Close received: " + e.name + " " + e.data);
    }
    
    public void OnMessage(SocketIOEvent e)
    {
        Debug.Log("[CNetWeb] Message received: " + e.name + " " + e.data);
        OnParse(e.data);
    }



    public void OnOpen2(SocketIOEvent e) 
    { 
        Debug.Log("[CNetWeb] Open received: " + e.name + " " + e.data); 
         
        JSONObject json = new JSONObject(); 
        json.AddField("PktKind", pkMOOLogin); 
        EmitString(json.Print()); 
    } 
     
    public void OnClose2(SocketIOEvent e) 
    { 
        Debug.Log("[CNetWeb] Close received: " + e.name + " " + e.data); 
    } 
     
    public void OnMessage2(SocketIOEvent e) 
    { 
        Debug.Log("[CNetWeb] Message received: " + e.name + " " + e.data); 
        OnParse(e.data); 
    } 
    
    public void EmitString(string val)
    {
        if (!_wSoc.IsConnect())
            return;

        _wSoc.EmitString(val);
    }



}

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: http://www.gamecodi.com/board/zboard-id-GAMECODI_Talkdev-no-3234-z-8.htm

 

모바일 게임이고

실시간 멀티플레이가 가능한 게임 서버를 만들려고 합니다. (클라는 유니티로)

웹서버로 하고 웹소켓을 고려중인데

그냥 TCP 소켓을 쓰는 방식에 비해 어떤 장단점이 있을까요?

추측입니다만 웹으로 가면 안정성과 개발편의성 등등이 있을것 같은데요.

어떻게들 보시나요?

 

-------------------------------------------------------------------------------------------------------------------------------------------------------

저희 프로젝트가 WebSocket을 사용했었습니다.
실시간 PvP를 위해 사용되었습니다.
저희 서버쪽이 웹서버 베이스이기도하고,, 실시간 게임서버 개발에 대한경험이 딱히 없었기 때문에 사용했습니다.

구성은 아래와 같고,,
서버: NodeJS/SocketIO,
클라: Unity3D + WebSocket/SocketIO 지원 Http 클라이언트(UniWeb)

장점은,,
프로토콜이 무척 간단하고 쉽기 때문에, 오롯히 비지니스로직에만 집중할 수 있습니다.
리얼에 운영된 실시간 PvP의 서버코드가 1000라인 내외일정도니깐,, 개발속도만큼은 확실히 이득입니다.
클라도 에셋스토어에서 소켓IO지원 Http 모듈만 잘 구하면,, 오롯히 비지니스에만 집중가능합니다.
통신은 암호화된 Json으로 했습니다.

몇가지 이슈가 있었는데
클라:
- UniWeb SocketIO 가 구버전 프로토콜만을 지원
- 프로토콜 지원이 완벽하지 않아서(heartbeat 가 안보내지는 이슈..) Uniweb을 수정후 사용했습니다.
- 저희가 개발을 시작할 당시에 SocketIO를 지원하는 Unity 플러그인이 이거 밖에 없었는데,, 지금은 BEST HTTP도 있는것 같습니다.

서버:
- NodeJS문제인지 SocketIO문제인지,, 메모리가 지속적으로 누수되는 문제가 있습니다.
- 구글링 결과 SocketIO이슈인것 같긴한데,, 클라가 SocketIO 구버전 프로토콜만을 지원해서,, 버전업이 불가했습니다.
- 가비지 컬렉션으로 갑자기 순단이 발생합니다. 실시간 PvP 에서 순단이 무척 민감해서, 가비지 컬렉션 옵션을 이래저래 많이 신경써야 합니다.
- 하지만 아무리 신경써도 순단을 완벽히 막진 못합니다.

저희 게임이 흥행에 실패해서ㅠㅠ
사용자가 많진 않았지만,, 피크일때도 응답속도는 괜찮았습니다.
다만 메모리 누수때문에 지속적으로 서버 재붓을 해줘야 했던게...
메모리 누수 때문에 Java기반의 Vert.x 도 고려해봤는데,, 시간이 부족해서 이사는 못했네요.

 

개인적으로 웹소켓의 장점은(SocketIO까지 쓴다고 가정했을때),
- SocketIO의 프로토콜이 아름다울지경이다.
- 자체 커넥션 관리가 있어서(허트비트) 데드커넥션에 대해 신경쓸일이 많이 준다
- 비즈니스로직만 신경쓰면된다.
- 거의 디팩토스탠다드라, 따로 프로토콜에 대해 문서화할 필요가 없다. (첫 4바이트는 length이고, 다음 몇바이트는 뭐고.. 이런..)
- Redis 연동이 쉽다

단점은 아래 정도가 아닐까 합니다.
- 보통 서버로 Node.JS 를 쓰는데, 성능을 꽤많이 포기해야한다. (대신 스케일아웃은 쉬운편이라 장비로 버텨낸다)
- SocketIO 프로토콜이 Json기반이라 사용하기는 너무 편리한데, 데이터가 커지는 경향이 있다
- SocketIO가 발전하는 기술이라, 버전에 따라 프로토콜 호환이 안된다.

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://mym0404.blog.me/221400978857

 

뻘짓을 하다가 사용법을 찾아서 포스팅한다.

 

------------

https://assetstore.unity.com/packages/tools/network/socket-io-for-unity-21721

 

Socket.IO for Unity - Asset Store

Requires Unity 4 or higher. Unity Pro is required in order to build using .NET sockets. You may use a replacement package if yo...

assetstore.unity.com

 

위와 같은 에셋 스토어 링크에서 무료로 다운받을 수 있다.

 

 

 

설치된 패키지에서 프리팹을 Hierarchy View에 두고 

 

 

 

이렇게 url을 설정하고 여러 소켓 옵션을 설정 한다.

 

public class NetworkManager : MonoBehaviour {
    #region SINGLETON
    private static NetworkManager instance;
    public static NetworkManager Instance { get { return instance; } }
    private void SetSingleton() {
        if (Instance != null) {
            DestroyImmediate(gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(gameObject);
    }
    #endregion
    private void Awake() {
        SetSingleton();
    }


    SocketIOComponent socket;


    // Use this for initialization
    void Start () {
        GameObject go = GameObject.Find("SocketIO");
        socket = go.GetComponent<SocketIOComponent>();
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}


Colored by Color Scripter
cs

 

그리고 이렇게 프리팹 객체를 가져온 다음에 SocketIOComponent 객체를 가져온다.

 

NetworkManager는 싱글톤으로 설정하였다.

[출처] [UNITY] Socket.IO Client 사용하기|작성자 MJ Studio

 

 

 

 

 

반응형

 

 

728x90

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://yhc509.tistory.com/entry/Unity-Nodejs-%ED%86%B5%EC%8B%A0-Socketio

 

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

 

 

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

https://github.com/NetEase/UnitySocketIO

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

 

 

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

 

 

 

간단한 에코서버 만들기

 

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

 

4. SocketManager.cs 의 내용

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();
    }
}

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

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 = "";
    }
}

SocketManager.Socket.On으로 서버로부터 수신한다.

리시브 함수에서 buffer리스트에 전달받은 텍스트를 추가해주고 update에서 리스트의 내용을 UI에 표시해주는 방법을 취하고 있는데,

리시브쪽에서 바로 UI에 표시하려고 하면 오류가 난다.

 

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

 

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

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

 

6. 서버쪽 코

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);
    });
});

7. 실행 결과

 

 

 

 

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

 

 

 

 

=======================

=======================

=======================

 

 

 

출처: https://kumo.tistory.com/45

Unity3d Socket.IO Client

nity3d socket.io client

 

https://github.com/NetEase/UnitySocketIO 에서 제공중

 

https://github.com/NetEase/UnitySocketIO.git 

 

 

하지만 Message 를 json으로 파싱 하는 과정에서 에러..

 

Why?!

 

처음에 잘못 가져다 썻나 고민했지만.. 

 

찾다보니 먼저 가신 선배님이 있으셨습니다.

 

[ Message 를 받는 변수의 이름을 Name -> name / Args -> args 로 변경 ]

 

이건. 3시간짜리 삽질..



출처: https://kumo.tistory.com/45 [Running]

 

 

 

=======================

=======================

=======================

 

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=overy1234&logNo=220687826706&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

1. node.js 설치

프로그램을 설치 하기위해서 홈페이지로 갑니다. 

 

https://nodejs.org/

 

 

 

 

왼쪽의 v4.2.4 LTS 다운받으시면 됩니다.

 

프로그램 설치는 다들 아시죠? 아무것도 변경하지 마시고 긍정적인거 누르면서 다음으로 넘어가시면

 

C:\Program Files\nodejs 경로에 설치가 되게 됩니다.

 

 

2. node.js 세팅

 

도스 프롬프트를 실행시켜서 모듈이 잘 설치되었는지 확인해보도록 하겠습니다.

 

시작 - 실행 or 윈도우키 + R

 

cmd창에서 node -v 명령어를 치시면

 

 

 

 

Socket.IO설치

 

C:\Program Files\nodejs 

 이경로에서 설치실행

 

npm install socket.io -g

   또다른 방법으로

   npm install -g socket.io

 

 

잘안되면 지웠다가 다시 시도

 

Unity와 Socket.IO 연동하기

유니티에서 node.js의 socket.io와 통신하는 간단한 예제를 하나 살펴보자.



일단, 유니티에서 새로운 프로젝트를 하나 만든다. (프로젝트 이름을 SocketIOExample라고 지었다.)

 

 

 

다음으로, GitHub의 NetEase님이 만든 유니티의 socket.io플러그인을 설치하자. https://github.com/NetEase/UnitySocketIO에서 받을 수 있다. 다운을 받은 후에 “SocketIO\Bin\Debug\”폴더에 있는 모든 dll파일들을 유니티의 프로젝트(Assets폴더)에 복사하자. (UnitySocketIO라는 폴더를 하나 만들어서 넣었다.)

 

그리고 빈 게임 오브젝트와 C#스크립트를 각각 하나씩 만들고, 이름을 SocketManager라고 지어준다. 그리고 이 스크립트를 게임오브젝트에 연결시켜준다.

 

SocketManager스크립트를 편집기로 열어서 다음과 같이 적어준다.

3행: SocketIOClient 네임스페이스를 반드시 추가해주어야한다.
7행: url에 “http://[서버 IP주소]:[포트]/”를 입력한다. 끝에 “/”을 절대 빼먹지 않도록 한다. 이거 하나 때문에 거의 3시간을 허비했다.
10~15행: 새로운 소켓을 하나 만들고, 연결하는 부분이다. 소켓이 연결되었을 때의 이벤트를 하나 설정해주었다.
17~20행: 소켓이 연결되었을 때의 발생될 이벤트.
22~25행: OnDisable이벤트가 발생 시에 소켓 연결을 끊는다.


(메시지를 받았을 때의 이벤트, 연결이 끊어졌을 때의 이벤트, 에러 발생시의 이벤트에 대해서도 알고 싶다면, https://github.com/NetEase/UnitySocketIO에서 참고할 수 있다.)



여기까지 되었다면, 또 빈 게임 오브젝트 하나와 C# 스크립트 하나를 각각 추가한다. (이름을 SocketTest라고 지어주었다.)

 

​그리고 SocketTest스크립트에는 다음과 같이 작성한다.

 

 

 

5~11행: “MsgRes” 소켓이벤트가 발생시에, 람다식을 실행함. 서버측으로 부터 전송받은 데이터 정보가 data에 담기고, 데이터는 data.Json.args[0]에서 확인할 수 있다.
13~17행: SEND 버튼을 하나 만들고, 클릭 시에, 서버측으로 “Msg"소켓 이벤트를 발생시키면서 "Hello, World"라는 문자열 데이터를 함께 보냄.



이제 서버측을 살펴 보도록 하자. 먼저 node.js의 socket.io를 설치하고, 간단한 코드를 작성해보자.

SocketIOExample폴더에서 Server라는 폴더를 하나 생성 후에 그안에서 [Shfit+오른쪽 버튼 클릭]을 해서 [여기서 명령 창 열기(W)]를 누른다. cmd창이 뜨면 npm install socket.io@0.9.6을 입력 후 엔터를 누르면, socket.io 0.9.6버전이 설치가 된다. (*최신버전은 작동안함)

만약 SocketIo폴더가 다른데 있으면 복사해온다.Server폴더로

 

그리고 같은 폴더에서 새로운 텍스트 파일을 하나 만들어서 이름을 server.js라고 해준다. (확장자는 반드시 .js이어야 함)

server.js안에 코드를 다음과 같이 작성한다.

 

 

 

 

 

1행: socket.io를 사용하기 위한 모듈을 불러오고, 999번 포트에서 소켓을 연다. (포트는 위의 유니티에서 지정한 포트와 일치해야함)
3행: 클라이언트가 연결되었을 때, 콜백을 실행시킨다.
4행: 클라이언트가 연결되면, console에 메시지를 출력함.
6~8행: "Msg"소켓 이벤트가 발생시에, 콜백이 실행되고, 클라이언트측으로 "MsgRes"이벤트를 발생시킴.

 

 

그러면 이제 정상적으로 작동을 하는지 테스트를 한번 해보자.

먼저 cmd창에서 "node server"를 입력해서 서버를 작동시킨다.

 

 

 

 

그리고 유니티에서 플레이 버튼을 클릭한다.

콘솔창에 다음과 같은 메시지가 출력이 되면 정상적으로 서버에 소켓이 연결되었다는 것이다. (SocketManager의 SocketOpened이벤트가 정상작동 한 것임)

 

 

 

=======================

=======================

=======================

 

 

#기타관련링크

참고:

https://meetup.toast.com/posts/112

 

https://github.com/nhnent/socket.io-client-unity3d

 

https://code.visualstudio.com/docs/nodejs/nodejs-tutorial

 

https://assetstore.unity.com/packages/tools/network/socket-io-for-unity-21721

 

https://poiemaweb.com/nodejs-socketio

 

https://github.com/nhnent/socket.io-client-unity3d/wiki/Sample

 

- https://meetup.toast.com/posts/112

 

- https://themangs.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0%EB%9E%91-nodejs-%EA%B0%84%EB%8B%A8-%EC%97%B0%EB%8F%99-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%95%B4%EB%B3%B4%EA%B8%B0

 

- https://awesomeopensource.com/project/floatinghotpot/socket.io-unity

 

https://heyzlluck.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80-Nodejs-%EC%9B%B9%EC%86%8C%EC%BC%93%EC%84%9C%EB%B2%84

https://yakolla.tistory.com/52

https://www.slideshare.net/JoshGlover/unity-and-websockets

 

- https://smilejsu.tistory.com/1452

 

- https://www.youtube.com/watch?v=tn3cWcSYmHE

 

- https://www.diycode.cc/projects/NetEase/UnitySocketIO

 

- http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&page=7&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=hit&desc=asc&no=4428

 

- https://framesynthesis.jp/tech/2015/07/unitysocketio/

 

- https://m.blog.naver.com/PostView.nhn?blogId=pangbingsan&logNo=220585198941&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

- https://unitylist.com/p/pm6/Socket-IO-Unity

 

- https://www.youtube.com/watch?v=CaLL_Xf2D6E

 

- http://www.luohanjie.com/2019-07-25/socket-io-for-unity3d.html

 

- https://m.blog.naver.com/PostView.nhn?blogId=pangbingsan&logNo=220584142528

 

 

Unity

 

 

=======================

=======================

=======================

 

 

 

반응형