前言

首先我们来区分下新版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);
    }
}