- Multiplayer Game 中所有 player 都有一個唯一辨別。在unet中可以通過 Network Identity 元件擷取到該 player 在整個網絡整的 唯一 的連接配接 id
- 這裡測試則随便加了一個字首(Player_)+id 作為唯一的 name 指派給 transform.name,然後可以在 Runtime 時 Hierarchy 中可以觀察到
1. 整體思路:
- OnStartLocalPlayer 時,本機通過 Network Identity 元件的 id 生産唯一 name,設定的 transform.name 并 send 到服務端同步給其他用戶端
- 本機生成的其他玩家則在 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. 測試
ok,done