Unity3D UNET 模仿局域网游戏(一)
2016-05-04 01:53
766 查看
这两天在学习的过程中,发现一个讲Unity的unet组件的好教程,在这里分享给大家。
新建一个 UnetProject。
新建一个GameObject重命名为Network Manager,给它添加Network Manager组件,这是Unet提供的一个核心管理组件,可以在脚本里访问Network Manager进行网络开发。
还需要添加一个 Network Manager HUD 组件,这个用来显示UI,UI上的按钮会跟Network Manager交互。这时候运行屏幕上会出现如下:
LAN Host(H):把本机作为Server + Client,即服务端加客户端
LAN Client(C):与服务器连接,后面填ip地址(localhost就是本机)
LAN Server Only(S):本机只作为服务端
一般在测试时才会用这个组件。
现在用unity自带的模型拼装一个Player出来(随便就行),给他添加Network Identity 组件,这是一个网络标识符,拥有标识符的物体可以在网络上生成,也就是同步到其他客户端。
标注的地方:Server Only:只会在服务器端时才有权限对他进行操作
Local Player Authority: 会在客户端时有权限,是一个局部角色
我们给Player选中Local Player Authority,表示运行时连接上服务端我们也可以对他进行操作。
为了让他能在局域网生成,
这表示我们要生成的角色是哪个,这样在每次联机时Network Manager会自动根据Player Prefab 创建一个角色。
Auto Create Player : 每次服务器,客户端连接都会创建一个Player
现在运行看见的效果不明显,我们先把控制角色做了,在运行,效果明显。
新建PlayerController脚本并编辑:
这里还需要给Player添加一个Network Transform组件才行,这是一个同步Transform的组件,包括:position、rotation、scale。它的同步是单向的,就是将你控制的物体同步到其他客户端,当你在服务端改变该物体时,客户端不会跟着改变。
按Ctrl+B打包工程,选好路径后,以后按Ctrl+B会自动打包,现在把打包后的程序和unity都运行起来,毕竟是联机,肯定要有两个才能看出效果,我默认是unity作为服务端+客户端,打包后的程序作为单纯的客户端。下面是效果图:
这里运行是没有问题的。但是两个角色看起来一样,无法区分,现在来区分一下。编辑脚本:
添加以上代码,然后运行,
这是我们发现只有自己控制的那个才是蓝色,另外一个还是默认的白色,这样我们就可以区分角色了。
现在我们给角色添加上枪和子弹,让他可以射击。还要给子弹添加上Rigidbody组件,取消重力。把枪的碰撞器去掉,它不需要做检测。
如图,这只是效果图。。我给角色添加了一个Gun作为枪,在枪前面添加一个空物体作为生成子弹的地方。。编辑脚本:
现在子弹也能射击了,只不过不同步,现在我们让他同步。联机游戏会把所有的功能处理都放到Server上处理,例如敌人的生成,游戏逻辑的判断,所以这里的子弹我们也让他在Server上生成,然后同步到客户端。给子弹添加Network Identity组件,然后修改Network Manager
修改 PlayerController脚本:
注意:调用的哪里也改成CmdFire。。在给子弹添加Network Transform组件,Transform Sync Mod对应Sync Rigidbody 3D,这是同步刚体组件,Network Send Rate 改为0,表示只同步一次,就是添加速度就行了。
好了现在已经可以连上局域网,单独控制并且发射子弹了,还有的内容我将会在接下来的博客中进行讲解。
本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。
新建一个 UnetProject。
新建一个GameObject重命名为Network Manager,给它添加Network Manager组件,这是Unet提供的一个核心管理组件,可以在脚本里访问Network Manager进行网络开发。
还需要添加一个 Network Manager HUD 组件,这个用来显示UI,UI上的按钮会跟Network Manager交互。这时候运行屏幕上会出现如下:
LAN Host(H):把本机作为Server + Client,即服务端加客户端
LAN Client(C):与服务器连接,后面填ip地址(localhost就是本机)
LAN Server Only(S):本机只作为服务端
一般在测试时才会用这个组件。
现在用unity自带的模型拼装一个Player出来(随便就行),给他添加Network Identity 组件,这是一个网络标识符,拥有标识符的物体可以在网络上生成,也就是同步到其他客户端。
标注的地方:Server Only:只会在服务器端时才有权限对他进行操作
Local Player Authority: 会在客户端时有权限,是一个局部角色
我们给Player选中Local Player Authority,表示运行时连接上服务端我们也可以对他进行操作。
为了让他能在局域网生成,
这表示我们要生成的角色是哪个,这样在每次联机时Network Manager会自动根据Player Prefab 创建一个角色。
Auto Create Player : 每次服务器,客户端连接都会创建一个Player
现在运行看见的效果不明显,我们先把控制角色做了,在运行,效果明显。
新建PlayerController脚本并编辑:
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); //围绕某轴旋转 } }
这里还需要给Player添加一个Network Transform组件才行,这是一个同步Transform的组件,包括:position、rotation、scale。它的同步是单向的,就是将你控制的物体同步到其他客户端,当你在服务端改变该物体时,客户端不会跟着改变。
按Ctrl+B打包工程,选好路径后,以后按Ctrl+B会自动打包,现在把打包后的程序和unity都运行起来,毕竟是联机,肯定要有两个才能看出效果,我默认是unity作为服务端+客户端,打包后的程序作为单纯的客户端。下面是效果图:
这里运行是没有问题的。但是两个角色看起来一样,无法区分,现在来区分一下。编辑脚本:
//这是重写 NetworkBehaviour 内的方法 //这个方法只会在创建本地角色时调用 public override void OnStartLocalPlayer() { GetComponent<MeshRenderer>().material.color = Color.blue; }
添加以上代码,然后运行,
这是我们发现只有自己控制的那个才是蓝色,另外一个还是默认的白色,这样我们就可以区分角色了。
现在我们给角色添加上枪和子弹,让他可以射击。还要给子弹添加上Rigidbody组件,取消重力。把枪的碰撞器去掉,它不需要做检测。
如图,这只是效果图。。我给角色添加了一个Gun作为枪,在枪前面添加一个空物体作为生成子弹的地方。。编辑脚本:
//类下添加 public GameObject bulletPre; //子弹的prefab public Transform bulletTrans; //生成子弹的位置 //update方法中添加 if (Input.GetKeyDown(KeyCode.Space)) { Fire(); } //添加一个方法 void Fire () { GameObject bullet = Instantiate(bulletPre, bulletTrans.position, Quaternion.identity) as GameObject; bullet.GetComponent<Rigidbody>().velocity = transform.forward * 10; Destroy(bullet, 2); //2秒后销毁子弹 }
现在子弹也能射击了,只不过不同步,现在我们让他同步。联机游戏会把所有的功能处理都放到Server上处理,例如敌人的生成,游戏逻辑的判断,所以这里的子弹我们也让他在Server上生成,然后同步到客户端。给子弹添加Network Identity组件,然后修改Network Manager
修改 PlayerController脚本:
[Command] //在客户端调用,但是在服务端运行,这是方法必须以 Cmd 开头 void CmdFire() { GameObject bullet = Instantiate(bulletPre, bulletTrans.position, Quaternion.identity) as GameObject; bullet.GetComponent<Rigidbody>().velocity = transform.forward * 10; Destroy(bullet, 2); //2秒后销毁子弹 NetworkServer.Spawn(bullet); //在所有客户端都生成一个物体 }
注意:调用的哪里也改成CmdFire。。在给子弹添加Network Transform组件,Transform Sync Mod对应Sync Rigidbody 3D,这是同步刚体组件,Network Send Rate 改为0,表示只同步一次,就是添加速度就行了。
好了现在已经可以连上局域网,单独控制并且发射子弹了,还有的内容我将会在接下来的博客中进行讲解。
本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。
相关文章推荐
- Kinect结合Unity3D引擎开发体感游戏(一)
- 我是运营,我没有假期
- [原创]java局域网聊天系统
- 每个 Linux 游戏玩家都绝不想要的恼人体验
- 在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
- Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
- 如何使用 Steam Play 在 Linux 上玩仅限 Windows 的游戏
- 新一代iPad适配应用之游戏篇
- 一个注册表搞定“打开局域网机器文件提示”
- VB实现的《QQ美女找茬游戏》作弊器实例
- 通过批处理bat解决局域网打印机共享问题
- 局域网遭遇“ARP”病毒的新变种附临时解决方法
- 远程连接局域网内的SQL Server 的方法
- C#实现洗牌游戏实例
- C#实现的算24点游戏算法实例分析
- 如何解决局域网内mysql数据库连接慢
- C#实现简单的井字游戏实例
- C++编写简单的打靶游戏
- C++实现基于控制台界面的吃豆子游戏