天天看點

unity-unet-同步各個player唯一辨別

  • Multiplayer Game 中所有 player 都有一個唯一辨別。在unet中可以通過 Network Identity 元件擷取到該 player 在整個網絡整的 唯一 的連接配接 id
  • 這裡測試則随便加了一個字首(Player_)+id 作為唯一的 name 指派給 transform.name,然後可以在 Runtime 時 Hierarchy 中可以觀察到

1. 整體思路:

  1. OnStartLocalPlayer 時,本機通過 Network Identity 元件的 id 生産唯一 name,設定的 transform.name 并 send 到服務端同步給其他用戶端
  2. 本機生成的其他玩家則在 Start 時通過服務端同步過來的name 設定為該玩家的 name

2. 代碼:

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Player_Id : NetworkBehaviour
{
    [SyncVar]
    private string playerUniqueIdentity;
    private NetworkInstanceId playerNetId;
    private Transform myTransform;

    public override void OnStartLocalPlayer()
    {
        GetNetIdentity();
        SetIdentity();
    }

    public void Start()
    {
        if (myTransform.name == "" || myTransform.name == "Player(Clone)")
        {
            SetIdentity(); //這裡設定唯一name的是本機用戶端中的其他玩家,本機玩家已經在OnStartLocalPlayer設定好了
        }
    }

    public void Awake()
    {
        myTransform = transform;
    }

    /// <summary>
    /// 擷取唯一id,生産一個唯一的name,并告訴服務端,同步到其他用戶端
    /// </summary>
    void GetNetIdentity()
    {
        playerNetId = GetComponent<NetworkIdentity>().netId;
        CmdTellServerMyIdentity(MakeUniqueIdentiy());
    }

    /// <summary>
    /// 如果是其他玩家,則從網絡中同步唯一name
    /// 如果是本機玩家,則直接自己生成唯一name
    /// </summary>
    void SetIdentity()
    {
        if (!isLocalPlayer)
        {
            myTransform.name = playerUniqueIdentity;
        }
        else
        {
            myTransform.name = MakeUniqueIdentiy();
        }
    }

    string MakeUniqueIdentiy()
    {
        string uniqueName = "Player_" + playerNetId.ToString();
        return uniqueName;
    }

    [Command]
    void CmdTellServerMyIdentity(string name)
    {
        playerUniqueIdentity = name;
    }
}
           

3. 測試

unity-unet-同步各個player唯一辨別

ok,done

繼續閱讀