📜  unity mlapi (1)

📅  最后修改于: 2023-12-03 15:05:44.742000             🧑  作者: Mango

Unity MLAPI

Unity MLAPI是一个用于协作网络游戏服务器的框架。它旨在使开发人员能够轻松地创建可扩展的网络游戏,并且支持多种网络方案和Unity引擎版本。

特性
  • 支持多种网络方案(UNet、旧版UNET、Mirror和自定义)
  • 轻松创建可扩展的多人游戏
  • 动态生成网络消息类型
  • 支持自定义RPC和可靠消息
  • 支持Mirror的移动插件
安装

您可以从GitHub上的Unity MLAPI库中获取Unity MLAPI的最新版本。

安装Unity MLAPI的最新版,可以通过以下步骤:

  1. 您需要首先将Unity导出的项目克隆到本地:https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi.git.

  2. 打开Unity并导入新的项目.

  3. 最后您将找到新模块,Multiplayer MLAPI Examples,如图所示.

image1

开始使用Unity MLAPI

下面是如何在Unity中使用成熟的Unity MLAPI项目的要点:

1. 创建网络身份验证

如何创建网络身份验证:

using MLAPI;
using MLAPI.Transports.UNET;

public class NetworkManagerHelper : MonoBehaviour {
    // 定义用于控制网络连接的NetworkManager
    private NetworkManager networkManager;

    public void Start() {
        // 这改变了UNTY Transport的端口
        NetworkManager.Singleton.GetComponent<UNETTransport>().Port = 7777; 
        networkManager = NetworkManager.Singleton;
        networkManager.OnClientDisconnectCallback += NetworkManager_OnClientDisconnectCallback;
        networkManager.OnServerStopEvent += NetworkManager_OnServerStopEvent;
    }

    // 关闭连接时执行
    private void NetworkManager_OnServerStopEvent() {
        Debug.Log("Server has been stopped.");
    }

    // 当一个客户端断开连接时执行
    private void NetworkManager_OnClientDisconnectCallback(ulong obj) {
        Debug.Log("Client has disconnected from server || " + obj);
    }
}
2. 当用户加入时,创建网络身份验证
// 创建一个新用户
public void SpawnPlayer() {
    // 获取角色选择和输入名字
    string selectedCharacterPrefab = "boxshape";
    string playerName = "Player " + networkManager.ConnectedClientsList.Count;

    // 在服务器上生成用户
    networkManager.ConnectedClientsList[0].PlayerObject = Instantiate(Resources.Load(selectedCharacterPrefab), Vector3.zero, Quaternion.identity) as GameObject;
    if (networkManager.IsServer) {
        // 如果有一个客户端,哪怕是host,也会在客户端上生成用户
        GameObject user = networkManager.ConnectedClientsList.SingleOrDefault(x => x.PlayerObject != null).PlayerObject;
        if (user != null) {
            user.GetComponent<PlayerInfo>().playerName = playerName;
            Debug.Log(user.GetComponent<PlayerInfo>().playerName + " has entered the game!");
        }
    }
}

// 服务器生成的角色或客户端生成的角色
public class PlayerInfo : NetworkBehaviour {
    [SerializeField]public string playerName;
}
3. 网络事件处理程序
// 建立连接
public void OnClientConnect(NetworkConnection conn) {
    Debug.Log("Connecting...");
}

// 客户端连接失败
public void OnClientDisconnect(NetworkConnection conn) {
    Debug.Log("Disconnected.");
}

// 服务器启动
public void OnServerStart() {
    Debug.Log("Server has started.");
}

// 服务器停止
public void OnServerStop() {
    Debug.Log("Server has stopped.");
}

// 角色运动
public void OnServerUpdate() {
    GameObject user = networkManager.ConnectedClientsList.SingleOrDefault(x => x.PlayerObject != null).PlayerObject;
    if (user) {
        // 玩家输入采取的行动 
        if (Input.GetKeyDown(KeyCode.W)) {
            user.transform.position += Vector3.forward;
        } else if (Input.GetKeyDown(KeyCode.A)) {
            user.transform.position += Vector3.left;
        } else if (Input.GetKeyDown(KeyCode.S)) {
            user.transform.position += Vector3.back;
        } else if (Input.GetKeyDown(KeyCode.D)) {
            user.transform.position += Vector3.right;
        }
        Debug.Log("Player (ID " + NetworkManager.Singleton.LocalClientId + ") Position: " + user.transform.position);
    }
}
4. 采取措施
  • 获取Hierarchy/Network Manager组件并进行相关设置。
  • 按照上面的代码示例处理网络事件回调。
  • 要想支持可靠的消息传递和自定义RPC的Language-Level支持。可以使用注释生成消息,这将在运行时自动创建所需的消息传输。
  • 必须手动为同步对象指定自定义此自定义(SynchronizedVariable,SynchronizedObject,SynchronizedList).
总结

Unity MLAPI是一个用于协作网络游戏服务器的框架。该框架支持多种网络方案,使开发人员能够轻松创建可扩展的网络游戏。此外,Unity MLAPI还支持多种自定义RPC,以及Mirror的移动插件。如果您正在开发多人游戏,那么Unity MLAPI是您必不可少的工具。