下载Mirror
Mirror | Network | Unity Asset Store
创建网络管理器
创建一个空对象,命名为NetworkManager
给它添加
两个组件
下面这个也能用
把场景拖拽进NetworkManager的Scene Management
创建一个空对象,命名为出生点
给其挂载NetworkStartPosition组件
将角色拖入Prefabs文件夹,然后删除场景中的角色
打开角色预制体,给它添加Network Transform组件,来同步角色的位置信息
赋予其客户端的权限
随后为Player添加控制脚本
注意,这里脚本不继承MonoBehaviour,而是NetworkBehaviour
需要为脚本指定角色的第一人称视角摄像机
默认隐藏,然后在角色生成时启用
如果不隐藏,每加入一个玩家,每个人各自的场景中就会多一个摄像机,那么在该服务器上运行的所有客户端,其视角均会变成最新加入玩家的视角。
如果隐藏了,那么该摄像机只在每个玩家资金的场景中是启用的。
因为我们启用该摄像机,使用的是角色独立的网络版本的Start函数,也就是OnStartLocalPlayer
这样就保证了每一个玩家的视角都是他自己的视角,而不是别人的
在Update函数中,我们加入一条判断本地玩家的语句
如果isLocalPlayer为假,则不移动
这样就保证了玩家的操作,只会对自己,也就是本地的角色产生作用
而不会同时对其他玩家产生影响
using UnityEngine;
using Mirror;
public class PlayerControl : NetworkBehaviour //MonoBehaviour --> NetworkBehaviour
{
//摄像机
public GameObject playerCamera;
//速度:每秒移动5个单位长度
public float moveSpeed = 6;
//角速度:每秒旋转135度
public float angularSpeed = 135;
void FixedUpdate()
{
if (!isLocalPlayer) return;
Move();
}
void Move()
{
//通过键盘获取竖直、水平轴的值,范围在-1到1
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
//按照矢量移动一段距离
transform.Translate(Vector3.forward * v * Time.deltaTime * moveSpeed);
transform.Translate(Vector3.right * h * Time.deltaTime * moveSpeed);
}
public override void OnStartLocalPlayer()
{
playerCamera.SetActive(true);
}
}
随后,把Player预制体拖入NetworkManager中
并设置生成方式为 Round Robin(轮询调度)
然后我们进行发布测试
一个App作为Host
另一个作为Client
测试结果正常:
在各自的游戏界面中,均能正确显示各自的视角,可以正常移动,并且能够看到对方的移动。