unity-unet-同步各个player唯一标识
2024-10-01 18:32:11
- 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. 测试
我个人感觉这个代码有问题,首先作为客户端没有将ID传给服务端,导致服务端现实的ID都为同一ID,过一阵放上自己的代码
最新文章
- 工业串口和网络软件通讯平台(SuperIO 2.0)发布
- 用Android Studio 开发Android应用
- JVM内存管理------JAVA语言的内存管理概述
- 连接UI到代码
- linux内核hash list
- ListView的item选中效果
- [ES7] Exploring ES2016 Decorators
- 《开源分享2》:《开源框架实战宝典电子书V1.0.0》完整版!
- 10步教你来优化WordPress速度 为服务器和访客减压
- 指定hive输出格式
- C语言中给数组赋随机值
- NBUT 1120 线段树
- UVa 10033 - Interpreter
- 微信JS图片上传与下载功能--微信JS系列文章(三)
- Algorithm -->; 爬楼梯求最大分数
- oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)
- Python学习笔记第八周
- Oracle数据库拼接字符串
- pytesser模块WindowsError错误解决方法
- Gevent-socket
热门文章
- 对照 Android 的 Intent 与 iOS StoryBoard 的 Segue - Intent 假设也能添加个prepareForSegue回调就好了
- .Net中字典的使用
- Red Hat Linux 安装 (本地、网络安装)
- 使用js实现简单放大镜的效果
- RQNOJ PID496/[IOI1999]花店橱窗布置
- android 动态设置TextView值,例:金额添加
- SQL Server 为代码减负之存储过程
- Visual Studio Set Project Environment Variables
- vim-normal多行操作命令的使用
- android图像处理系列之三-- 图片色调饱和度、色相、亮度处理