02-05-2021



  1. Client Server Integration using Socket.IO - Unity 3D.
  2. Integrating Socket.IO. Socket.IO is composed of two parts: A server that integrates with (or mounts on) the Node.JS HTTP Server socket.io; A client library that loads on the browser side socket.io-client; During development, socket.io serves the client automatically for us, as we’ll see, so for now we only have to install one module.
  1. C# Socket.io
  2. Socket.io Unity3d

Like many homes, my kids and I enjoy playing video games together. At this stage of life, my kids especially playing games like Minecraft or Roblox. As I continue to explore the Unity ecosystem, I decided to look into using NodeJs to implement a playground for my kids in a Unity game. In this post, I’ll outline the major ideas I used to create my prototype. In the future, hope this prototype evolves into a multiplayer tank shooter game.

Socket.IO Client Library for Unity (mono /.NET 2.0), which is ported from the JavaScript client version 1.1.0. SocketIoClientDotNet by Quobject is a very good project, but it does not support Unity. So I spent a few overnights to port it to mono/.NET 2.0. Now game developers can. I can get Socket.IO to work well in Unity. I can also get Unity to publish directly to the Hololens. The problem now, is that once I import the MixedRealityToolkit into Unity alongside of a few DLL files for Socket.IO (NewtonsoftJson.dll, SocketIoClientDotNet.dll, WebSocket4Net.dll) I run into a bunch of errors.

This blog post will assume a working knowledge of Unity. To start things off, I installed the following tools from the Unity Asset store. If you’re interested in getting started with Unity, check out their learning materials here.

https://assetstore.unity.com/packages/tools/network/socket-io-for-unity-21721(by Fabio Panettieri)
https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347
(from Parent Element LLC)

Socket Io Unity

The SocketIO asset includes a sample scene outlining the common setup.

If you’re interested in inspecting a finished sample, please visit the following GitHub link.
https://github.com/michaelprosario/tanks

I did test this SocketIO in an Android mobile environment too. Unfortunately, it didn’t work well. These patterns seem to work fine with Unity desktop experiences. There may be additional edits I need to do to get it working.

While learning this pairing of Unity 3D and SocketIO, I found the following video series very helpful too. Thank you Adam Carnagey!

To build our prototype, let’s kick things off by building our server. This server will leverage NodeJs. In your server working directory, create a package.json like the following:

Next, let’s implement our tank-server.js. This code will instantiate a server using web sockets at port 4567.

Implementing the Unity client controller

Socket.io.unitypackageUnity

In your Unity solution, you will go through a process of creating a scene and defining your environment. In this section, we’ll outline the major parts of implementing the socket io prefab and the controller script.

C# Socket.io

  1. Like any game experience, we start with creating a new unity project, adding a scene, making a terrain, and player objects.
  2. Install the Unity SocketIO package from the asset store. https://assetstore.unity.com/packages/tools/network/socket-io-for-unity-21721

  3. After the package installs, inspect the README.txt and sample scene to get a feel of how you layout your scene and configure the references to your server. I recommend that you layout your scene in a similar fashion.

  4. For my solution, I started by crafting a few command and query objects to communicate state changes of my players to the server. We’ll also review response objects to receive data from the server.

Socket Io Unity

In this interface, we model some of the key operations of our scene. In your implementation of the scene, you will need to provide concrete implementations of these operations. You can see my simple implementation here:
https://github.com/michaelprosario/tanks/blob/master/Assets/Scenes/SceneOneView.cs

At this point, we’re ready to talk through the main socket controller script. I’m only going to highlight the key themes of the script. You can inspect the whole body of the script here. https://github.com/michaelprosario/tanks/blob/master/Assets/Scenes/SceneOneSocketController.cs

This controller depends upon the socketIO and a reference to the current player. The controller keeps a reference to the view interface so that messages from the server can be routed to scene actions.

When we start the controller, we give our player an identity. Next, we resolve the references for the view and the socket IO component. Finally, we connect various socket events to handlers. We also let the server know that a new player started.

The following methods enable us to send commands and query requests to the server.

To announce a new player, we leverage the following method.

As we move around, we let the server know how we’re moving. My gut says that I need to find a more optimal way to communicate this kind of state. I think it will work fine for a small number of players on a local network.

The following handlers map responses from the socket server to view actions.

Socket.io Unity3d

Hope this post gives you a general overview of how to start a multi-player Unity scene using NodeJS and SocketIO. We love to hear from our readers. Please share a comment and let us know what you’re building!