工具: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),结果如下: