前言
首先我们来区分下新版unet和老版unet。
1.老版unet,是指unity5.0以前就有的,一个unity用于构建多人游戏的网络架构,主要以NetworkView类展开,RPC的方式调用远程函数。
2.新版unet,是指unity5.0之后的一套Mutiplayer的网络架构,主要以NetworkManager为主,NetworkIdentity,NetworkTransform,NetworkAnimator等组件辅助的一套网络架构部。比老版本更方便,封装更全面。
当然官方把网络又分为HLAPI和LLAPI,甚至还有高级用法NetworkTransport API。我们不做讨论,大家自行研究,
今天主要讲一下新版unet(NetworkManager的用法)
将单人游戏转换为Unity多人游戏
本文档介绍了将单个玩家游戏转换为多人游戏的步骤,使用新的Unity多人游戏网络系统。这里描述的过程是真实游戏的实际过程的简化的更高级版本; 它并不总是像这样工作,但它提供了该过程的基本配方。
1.NetworkManager设置
- 添加新的GameObject的场景并将其重命名为“NetworkManager”。
- 将NetworkManager组件添加到“NetworkManager”GameObject。
- 添加NetworkManagerHUD游戏对象的组件。这提供了默认UI管理网络游戏状态的。
请参阅使用NetworkManager。
2.Player Prefab设置
- 在游戏中找到玩家GameObject的预制件,或者从玩家GameObject创建预制件
- 添加NetworkIdentity组件中的播放器Prefab
- 检查NetworkIdentity上的LocalPlayerAuthority框
- 将playerPrefabNetworkManager的“ Spawn Info”部分设置为播放器Prefab
- 如果场景中存在Player Player实例,则从场景中移除它
请参阅Player对象。
3.Player控制
- 将NetworkTransform组件添加到播放器Prefab
- 更新输入和控制脚本中的isLocalPlayer
- 根据生成的player和isLocalPlayer更新Camera的位置
例如,此脚本仅处理本地播放器的输入:
using UnityEngine;
using UnityEngine.Networking;
public class Controls : NetworkBehaviour
{
void Update()
{
if (!isLocalPlayer)
{
// exit from update if this is not the local player
return;
}
// handle player input for movement
}
}
4.基本的玩家游戏状态
- 将包含重要数据的脚本放入NetworkBehaviours而不是MonoBehaviours
- 将重要的成员变量放入SyncVars
请参见状态同步。
5.网络行为
- 将含有网络更新的脚本继承NetworkBehaviours而不是MonoBehaviours
- 将玩家的网络行为更新为[Command]
请参见联网操作。
6.非玩家游戏对象
修复非玩家预制件,如敌人:
- 添加NetworkIdentify组件
- 添加NetworkTransform组件
- 使用NetworkManager注册spawnable Prefabs
- 使用游戏状态和操作更新脚本
7.生成器
- 可能会将spawner脚本更改为NetworkBehaviours
- 修改生成器仅在服务器上运行(使用isServer属性或OnStartServer()函数)
- 调用NetworkServer.Spawn()创建的GameObjects
8.Player的创建位置
- 添加一个新的GameObject并将其放置在玩家的起始位置
- 将NetworkStartPosition组件添加到新的GameObject
9.Lobby大厅
- 创建大厅场景
- 将新GameObject添加到场景并将其重命名为“NetworkLobbyManager”。
- 将NetworkLobbyManager组件添加到新的GameObject。
- 配置管理器:1.场景,2.预制体,3.生成
示例:
using UnityEngine;
using UnityEngine.Networking;
public class BallPlayer : NetworkBehaviour {
const int nudgeAmount = 33;
Vector3 movement;
[ClientCallback]
void Update ()
{
if (!isLocalPlayer)
return;
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
float j = Input.GetAxis("Jump");
movement.x = h;
movement.z = v;
movement.y = j;
CmdNudge(movement);
}
[Command]
public void CmdNudge(Vector3 direction)
{
GetComponent<Rigidbody>().AddForce(direction* nudgeAmount);
}
}