博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Multiplayer Networking做一个简单的多人游戏例子-1/2
阅读量:5310 次
发布时间:2019-06-14

本文共 3240 字,大约阅读时间需要 10 分钟。

原文地址: 

本文主要讲述了如何使用Multiplayer Networking开发多人游戏,文中实例、代码来源于Unity官方教程。

 
 
 

 

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
().material.color = Color.blue; }}

 

转载于:https://www.cnblogs.com/ye-ming/p/7976317.html

你可能感兴趣的文章
00-自测1. 打印沙漏
查看>>
UNITY在VS中调试
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
Scala入门(1)Linux下Scala(2.12.1)安装
查看>>
如何改善下面的代码 领导说了很耗资源
查看>>
Quartus II 中常见Warning 原因及解决方法
查看>>
php中的isset和empty的用法区别
查看>>
Android ViewPager 动画效果
查看>>
pip和easy_install使用方式
查看>>
博弈论
查看>>
Redis sentinel & cluster 原理分析
查看>>
我的工作习惯小结
查看>>
把word文档中的所有图片导出
查看>>
浏览器的判断;
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
Leetcode 589. N-ary Tree Preorder Traversal
查看>>
机器学习/深度学习/其他开发环境搭建记录
查看>>
xml.exist() 实例演示
查看>>
判断是否为空然后赋值
查看>>
zabbix监控日志文件
查看>>