使用Multiplayer Networking做一个简单的多人游戏例子-1/2
原文地址: http://blog.csdn.net/cocos2der/article/details/51006463
本文主要讲述了如何使用Multiplayer Networking开发多人游戏,文中实例、代码来源于Unity官方教程。
原文:INTRODUCTION TO A SIMPLE MULTIPLAYER EXAMPLE 
Networking Overview 
The High Level API 
Network System Concepts
OK,现在可以开始了!
1. 开始创建工程
- 创建一个空的3D工程
 - 保存当前场景为”Main”
 
2. 使用 Network Manager
主要使用NetworkManager和NetworkManagerHUD(一个简易的UI面板)
- 创建一个empty GameObject.
 - 修改名称为”Network Manager”
 - 选中Network Manager对象体
 - 添加组件:Network > NetworkManager
 - 添加组件:Network > NetworkManagerHUD
 
NetworkManager组件的属性: 
NetworkManagerHUD组件属性: 
运行后,此时运行后效果(该UI就是NetworkManagerHUD): 
3. 设置Player prefab
本实例中玩家GameObject效果(后面会加上武器): 
开始创建Player GameObject:
- 创建一个Capsule胶囊体
 - 修改名称为“Player”
 - 选中“Player”
 - 创建一个Cube作为Player的子物体
 - 修改Cube名称为“Visor”
 - 设置Visor Scale (0.95, 0.25, 0.5)
 - 设置Visor Position (0.0, 0.5, 0.24)
 - 创建一个新材质Material
 - 修改材质Material名称为“Black”
 - 选中Black Material
 - 修改其Albedo color 为黑色
 - 将Visor的Material修改为Black Material
 
为了给Player添加uniqueID作为网络中的唯一ID,我们需要给Player添加NetworkIdentity组件
- 选中Player GameObject
 - 添加组件:Network > NetworkIdentity
 - 设置NetworkIdentity组件属性Local Player Authority为True,勾选上 
将Local Player Authority勾选上,是为了后面Client能够控制Player 
最后创建Player的Prefab预制体:
- 将场景中的Player拖拽到Project面板中生成Prefab
 - 删除Scene中原来的Player
 - 保存场景
 
4. 注册Player prefab
- 选中Network Manager GameObject 在 Hierarchy 面板中
 - 保存Network Manager被选中状态
 - 展开Network Manager属性面板中Spawn Info
 - 将Player prefab拖拽到Player Prefab框中 
 
5. 创建Player 移动控制脚本
- 新建一个C#脚本为”PlayerController”, 并将其绑定到Player prefab上
 
PlayerController.cs:
using UnityEngine; public class PlayerController : MonoBehaviour { void Update() { var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f; var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f; transform.Rotate(0, x, 0); transform.Translate(0, 0, z); } }
- 保存脚本
 - 保存场景
6. 测试Player的在线移动
- 运行Unity进入Play模式
 - 
运行模式下,NetworkManagerHUD将会显示默认的UI
 - 
点击LAN Host(H),将本机作为主机Host开始游戏
 
此时NetworkManager将会创建一个Player在场景中,NetworkManagerHUD将会显示为游戏中UI
- 键盘WASD控制玩家Player移动方向
 - 点击UI中的Stop(X) 回到离线模式
 - 点击停止运行Unity,退出运行模式
 
开始测试在客户端中控制玩家Player
为了测试多玩家,所以我们需要两个客户端。在这里我们可以Build一个Mac版本(或者Windows版本)作为一个玩家,然后Unity自己运行作为一个玩家。OK,下面开始Build一个Mac版本.
- 打开Build Settings面板,并添加当前场景。
 - 保存工程
 - Build一个Mac standalone application
 - 完成之后,点击运行刚才Mac版本,并选择Windows窗口模式运行,不要全屏运行。
 - 点击LAN Host(H),作为主机玩家
 - 点击WASD按键,移动一下Mac版本中的Player(不然另一个玩家加入的时候,位置在同一个位置,你有可能认为只有一个玩家)
 
现在回到Unity,将Unity作为另一个玩家加入游戏。
- 运行Unity,进入Play模式
 - 点击LAN Client(C)加入游戏。
 
此时你应该看到了两个玩家在游戏中。
- 关闭Mac客户端
 - 停止运行Unity
 - 退出Play模式
 
7. 在网络中控制Player移动
上一篇中,玩家操作移动会同时控制同屏内的所有Player,且只有自己的屏幕生效。因为咱们还没有同步Transform信息。
下面我们通过UnityEngine.Networking组件来实现玩家控制各自Player- 打开PlayerController脚本
 - 添加命名空间UnityEngine.Networking
 
using UnityEngine.Networking; - 修改MonoBehaviour为NetworkBehaviour
public class PlayerController : NetworkBehaviour
在Update函数中添加如下方法
if (!isLocalPlayer) { return; }
 
最后你的PlayerController内容如下:
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class PlayerController : NetworkBehaviour { // Update is called once per frame void Update () { if (!isLocalPlayer) { return; } var x = Input.GetAxis("Horizontal") * Time.deltaTime * 10.0f; var z = Input.GetAxis("Vertical") * Time.deltaTime * 10.0f; transform.Translate(Vector3.right * x); //主角前后移动 transform.Translate(Vector3.forward * z); } public override void OnStartLocalPlayer() { GetComponent<MeshRenderer>().material.color = Color.blue; } }
                    
                
                
            
        
浙公网安备 33010602011771号