/MLAPI

A game networking framework built for the Unity Engine to abstract game networking concepts

Primary LanguageC#MIT LicenseMIT

GitHub Release Github All Releases Discord Build Status AppVeyor Tests

Licence Website Wiki Api

MLAPI (Mid level API) is a framework that simplifies building networked games in Unity. It offers low level access to core networking while at the same time offering high level abstractions. The MLAPI aims to remove the repetetive tasks and reduces the network code dramatically, no matter how many of the modular features you use.

The MLAPI has features matched by nobody else, any more features are added when requested. The MLAPI is constantly evolving. Read about our features here.

Getting Started

To get started, check the Wiki. This is also where most documentation lies. Follow the quickstart, join our discord and get started today!

Support

For bug reports or feature requests you want to propose, please use the Issue Tracker on GitHub. For general questions, networking advice or to discuss changes before proposing them, please use the Discord server.

Compatibility

The MLAPI is built to work everywhere. It will run in the web, on many Unity versions, .NET runtimes and such.

The requirements for the MLAPI are:

  • Unity >= 2017

Special thanks

Special thanks to Gabriel Tofvesson for writing the BitWriter, BitReader & ECDH implementation.

Issues and missing features

If there are any issues, bugs or features that are missing. Please open an issue on the GitHub issues page.

Example

Here is a sample MonoBehaviour showing a chat script where everyone can write and read from. This shows the basis of the MLAPI and the abstractions it adds.

public class Chat : NetworkedBehaviour
{
    private NetworkedList<string> ChatMessages = new NetworkedList<string>(new MLAPI.NetworkedVar.NetworkedVarSettings()
    {
        ReadPermission = MLAPI.NetworkedVar.NetworkedVarPermission.Everyone,
        WritePermission = MLAPI.NetworkedVar.NetworkedVarPermission.Everyone,
        SendTickrate = 5
    }, new List<string>());

    private string textField = "";

    private void OnGUI()
    {
        if (IsClient)
        {
            textField = GUILayout.TextField(textField, GUILayout.Width(200));
            
            if (GUILayout.Button("Send") && !string.IsNullOrWhiteSpace(textField))
            {
                ChatMessages.Add(textField);
                textField = "";
            }

            for (int i = ChatMessages.Count - 1; i >= 0; i--)
            {
                GUILayout.Label(ChatMessages[i]);
            }
        }
    }
}