Unity Socket



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.

  1. Unity Socket Io
  2. Unity Websocket Webgl
  3. Unity Socket Lib
  4. Unity Socket Close
  • Unity Networking supports WebGL by enabling communication via the WebSockets protocol.
  • TCP Socket Error: Only one usage of each socket address (protocol/network address/port) is normally permitted 3 C# — TcpListener.Start causing SocketException with message “Only one usage of each socket address”.

Using sockets is built into C#. This isn't related to Unity. Now whether or not Unity prevents you from using sockets, I'm unaware of. But, I believe it should all be very possible. Here's an introduction guide to socket programming in C#. If you're using JavaScript, I'm not sure how possible that will be, but I'm sure with a little googling. TCP/IP Client - Server Basics. Simple TCP/IP Client DLL Code - Client code and instructions for the DLL written in C#; Simple TCP/IP Server Code - Server Code; Simple TCP/IP Unity Code - Unity Script Code.

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.

Unity Socket

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)

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.

Unity socket

Implementing the Unity client controller

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.

  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.

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

Unity socket io clientUnity

Unity Socket Io

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.

Unity Websocket Webgl

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

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

Unity Socket Lib

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.

Unity Socket Close

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!