目录
一、插件介绍
Unity插件-Mirror使用方法(一)Mirror介绍-优快云博客
二、主要组件
Unity插件-Mirror使用方法(二)组件介绍-优快云博客
Network Manager
Unity插件-Mirror使用方法(三)组件介绍(Network Manager)-优快云博客
Network Manager HUD
Unity插件-Mirror使用方法(四)组件介绍(Network Manager HUD)-优快云博客
Network Identity
Unity插件-Mirror使用方法(五)组件介绍(Network Identity)-优快云博客
Network Transform
Unity插件-Mirror使用方法(六)组件介绍(Network Transform)-优快云博客
Network Animator
Unity插件-Mirror使用方法(七)组件介绍(Network Animator)-优快云博客
Network Behaviour
Unity插件-Mirror使用方法(八)组件介绍(Network Behaviour)-优快云博客
三、Network Start Position
1、组件介绍
Network Start Position 是 Unity Mirror 中用于定义玩家生成位置的辅助组件,通常与 NetworkManager
配合使用,用于控制玩家角色在连接服务器时的初始出生点。它支持多出生点配置、随机位置生成、以及动态出生点切换,是多人游戏中管理玩家初始位置的核心工具。
要控制玩家生成的位置,您可以使用网络起始位置(Network Start Position)组件。
使用方法:将网络起始位置组件附加到场景中的游戏对象上,并将该游戏对象定位到您希望玩家开始的位置。您可以根据需要在场景中添加任意数量的起始位置。网络管理器(Network Manager)会自动检测场景中的所有起始位置,并在生成每个玩家实例时使用其中一个起始位置的位置和方向。
默认情况下,网络管理器会在坐标 (0, 0, 0) 生成玩家。将此组件添加到游戏对象后,其transform属性将自动注册/注销到网络管理器,作为可用的生成位置。
根据网络管理器中"Player Spawn Method"设置的生成方式:
- 随机(Random):可能多个玩家会使用相同的生成位置
- 循环(Round Robin):依次使用每个可用位置,当客户端数量超过生成点时将循环使用
2、核心功能
-
出生点标记
-
在场景中标记玩家生成的位置和朝向。
-
支持多个出生点,自动按顺序或随机选择。
-
-
生成策略配置
-
Round Robin 模式:按顺序循环使用出生点。
-
随机模式:从所有可用出生点中随机选择一个。
-
-
动态调整
-
运行时通过代码动态添加或移除出生点。
-
支持根据条件(如队伍、游戏阶段)切换出生区域。
-
3、基本使用方法
步骤1:配置出生点
-
在场景中创建空物体(如
SpawnPoint_TeamA
),设置其位置和旋转。 -
为该物体添加
Network Start Position
组件。 -
重复上述步骤,创建多个出生点(如
SpawnPoint_TeamB
)。
步骤2:关联 Network Manager
-
确保场景中存在
NetworkManager
组件。 -
在
NetworkManager
的 Player Spawn Method 属性中选择生成策略:-
Round Robin:按顺序循环出生点。
-
Random:随机选择出生点。
-
4、代码控制示例
1. 动态注册出生点
// 在游戏运行时添加新出生点
public class SpawnManager : MonoBehaviour {
public Transform dynamicSpawnPoint;
void Start() {
// 动态创建 Network Start Position 组件
NetworkStartPosition spawn = dynamicSpawnPoint.gameObject.AddComponent<NetworkStartPosition>();
NetworkManager.singleton.startPositions.Add(spawn.transform);
}
}
2. 自定义出生点选择逻辑
public class CustomSpawnSystem : NetworkBehaviour {
public override void OnServerAddPlayer(NetworkConnection conn) {
// 根据队伍选择出生点
Transform spawnPoint = GetTeamSpawnPoint(conn.authenticationData.ToString());
GameObject player = Instantiate(playerPrefab, spawnPoint.position, spawnPoint.rotation);
NetworkServer.AddPlayerForConnection(conn, player);
}
Transform GetTeamSpawnPoint(string team) {
if (team == "Red") return redSpawnPoints[Random.Range(0, redSpawnPoints.Count)];
else return blueSpawnPoints[Random.Range(0, blueSpawnPoints.Count)];
}
}
3. 随机旋转玩家
// 在 NetworkManager 中覆盖默认生成逻辑
public class MyNetworkManager : NetworkManager {
public override Transform GetStartPosition(NetworkConnection conn) {
Transform startPos = base.GetStartPosition(conn);
if (startPos != null && startPos.GetComponent<NetworkStartPosition>().allowRandomRotation) {
startPos.rotation *= Quaternion.Euler(0, Random.Range(0, 360), 0);
}
return startPos;
}
}
5、高级功能与场景
1. 分队伍出生
-
实现逻辑:
-
为不同队伍创建多个出生点组(如
RedTeamSpawns
和BlueTeamSpawns
)。 -
在玩家连接时,根据其队伍选择对应的出生点组。
-
通过
NetworkManager.startPositions
动态切换可用出生点列表。
-
2. 动态避让出生点
-
避免玩家重叠生成:
public class SafeSpawnSystem : NetworkBehaviour {
public float minSpawnDistance = 2f;
public override void OnServerAddPlayer(NetworkConnection conn) {
List<Transform> availableSpawns = new List<Transform>();
foreach (Transform spawn in NetworkManager.singleton.startPositions) {
if (IsSpawnSafe(spawn.position)) {
availableSpawns.Add(spawn);
}
}
Transform chosenSpawn = availableSpawns.Count > 0 ?
availableSpawns[Random.Range(0, availableSpawns.Count)] :
GetFallbackSpawn();
// 生成玩家...
}
bool IsSpawnSafe(Vector3 position) {
Collider[] colliders = Physics.OverlapSphere(position, minSpawnDistance);
return colliders.Length == 0;
}
}
3. 场景切换保留出生点
-
跨场景出生点管理:
// 在持久场景中保留全局出生点
[Scene] public string persistentScene = "PersistentScene";
public class GlobalSpawnManager : NetworkBehaviour {
void Awake() {
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode) {
if (scene.name != persistentScene) {
RegisterSceneSpawnPoints();
}
}
}
6、常见问题与解决
问题 | 解决方案 |
---|---|
出生点未被使用 | 检查 NetworkManager 的 startPositions 列表是否包含目标出生点。 |
玩家生成位置重叠 | 增大出生点间距,或添加动态避让逻辑(如检测周围玩家)。 |
动态出生点未同步 | 确保在服务器端修改 startPositions 列表,并使用 NetworkServer.Spawn() 。 |
随机旋转不生效 | 检查 Allow Random Rotation 是否启用,或自定义 GetStartPosition 逻辑。 |