2017-05-30:Unity5.6.1实现联网模式下控制多玩家在场景中的移动

来源:互联网 发布:菜鸟网络能上市吗? 编辑:程序博客网 时间:2024/05/16 00:33

工具:Unity3D 5.6.1版本

使用NetworkManager,NetworkIdentity,NetworkTransfrom等组件在网络上实例化玩家,并实现控制玩家移动。NetworkView在Unity3D新版本中已经被废弃,只能学点新的东西了,我是新手,本篇文章也是参考大神们一点一点做出来的,切勿吐槽。

准备工作:Hierarchy中创建一个plane,为其赋予贴图,随意即可,调整Plane合适大小,在Project视图下创建三个文件夹:scenes,prefab,scripts

步骤:

1.Hierarchy视图下创建一个空的GameObjec对象,并命名为NetworkManager

2.为该空物体添加组件NetworkManager组件(用来管理游戏的网络工作状态)

3.同步骤2,为空物体添加NetworkManagerHUD组件(简单的用户交互,控制网络的连接)

以上三步做出来的结果如下图:



4.Hierarchy视图下创建Cube物体,并将其命名为PlayerCube

5.PlayerCube添加组件NetworkIdentity(该组件控制物体在网络上工作的身份标识),并在该组件下点选三角符号,勾选Local Player Authority选项(表示只有本地客户端才有权限对该物体进行操作)

6.拖拽PlayerCub到文件夹为名为prefab的文件夹里(即,此时的PlayerCube变成了一个预置对象)

以上三步做出来的结果如下图




7.然后就可以删除掉Hierarchy视图下的PlayerCub物体了


以上步骤完成后,也就完成了一个基于网络上玩家预置物体的制作,下边就是把该预置物体注册到网络环境中。


8.Hierachy视图下,选中名字为NetworkManager的物体,(该物体上有NetworkManager组件),在NetworkManager组件下找到spawn info,点击三角符号将其展开,会发现有一个Player Prefab槽,将刚刚我们创建好的PlayerCube拖拽到此槽上(注意,PlayerCube应在Project视图下的prefab为件夹里)

9,现在我们就可以保存场景了,并将保存的场景命名为Scene001(此处作者将其保存到了Project视图中的文件夹名为scenes的文件夹中了)




10.Project目录下的scripts文件夹里,我们创建一个C#脚本,命名为playerControl用于控制玩家的移动,代码如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class playerControl :MonoBehaviour

{

    public float _speed = 0.1f;//速度控制变量

    void Update()

    {

        //控制玩家X轴方向移动(对应键盘A,D)

        float x = Input.GetAxis("Horizontal") * _speed;

        //控制玩家Z轴方向移动(对应键盘W,S)

        float z = Input.GetAxis("Vertical") * _speed;

        //玩家移动

        this.gameObject.transform.Translate(x, 0, z);

    }

}

11.选中预置的PlayerCube,PlayerCube添加我们刚刚创建的playerControl脚本(可能不方便直接将脚本拖至PlayerCube,你可在右侧用增加组件的方式,即点击Add Component搜索playerControl,就能找到了),如下图所示




完成以上步骤,现在仅仅是个单机的游戏,来运行测试一下:




这个时候,点本机运行,你会发现物体生成成功,可能位置不是你想要的,或者离相机太远了,如下截图,怎么调整呢???




我们来修改一下playerControl脚本代码(请原谅作者也是Copy的代码,在测试时遇到了问题),解决的方式是初始化一下PlayerCube的位置即可,即在playerControl脚本增加如下代码:

 void Awake(){

        transform.position = new Vector3(transform.position.x,1,transform.position.z);

    }

 

如果是视野的问题,请调整好合适的视野,然后先选中Main Camera(一定要选中额),再在菜单工具点选GameObject→Align With View即可。


发布一个客户端游戏,同时运行两个,一个以LAN  Host方式运行,一个以LAN Client方式运行,成功控制物体移动,但是会发现两个问题:

 

a:客户端与服务端生成的物体都能同时被控制。

b:客户端与服务端不同步。

下面我们来解决这两个个问题:

 

12.打开之前的playerControl脚本,更新如下(请看代码注释):

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.Networking; //引用UnityEngine.Networking

 

public class playerControl :NetworkBehaviour  //记得此处将MonoBehaviout修改

{

    public float _speed = 0.1f;//速度控制变量

void Awake(){

//初始化位置

        transform.position = new Vector3(transform.position.x,1,transform.position.z);

    }

    void Update()

{

/判断是否是本地玩家在控制物体

        if (!isLocalPlayer) {

            return;

        }

        //控制玩家X轴方向移动

        float x = Input.GetAxis("Horizontal") * _speed;

        //控制玩家Z轴方向移动

        float z = Input.GetAxis("Vertical") * _speed;

        //执行玩家移动

        transform.Translate(x, 0, z);

    }

}

13.选中PlayerCube预制物体,为其添加NetworkTransform组件(即网络上位置变换控制,可以同步到服务器端,及所有与服务器连接的客户端)

后边就可以发布测试了,这样就完成了一个服务端,多个客户端控制玩家移动,你可以运行多个游戏(记得LAN Host只有一个,其他全部是LAN Client),结果如下: