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、核心功能
网络唯一标识
- 每个对象的
netId
由服务器分配,确保全局唯一性。 - 客户端通过
netId
精确匹配服务器上的对应对象。
同步生命周期
- 控制对象的生成(Spawn)与销毁(Destroy)的同步。
- 服务器销毁对象时,所有客户端自动同步移除。
权限管理
isServer
:标记对象是否由服务器控制。isClient
:标记对象是否存在于客户端。isLocalPlayer
:标识当前对象是否为本地玩家角色(用于区分本地/远程玩家输入)。
组件依赖
- 所有
NetworkBehaviour
脚本(如自定义同步逻辑)必须挂载在拥有Network Identity
的对象上。
3、关键属性与配置
在 Unity Inspector 面板中,Network Identity 的配置项如下:
属性 | 说明 |
---|---|
Client Started | 客户端启动时自动激活 |
Server Only | 仅服务器生成(勾选后对象不会复制到客户端) |
Visible | 默认可见性设置(控制对象在网络中的可见范围) |
4、基础使用方法
1. 添加与配置
- 为需要网络同步的预制体(如玩家角色)添加
Network Identity
组件。 - 确保该预制体已注册到
NetworkManager
的Spawn Prefabs
列表(动态生成的对象必须满足此条件)。
2. 脚本中的访问
- 在继承自
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、注意事项
唯一性要求
- 每个游戏对象只能有一个
Network Identity
组件。 - 若同一对象存在多个
Network Identity
,Mirror 会报错并拒绝同步。
预制体注册
- 动态生成的网络对象必须将其预制体添加到
NetworkManager
的Spawn Prefabs
列表。 - 场景中预先放置的静态网络对象需确保其
Asset Id
正确(通常自动生成)。
本地玩家权限
- 若启用
Local Player Authority
,需谨慎处理客户端输入验证,防止作弊。
网络生命周期
- 使用
NetworkServer.Spawn()
和NetworkServer.Destroy()
管理对象,避免直接调用Destroy()
。
7、常见问题与解决
问题 | 解决方法 |
---|---|
对象未同步 | 检查是否添加 |
客户端控制权异常 | 确认 |
动态生成的对象消失 | 确保生成代码在服务器执行(使用 |
| 检查玩家生成逻辑,确保客户端正确关联本地玩家对象。 |
不支持嵌套 | 需注意,Mirror 不支持嵌套 GameObject 上的 Network Identity 组件,否则会报错。为避免此问题,请确保父级 GameObject 是层级中唯一带有 Network Identity 的对象。子 GameObject 可通过 Unity 内置的 GetComponentInParent 脚本函数访问父级的 Network Identity 组件。 |