当前位置: 首页 > article >正文

Unity插件-Mirror使用方法(五)组件介绍(​Network Identity)

目录

一、插件介绍

二、主要组件

Network Manager

Network Manager HUD

三、Network Identity

1、组件介绍

2、核心功能

网络唯一标识

同步生命周期

权限管理

组件依赖

3、关键属性与配置

4、基础使用方法

1. 添加与配置

2. 脚本中的访问

5、高级功能与示例

1. 动态生成网络对象

2. 同步变量与钩子函数

3. 权限控制示例

6、注意事项

唯一性要求

预制体注册

本地玩家权限

网络生命周期

7、常见问题与解决


一、插件介绍

Unity插件-Mirror使用方法(一)Mirror介绍-CSDN博客


二、主要组件

Unity插件-Mirror使用方法(二)组件介绍-CSDN博客

Network Manager

Unity插件-Mirror使用方法(三)组件介绍(Network Manager)-CSDN博客

Network Manager HUD

Unity插件-Mirror使用方法(四)组件介绍(​Network Manager HUD)-CSDN博客


三、Network Identity

1、组件介绍

Network Identity 是 Unity Mirror 中最核心的组件之一,用于标识游戏对象(GameObject)的网络身份。它赋予对象在网络环境中的唯一性,并管理其同步、生成与销毁过程。任何需要参与网络交互的对象(如玩家、敌人、道具)都必须附加此组件。

Network Identity 组件是 Unity 网络高层级 API 的核心。它控制游戏对象在网络中的唯一身份标识,并利用该标识使网络系统感知该游戏对象。它提供了两种互斥的配置选项,这意味着只能选择其中一个选项或不选任何选项。


2、核心功能

网络唯一标识

  1. 每个对象的 netId 由服务器分配,确保全局唯一性。
  2. 客户端通过 netId 精确匹配服务器上的对应对象。

同步生命周期

  1. 控制对象的生成(Spawn)与销毁(Destroy)的同步。
  2. 服务器销毁对象时,所有客户端自动同步移除。

权限管理

  1. isServer:标记对象是否由服务器控制。
  2. isClient:标记对象是否存在于客户端。
  3. isLocalPlayer:标识当前对象是否为本地玩家角色(用于区分本地/远程玩家输入)。

组件依赖

  1. 所有 NetworkBehaviour 脚本(如自定义同步逻辑)必须挂载在拥有 Network Identity 的对象上。 

3、关键属性与配置

在 Unity Inspector 面板中,Network Identity 的配置项如下:

属性说明
Client Started客户端启动时自动激活
Server Only仅服务器生成(勾选后对象不会复制到客户端)
Visible默认可见性设置(控制对象在网络中的可见范围)

4、基础使用方法

1. 添加与配置

  1. 为需要网络同步的预制体(如玩家角色)添加 Network Identity 组件。
  2. 确保该预制体已注册到 NetworkManager 的 Spawn Prefabs 列表(动态生成的对象必须满足此条件)。

2. 脚本中的访问

  1. 在继承自 NetworkBehaviour 的脚本中,可直接访问 netIdentity 属性: 
public class PlayerController : NetworkBehaviour {
    void Update() {
        if (isLocalPlayer) {
            // 仅本地玩家执行移动逻辑
            Move();
        }
    }

    void Move() {
        // 移动代码
    }
}

5、高级功能与示例

1. 动态生成网络对象

[Command]
void CmdSpawnEnemy() {
    GameObject enemy = Instantiate(enemyPrefab, spawnPosition, Quaternion.identity);
    NetworkServer.Spawn(enemy); // 生成并同步到所有客户端
}

2. 同步变量与钩子函数

public class Health : NetworkBehaviour {
    [SyncVar(hook = nameof(OnHealthChanged))]
    public int currentHealth = 100;

    void OnHealthChanged(int oldValue, int newValue) {
        // 客户端在血量变化时触发(如更新UI)
        Debug.Log($"Health changed from {oldValue} to {newValue}");
    }

    [Command]
    public void CmdTakeDamage(int damage) {
        currentHealth -= damage;
    }
}

3. 权限控制示例

public class Door : NetworkBehaviour {
    [SyncVar]
    private bool isOpen;

    [Command(requiresAuthority = false)]
    public void CmdToggleDoor() {
        if (!isServer) return; // 确保仅服务器执行逻辑
        isOpen = !isOpen;
        RpcUpdateDoorState(isOpen);
    }

    [ClientRpc]
    void RpcUpdateDoorState(bool state) {
        // 客户端更新门的状态(如播放动画)
    }
}

6、注意事项

唯一性要求

  1. 每个游戏对象只能有一个 Network Identity 组件。
  2. 若同一对象存在多个 Network Identity,Mirror 会报错并拒绝同步。

预制体注册

  1. 动态生成的网络对象必须将其预制体添加到 NetworkManager 的 Spawn Prefabs 列表。
  2. 场景中预先放置的静态网络对象需确保其 Asset Id 正确(通常自动生成)。

本地玩家权限

  1. 若启用 Local Player Authority,需谨慎处理客户端输入验证,防止作弊。

网络生命周期

  1. 使用 NetworkServer.Spawn() 和 NetworkServer.Destroy() 管理对象,避免直接调用 Destroy()。 

7、常见问题与解决

问题解决方法

对象未同步

检查是否添加 Network Identity,且预制体已注册到 Spawn Prefabs

客户端控制权异常

确认 Local Player Authority 配置正确,且仅对玩家角色启用。

动态生成的对象消失

确保生成代码在服务器执行(使用 [Command]),并调用 NetworkServer.Spawn()

isLocalPlayer 始终为 false

检查玩家生成逻辑,确保客户端正确关联本地玩家对象。

不支持嵌套

需注意,Mirror 不支持嵌套 GameObject 上的 Network Identity 组件,否则会报错。为避免此问题,请确保父级 GameObject 是层级中唯一带有 Network Identity 的对象。子 GameObject 可通过 Unity 内置的 GetComponentInParent 脚本函数访问父级的 Network Identity 组件。


http://www.kler.cn/a/573837.html

相关文章:

  • 企业防盗版新招:SPN 沙盒安全上网解决方案
  • 通过RK3588的cc-linaro-7.5.0交叉编译器搭建QT交叉编译环境QtCreator(无需编译QT源码)
  • 杰和科技工业整机AF208|防尘+静音+全天候运行
  • 10.RabbitMQ集群
  • 战略合作升级 | 大势智慧携手广西地测院,共绘智慧测绘新蓝图
  • http的post请求不走http的整个缓存策略吗?
  • C语言--预处理详解
  • 数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)
  • 服务器中常见的冗余技术有哪些?
  • Sentence BERT相似度计算有误,匹配有误差解决方法
  • 全国现代物流科技应用大会暨城郊大仓基地高质量建设运营服务高峰论坛
  • 数据安全的守护者:备份文件的重要性及自动化备份策略
  • 《2025软件测试工程师面试》功能测试篇
  • Java常用正则表达式(身份证号、邮箱、手机号)格式校验
  • golang反射
  • 【构建企业级Spring Boot应用:从基础到高级的全面指南】
  • 【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计
  • 第二十六天:Scrapy 框架-下载中间件Middleware
  • maven高级-03.继承与聚合-版本锁定
  • 什么是安全组及其作用?