通过Mirror内置的例子来学习其用法,此为笔记。
NetworkManagerHUD2
NetworkManager
NetworkManager
NetWorkManager是联机的核心组件,可以通过Inspector界面调整具体参数。
每个Scene只能有一个NetworkManager,多余的会自动删除。由于具有NetworkIdentity组件的对象在加载场景的时候会自动禁用,所以NetworkManager不能放在游戏对象(会有操作)上。
NetworkManager可以通过派生来根据项目实际需求来修改,自定义化,但如果项目不大,还是保持原样效率会更高。
在给游戏对象添加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组件
在这里就要提到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]。
文章浏览阅读3.8k次。1、将下载好的萤石js插件,添加到SoringBoot项目中。位置可参考下图所示。(容易出错的地方,在将js插件在html页面引入时,发生路径错误的问题)所以如果对页面中引入js的路径不清楚,可参考下图所示存放路径。2、将ezuikit.js引入到demo-live.html中。(可直接将如下代码复制到你创建的html页面中)<!DOCTYPE html><html lan..._ezuikit 测试的url
文章浏览阅读322次。第二步,在弹出的对话框选择,设备驱动—>PLC—>莫迪康—>ModbusRTU—>COM,根据配置软件选择的协议选期期,这里以此为例,然后点击“下一步”。第四步,把使用虚拟串口打勾(GPRS设备),根据需要选择要生成虚拟口,这里以选择KVCOM1为例,然后点击“下一步”设备ID即Modbus地址(1-255) 使用DTU时,为下485接口上的设备地址。第六步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“第五步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“_组态王ua
文章浏览阅读9.4k次,点赞22次,收藏19次。安装npm相当于安装node.js,Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西_npm安装配置
文章浏览阅读748次,点赞21次,收藏26次。大家好,小编来为大家解答以下问题,python基础训练100题,python入门100例题,现在让我们一起来看看吧!宝子们还在新手村练级的时候,不单要吸入基础知识,夯实自己的理论基础,还要去实际操作练练手啊!由于文章篇幅限制,不可能将100道题全部呈现在此除了这些,下面还有我整理好的基础入门学习资料,视频和讲解文案都很齐全,用来入门绝对靠谱,需要的自提。保证100%免费这不,贴心的我爆肝给大家整理了这份今天给大家分享100道Python练习题。大家一定要给我三连啊~
文章浏览阅读1k次。 为了在 Linux ( Ubuntu) 上安装sublime,一般大家都会选择常见的教程或是 sublime 官网教程,然而在国内这种方法可能失效。为此,需要用安装包安装。以下就是使用官网安装包安装的教程。打开 sublime 官网后,点击右上角 download, 或是直接访问点击打开链接,即可看到各个平台上的安装包。选择 Linux 64 位版并下载。下载后,打开终端,进入安装..._ubuntu 安装sumlime text打不开
文章浏览阅读563次,点赞13次,收藏6次。CrossOver24是一款类虚拟机软件,专为macOS和Linux用户设计。它的核心技术是Wine,这是一种在Linux和macOS等非Windows操作系统上运行Windows应用程序的开源软件。通过CrossOver24,用户可以在不购买Windows授权或使用传统虚拟机的情况下,直接在Mac或Linux系统上运行Windows软件和游戏。该软件还提供了丰富的功能,如自动配置、无缝集成和实时传输等,以实现高效的跨平台操作体验。
文章浏览阅读1.7k次。一个用聊天的方式让ChatGPT帮我写的线程安全的环形List_为什么gpt一写list就卡
文章浏览阅读336次。我们在前面的文章里曾写过Web应用中乱码产生的原因和处理方式,旧文回顾:深度揭秘乱码问题背后的原因及解决方式其中我们提到可以通过Filter的方式来设置请求和响应的encoding,来解..._filterconfig selectencoding
文章浏览阅读651次。转自:http://www.jb51.net/article/36480.htmencodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来_js encodeur decodeurl
文章浏览阅读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
文章浏览阅读94次。一、配置代码编辑区的样式 <1>打开Eclipse,Help —> Install NewSoftware,界面如下: <2>点击add...,按下图所示操作: name:随意填写,Location:http://eclipse-color-th..._ecplise高大上设置
文章浏览阅读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