介绍
用来构建多人游戏的网络架构,以NetWorkManager为主。主要用于局域网游戏,客户端可以时刻转为服务器。该方法已弃用,使用Unity MLAPI
使用
1.添加Network Manager
Network Manager 是多人游戏的核心控制组件。
新建一个场景,创建一个空的GameObject,在上面添加NetworkManager组件
2.添加Network Manager HUD
在Network Manager组件所在的GameObject上添加NetworkManagerHUD,用来显示UI,设置哪个客户端作为服务器端使用
3.添加Network Identity
在Player(也就是要同时显示在双方的)上添加组件Network Identity,这是一个网络标识符,拥有标识符的物体可以在网络上生成,也就是同步到其他客户端,并勾选上Local Player Authority,否则不会同步
4.设置需要双端生成
需要同步的时候主动生成的GameObject的,添加到Network Manager,会自动生成。注意:添加的时候必须有Network Identity组件
5.添加移动功能
为Player添加移动脚本,并添加Network Transform,用于同步移动和旋转
**UNET使用的是继承于NetworkBehaviour不是MonoBehaviour **
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
//为了能让脚本在连上局域网的同时还能分别控制物体,所以要继承 NetworkBehaviour
public class PlayerController : NetworkBehaviour
{
public float traSpeed = 3; //移动的速度
public float rotSpeed = 120; //一秒旋转的角度
// Update is called once per frame
void Update()
{
// isLocalPlayer 是 NetworkBehaviour 的内置属性
if (!isLocalPlayer) //如果不是本地客户端,就返回,不执行下面的操作
{
return;
}
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
transform.Translate(Vector3.forward * v * traSpeed * Time.deltaTime); //朝某个方向移动
transform.Rotate(Vector3.up * h * rotSpeed * Time.deltaTime); //围绕某轴旋转
}
//这是重写 NetworkBehaviour 内的方法
//这个方法只会在创建本地角色时调用
public override void OnStartLocalPlayer()
{
GetComponent<MeshRenderer>().material.color = Color.blue;
}
}
效果如下
蓝色部分是Player,移动时双方都可看到
添加子弹
创建子弹预制体,添加Network Identity组件,并将其添加到Network Manager的Spawn Info
//发射子弹
[Command] //在客户端调用,但是在服务端运行,这是方法必须以 Cmd 开头
void CmdShoot()
{
GameObject bullet = Instantiate(bulletPre, bulletTrans.position, Quaternion.identity) as GameObject;
//子弹的前进方向
bullet.GetComponent<Rigidbody>().velocity = -transform.forward * 10;
Destroy(bullet, 2);
NetworkServer.Spawn(bullet); //在所有客户端都生成一个物体
}
即可看到双方发射子弹了
部分功能解释
Network Manager
Network Manager 是多人游戏的核心控制组件。
仅介绍常用
- Dont Destroy On Load:在加载新的场景时是否销毁目标物体。
- Run in Background:控制程序是否可以在后台运行。
- Log Level:用于用户网络日志信息的日志级别。
- Offline Scene:脱机时切换到的场景。
- Online Scene:联机时切换到的场景。
- Use WebSockets:作为主机运行
- Network Address:目前正在使用的网络地址。
- Network Port:当前使用的网络接口。
- Match Host:连接服务的主机名称。
- Player Prefab:用于Player对象的实例化工作,当拖动Player的预制体为其赋值,游戏时Player对象会从该Prefab自动为每个用户创建,这种模式适用于LocalPlay托管的Host服务器和远程客户端上的Player参与者,需要注意的是拖入的Player Prefab必须有Networkidentity组件。
- Auto Create Player:在连接时Unity自动创建预制体
- Player Spawn Method:新玩家游戏对象的位置
- Registered Spawnable Prefabs:Network Manager可以生成的预制体,用于两端生成
Network Manager HUD
游戏UI,玩家可以通过其查找和加入联网游戏
Network Identity
可控制游戏对象在网络上的唯一身份,并使用该身份使网络系统识别游戏对象。只要是想要在两端同时显示,就需要加上该组件,也是用于Network Manager组件中Registered Spawnable Prefabs识别
- Server Only:勾选此复选框可确保 Unity 仅在服务器上生成游戏对象,而不在客户端上生成游戏对象。
- Local Player Authority:勾选此复选框可将此游戏对象的授权网络控制权提供给拥有此游戏对象的客户端。就像上面的Player就需要勾选,用于该客户端控制
NetworkTransform
在网络中同步游戏对象的移动和旋转
- Network Send Rate (seconds):网络信息发送速率(以秒为单位)
- Transform Sync Mode:使用什么方法来更新对象位置。
- Movement Threshold :一个对象在不同步网络位置可以走多远。
- Snap Threshold:不采用差值而是阈值。
- Rotation Axis :允许旋转的坐标轴。
- lnterPolate Rotation Factor:控制旋转插值的因子。
- Sync Angular Velocity:是否同步角速度。
SyncVar
用来标记同步成员变量,其可以是任何基本数据类型,但不能是类、列表或其他集合。
[SyncVar]
public float traSpeed = 3; //移动的速度
或
[SyncVar] public float traSpeed = 3; //移动的速度
Command
在客户端调用然后服务器端执行,名称以Cmd前缀
而ClientCallback相反,在服务端调用,客户端执行
[Command] //在客户端调用,但是在服务端运行,这是方法必须以 Cmd 开头
void CmdShoot()
{
....
}
ClientRPC
是服务器游戏对象在客户端游戏对象上触发事件的一种方式。函数在服务器端被调用时,将在客户端执行其功能。名称以 Rpc 开头
[ClientRpc]
public void RpcDoOnClient(int foo)
{
...
}
Server
只作用在服务器端
[Server]
void EventTakeDamage(int amount)
{
...
}
Client
只作用在服务客户端
[Client]
void ShowExplosion ()
{
...
}
ClientCallback
engine调用回调,只在客户端执行。
[ClientCallback]
void Update()
{
...
}
案例
百度网盘链接
提取码:l5gf