下载Mirror

Mirror | Network | Unity Asset Store

创建网络管理器

创建一个空对象,命名为NetworkManager

给它添加

两个组件 

unity 模拟经营 unity模拟经营游戏联机_Time

unity 模拟经营 unity模拟经营游戏联机_Time_02

下面这个也能用

unity 模拟经营 unity模拟经营游戏联机_Time_03

把场景拖拽进NetworkManager的Scene Management

unity 模拟经营 unity模拟经营游戏联机_游戏引擎_04

 创建一个空对象,命名为出生点

unity 模拟经营 unity模拟经营游戏联机_游戏引擎_05

给其挂载NetworkStartPosition组件

unity 模拟经营 unity模拟经营游戏联机_游戏引擎_06

 

将角色拖入Prefabs文件夹,然后删除场景中的角色

打开角色预制体,给它添加Network Transform组件,来同步角色的位置信息

unity 模拟经营 unity模拟经营游戏联机_Network_07

赋予其客户端的权限

unity 模拟经营 unity模拟经营游戏联机_游戏引擎_08

 

随后为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(轮询调度)

unity 模拟经营 unity模拟经营游戏联机_unity 模拟经营_09

然后我们进行发布测试

一个App作为Host

unity 模拟经营 unity模拟经营游戏联机_Network_10

另一个作为Client

unity 模拟经营 unity模拟经营游戏联机_Network_11

 

测试结果正常:

在各自的游戏界面中,均能正确显示各自的视角,可以正常移动,并且能够看到对方的移动。