Unity-Mirror学习笔记-Tank_unity mirror 显示本机ip-程序员宅基地

技术标签: unity  游戏  

Unity-Mirror-学习笔记(Tank)

通过Mirror内置的例子来学习其用法,此为笔记。

游戏对象以及其使用到的Network组件


NetworkManagerHUD2

Telepathy Transport

NetworkManager

  • Spawn(GameObject)3

NetworkStartPosition

  • UI-Canvas(GameObject)4

TankGameManager(Script)

  • Tank(Perfab-GameObject)5

NetWorkIdentity

NetworkTransform

Tank(Script)

各组件以及脚本的用处


  • NetworkManager

    NetWorkManager是联机的核心组件,可以通过Inspector界面调整具体参数。

    每个Scene只能有一个NetworkManager,多余的会自动删除。由于具有NetworkIdentity组件的对象在加载场景的时候会自动禁用,所以NetworkManager不能放在游戏对象(会有操作)上。

    NetworkManager可以通过派生来根据项目实际需求来修改,自定义化,但如果项目不大,还是保持原样效率会更高。

    Telepathy Transport

    在给游戏对象添加NetworkManager的时候会自动加上Telepathy Transport组件。这是一个管理数据传输的组件,如果有需要可以使用自己已有的,Inspector上的NetworkManager-NetworkInfo-Transport上切换即可。

    游戏状态管理

    NetworkManager有三种运行模式-分别是:Server(仅服务器),Host(同时作为服务器和客户端),Client(仅客户端)。

    如果使用NetworkManagerHUD2则可直接在游戏运行时选择运行模式,自己调用为最优(一般来说)。

    调用的方法:

    • NetworkManager.StartClient();

    • NetworkManager.StartServer();

    • NetworkManager.StartHost();

    如果脚本没有提前建立存放NetworkManager引用位6的话,只需要直接调用单例7就好。

    以Client模式开启前最好改变一下这个属性:NetworkManager.networkAddress

    也就是IP地址,同一台电脑上测试只需要填写localhost即可,但基本上用的时候肯定不是同一设备,所以可以增加一项功能:开启主机端,会在游戏内展示本机IP。

    C#获取自机IP的语句:

    public string GetLocalIp()
    {
        ///获取本地的IP地址
        string IP = string.Empty;
        foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
        {
            if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
            {
                AddressIP = _IPAddress.ToString();
            }
        }
        return AddressIP;
    }
    

    我的做法是弹出输入框让玩家输入主机端玩家提供的IP,玩家多一步操作。

    流程基本就是:服务端/主机端开启,客户端同一网络下输入IP进入(非局域网联机尚未尝试)

    生成管理

    NetworkManager具有管理对象生成的功能(动态生成)。

    如果要自主操作全局玩家的生成,则需要了解NetworkConnection相关知识(当前尚不讨论这一点)

    Spawn Info窗口管理着相关信息:

    PlayerPrefab:玩家的预制体(需要有NetworkIdentity)

    AutoCreatePlayer:bool(一般为开启,除非需要自主生成)

    PlayerSpawnMethod:两个属性:

    • A:Random:场景上每一个具有NetworkStartPosition的对象随机成为生成点
    • B:RoundRobin:从Hierarchy从上往下每一个具有NetworkStartPosition组件的对象轮流作为生成点

    Rigistered Spawnable Perfabs:

    这是一个列表,存放一些非玩家的需要动态生成的物体,比如子弹,金币奖励等。注意:这些物体同样需要NetworkIdentity组件

    NetworkStartPostition

    在这里就要提到NetworkStartPosition,加入这个组件的物体将成为生成点。

    NetworkManager会调用GetStartPostiton()来获取Transform组件。

    场景管理

    NetworkManager内置联机场景管理功能,一般而言只有两个槽位

    Offline Scene

    Online Scene

    也就是一个离线场景和一个线上场景。

    启动服务器(Server)或者主机端(Host)的时候会直接加载Online Scene,同时客户端连接后也会加载至Online Scene。

    Offline Scene也直白:客户端和服务端断开连接的时候加载的场景。

    如需要在游戏中切换场景的话,则需要调用ServerChangeScene函数,让当前所有连接的客户端切换至新的Scene。需要切换的场景需要把名字加载进networkSceneName。

    但需要注意:以及开始运行的NetworkManager就别再调用StartHost或者StartClient等的操作了,不然可能会引起奇怪的事情。

    特别是NetworkManager会自动切换线上线下场景,所以NetworkManager在场景之间也要保持不变,不然会掉线。尽可能改设置而不是直接整个NetworkManager改变。

  • TankGameManager(Script)

    这个组件(脚本)是起到类似GM的作用,也就是游戏的管理。

    在这个例子里,玩家的数据是直接由玩家本体存储,也就是Tank脚本内存储以及同步。

    这个GM主要的作用是:更新UI,判定游戏输赢(以UI展示,没有实际用于服务器的判定GM)。

    在这里简单讲一下Mirror实际的效果:

    A,B两个玩家,我们设A为Host,也就是主机端,实际A操作的依然是客户端,只是网络上它也在做服务器做的事而已,B作为客户端加入同一个场景。

    就好像玩遥控车一样,遥控车是玩家预制体,遥控是UI。但是我们彼此在各自的视野里只看得见对手的车,其他都看不见。

    换个角度,我在一个赛道(Scene)里玩遥控车(有UI),还有其他自己会走动的遥控车(无UI),他们在我的Scene只有预制体,只不过他们受“遥控”而已。

    实测之后这个GM有漏洞,漏洞在于假设出现这种在玩家预制体内的__同步数据__:

    [SyncVar]
    public int PlayerHP;
    

    这些数据都需要由Server端改变,也就是发送指令,由服务端接受指令并执行,客户端是无权修改的。

    如果是Unity内运行,主机端也只能修改自己的数据,对其他加入的玩家的数据的修改是无效的。

  • NetworkIdentity

    一个网络认证组件,相当于进入游戏的通行证,有了它,Mirror管理的时候才可以把各个物体区分开来。

    只有一个选项可以勾选,

    ServerOnly

    如果勾选了的话这个物体只能在服务端生成,客户端是不会生成的,例如局域网游戏的裁判等,这种游戏对象一般来讲客户端只负责接受数据和处理前端,判断输赢则仅从服务端即可,就好像一个隐形的旁观者。(具体没操作过这个Serveronly,可以尝试一下)

  • NetworkTransform

    这是一个用于同步位置的组件,可以同步对象的位置移动缩放。

    直白点就是同步Transform的数据

    这里有一个很坑的地方:如果你没有勾选Client Authority这个选项,客户端的位置是不会同步到服务端的,也就是客户端做任何事实际上都是没有效果的。

    Client Authority客户端移动权限。

    NetworkTransform组件还可以修改灵敏度Sensitivity,只有一帧内变化超过阈值才会同步。

    SyncMode则可以修改同步的对象,是告诉所有人(Observers观察者),还是只是服务器(Owner私有)

    SyncInterval则是同步频率,以秒为单位,0-2取值。

    如果有子对象需要跟着移动,则需要在父对象上添加Network Transform Child,并将Target设置为子物体。

  • Tank(Script)

    这是例子中的玩家脚本。在需要网络上使用的对象,其脚本应该继承NetworkBehaviour,使用起来跟MonoBehaviour相差无几。

    这里就存在三种特性:[SyncVar] , [Command] , [ClientRpc]

    [SyncVar]:同步数据。

    刚刚提到过,有这种特性的数据的修改只能从服务端修改,客户端是没有权限修改的,只能读取。

    而怎么修改呢?则要通过有[ServerCallBack],[Server]的方法。

    有这些特性的方法都只会在服务器端执行。

    比如子弹中的碰撞,OnTriggerEnter(),在前面加一个[ServerCallBack]的特性,这个判定则在服务端判定,相当于告诉服务器,要是撞到了就调用这个方法。

    [Server]的方法则直接在服务器执行。

    这些是禁止客户端调用的,那如果客户端发射子弹呢?则需要用到[Command]的特性,有这个特性的方法会告诉服务器我要做这个方法,然后服务器就会帮你做。举个例子:

    我要杀A,我告诉B(服务端)我要用手枪杀A,B就接受我的手枪把A干掉,如果我还要B把手枪还我,则还我的这个方法需要有[ClientRpc]的特性,相当于这是客户端接受服务端的反馈并且执行。

    所以杀人要用[Command],杀完人手枪还我要加[ClientRpc]。


  1. 联机状态管理组件

  2. NetworkManager的GUI版,在场景运行时实时展示的UI,可以直接改变NetworkManager的属性。

  3. 复活点

  4. UI界面

  5. 玩家预制体-坦克

  6. public NetworkManager networkManager;

  7. 例子:NetworkManager.singleton.StartHost();

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43040880/article/details/109146857

智能推荐

海康威视网络摄像头开发流程(五)------- 直播页面测试_ezuikit 测试的url-程序员宅基地

文章浏览阅读3.8k次。1、将下载好的萤石js插件,添加到SoringBoot项目中。位置可参考下图所示。(容易出错的地方,在将js插件在html页面引入时,发生路径错误的问题)所以如果对页面中引入js的路径不清楚,可参考下图所示存放路径。2、将ezuikit.js引入到demo-live.html中。(可直接将如下代码复制到你创建的html页面中)<!DOCTYPE html><html lan..._ezuikit 测试的url

如何确定组态王与多动能RTU的通信方式_组态王ua-程序员宅基地

文章浏览阅读322次。第二步,在弹出的对话框选择,设备驱动—>PLC—>莫迪康—>ModbusRTU—>COM,根据配置软件选择的协议选期期,这里以此为例,然后点击“下一步”。第四步,把使用虚拟串口打勾(GPRS设备),根据需要选择要生成虚拟口,这里以选择KVCOM1为例,然后点击“下一步”设备ID即Modbus地址(1-255) 使用DTU时,为下485接口上的设备地址。第六步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“第五步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“_组态王ua

npm超详细安装(包括配置环境变量)!!!npm安装教程(node.js安装教程)_npm安装配置-程序员宅基地

文章浏览阅读9.4k次,点赞22次,收藏19次。安装npm相当于安装node.js,Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西_npm安装配置

火车头采集器AI伪原创【php源码】-程序员宅基地

文章浏览阅读748次,点赞21次,收藏26次。大家好,小编来为大家解答以下问题,python基础训练100题,python入门100例题,现在让我们一起来看看吧!宝子们还在新手村练级的时候,不单要吸入基础知识,夯实自己的理论基础,还要去实际操作练练手啊!由于文章篇幅限制,不可能将100道题全部呈现在此除了这些,下面还有我整理好的基础入门学习资料,视频和讲解文案都很齐全,用来入门绝对靠谱,需要的自提。保证100%免费这不,贴心的我爆肝给大家整理了这份今天给大家分享100道Python练习题。大家一定要给我三连啊~

Linux Ubuntu 安装 Sublime Text (无法使用 wget 命令,使用安装包下载)_ubuntu 安装sumlime text打不开-程序员宅基地

文章浏览阅读1k次。 为了在 Linux ( Ubuntu) 上安装sublime,一般大家都会选择常见的教程或是 sublime 官网教程,然而在国内这种方法可能失效。为此,需要用安装包安装。以下就是使用官网安装包安装的教程。打开 sublime 官网后,点击右上角 download, 或是直接访问点击打开链接,即可看到各个平台上的安装包。选择 Linux 64 位版并下载。下载后,打开终端,进入安装..._ubuntu 安装sumlime text打不开

CrossOver for Mac 2024无需安装 Windows 即可以在 Mac 上运行游戏 Mac运行exe程序和游戏 CrossOver虚拟机 crossover运行免安装游戏包-程序员宅基地

文章浏览阅读563次,点赞13次,收藏6次。CrossOver24是一款类虚拟机软件,专为macOS和Linux用户设计。它的核心技术是Wine,这是一种在Linux和macOS等非Windows操作系统上运行Windows应用程序的开源软件。通过CrossOver24,用户可以在不购买Windows授权或使用传统虚拟机的情况下,直接在Mac或Linux系统上运行Windows软件和游戏。该软件还提供了丰富的功能,如自动配置、无缝集成和实时传输等,以实现高效的跨平台操作体验。

随便推点

一个用聊天的方式让ChatGPT写的线程安全的环形List_为什么gpt一写list就卡-程序员宅基地

文章浏览阅读1.7k次。一个用聊天的方式让ChatGPT帮我写的线程安全的环形List_为什么gpt一写list就卡

Tomcat自带的设置编码Filter-程序员宅基地

文章浏览阅读336次。我们在前面的文章里曾写过Web应用中乱码产生的原因和处理方式,旧文回顾:深度揭秘乱码问题背后的原因及解决方式其中我们提到可以通过Filter的方式来设置请求和响应的encoding,来解..._filterconfig selectencoding

javascript中encodeURI和decodeURI方法使用介绍_js encodeur decodeurl-程序员宅基地

文章浏览阅读651次。转自:http://www.jb51.net/article/36480.htmencodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来_js encodeur decodeurl

Android开发——打包apk遇到The destination folder does not exist or is not writeable-程序员宅基地

文章浏览阅读1.9w次,点赞6次,收藏3次。前言在日常的Android开发当中,我们肯定要打包apk。但是今天我打包的时候遇到一个很奇怪的问题Android The destination folder does not exist or is not writeable,大意是目标文件夹不存在或不可写。出现问题的原因以及解决办法上面有说报错的中文大意是:目标文件夹不存在或不可写。其实问题就在我们的打包界面当中图中标红的Desti..._the destination folder does not exist or is not writeable

Eclipse配置高大上环境-程序员宅基地

文章浏览阅读94次。一、配置代码编辑区的样式 <1>打开Eclipse,Help —> Install NewSoftware,界面如下: <2>点击add...,按下图所示操作: name:随意填写,Location:http://eclipse-color-th..._ecplise高大上设置

Linux安装MySQL-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle.tar_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_6-程序员宅基地

文章浏览阅读2.8k次。一,下载mysql:http://dev.mysql.com/downloads/mysql/; 打开页面之后,在Select Platform:下选择linux Generic,如果没有出现Linux的选项,请换一个浏览器试试。我用的谷歌版本不可以,换一个别的浏览器就行了,如果还是不行,需要换一个翻墙的浏览器。 二,下载完后解压缩并放到安装文件夹下: 1、MySQL-client-5.6.2_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle