unreal4局域网 - CSDN
精华内容
参与话题
  • 使用的虚幻引擎版本:4.23.1 实现的功能:局域网联机

    前言

    包含了之前介绍过的一些基础功能,相比前面的文章,这篇文章的功能实现起来会更复杂些,需要使用到第三人称模板。
    此文章的截图都是自己创建的项目中截取的,不存在抄袭截图情况。但是局域网联机的有些思路大多都是类似的,所以会出现雷同现象。

    虚幻引擎版本: 4.23.1
    虚幻引擎插件:Electronic Nodes,该插件仅用于美化蓝图

    其他介绍

    虚幻4官方文档
    虚幻4中文官网
    虚幻引擎蓝图API参考文档
    虚幻引擎4蓝图节点-小狐狸233

    上一篇笔记

    虚幻引擎4笔记(17)-悬浮血条

    下一篇笔记

    虚幻引擎4笔记(19)-昼夜交替

    完整项目

    因为此篇文章的内容有点多,你可以下载项目下来对着博客进行理解。

    百度网盘链接

    提取码:p7bx

    一、准备阶段

    首先创建几个文件夹,以便之后文件的分类存储
    在这里插入图片描述
    然后导入一张你需要的图片,之后可以作为游戏主界面的背景图

    在这里插入图片描述

    二、玩家

    有关玩家的设置你可以参照以下几篇笔记,此篇文章重点不在这,仅列出相应的角色蓝图和绑定按键

    虚幻引擎4笔记(1)-角色跳跃
    虚幻引擎4笔记(2)-角色移动
    虚幻引擎4笔记(3)-视角移动
    虚幻引擎4笔记(4)-角色模型导入
    虚幻引擎4笔记(11)-人物加速

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    三、地图

    此篇文章使用了两个地图,本来是想用游戏大厅地图来弄主界面的,之后变换了思路就留着了。
    你也可以使用一个地图来设计

    在这里插入图片描述

    四、游戏模式

    游戏模式顾名思义就是定义游戏的一些规则,我们目前不需要设置模式的太多内容,只需要用模式来在地图中生成对应的玩家即可。

    在这里插入图片描述
    在游戏模式的细节中找到Default Pawn Class这个属性,并选择自己的角色
    在这里插入图片描述
    在项目设置中选择自己已建好的游戏模式地图,完成这个之后当打开游戏中的某一个地图时就会生成一个可被控制的角色。

    在这里插入图片描述

    五、界面介绍

    先创建三个控件蓝图,如下图所示

    界面 介绍
    主界面 放置加入游戏、搜索房间、退出游戏按钮,当进入游戏大厅地图时被触发
    查找服务器界面 在主界面点击搜索按钮时被触发,同时进行房间的搜索,如果找到时就将房间信息显示
    加入服务器界面 用于在查找服务器界面显示房间信息和一个加入的按钮,需要传入已搜索到的房间信息

    在这里插入图片描述

    六、关卡蓝图

    因为界面不是自己就会触发的,所以你需要先打开游戏大厅这个地图,然后在其关卡蓝图中进行设置
    如果你有什么节点不大了解的话,可以点击下方链接去查找,通常文章里的节点都有录入了。

    虚幻引擎4蓝图节点-小狐狸233
    在这里插入图片描述

    七、加入服务器界面

    [1]. 界面设置

    先拖入两个水平盒子
    在这里插入图片描述
    在窗口中调整其位置、大小如图,左边的box用于放置按钮,右边的box用于放置房间名字
    在这里插入图片描述
    先对左边的BOX拖进去一个按钮,并拖动一个文本到该按钮下,设置文本默认值
    在这里插入图片描述
    再对右边的BOX拖进一个文本,设置文本默认值
    在这里插入图片描述

    [2]. 变量

    进入图表界面
    先创建一个Blueprint Session Result类型的变量,名称随意,并在生成时公开打勾
    在这里插入图片描述
    再创建一个字符串类型的变量,在生成时公开处打勾
    在这里插入图片描述

    [3]. 加入房间

    在加入按钮的细节中,找到On Clicked并点击加号创建一个事件节点
    因为我已经创建过了,图片才显示的查看
    在这里插入图片描述
    虚幻引擎4蓝图节点-小狐狸233
    在这里插入图片描述

    八、查找服务器界面

    [1]. 界面设置

    先拖动一个image组件,然后在其细节选择背景图片,并在窗口中设置相应的大小
    在这里插入图片描述

    在这里插入图片描述
    然后选择锚点为根据屏幕大小自动调整
    在这里插入图片描述

    在这里插入图片描述

    然后拖入一个按钮,这个按钮作用是返回主界面
    在这里插入图片描述
    在这里插入图片描述
    拖入Scroll BoxCircular Throbber,前者是用于存放房间信息的一个盒子,后者是在没有查找到房间时的一个动态圆圈效果。
    在这里插入图片描述

    在这里插入图片描述

    [2]. 设置图层

    因为默认的图层都为0,背景图片可能会覆盖掉其他的组件,所以你需要调低背景图片的图层
    把背景图片设置为其他组件之后。

    在这里插入图片描述

    [3]. 动态圆圈显示与消失

    因为当查找到房间的信息时需要放置到BOX中,而此时就不需要这个动态圆圈了
    先选择这个Circular Throbber,在细节中找到如下图所示的Visibility创建一个绑定

    在这里插入图片描述
    虚幻引擎4蓝图节点-小狐狸233

    在这里插入图片描述

    [4]. 返回主界面

    在这里插入图片描述

    在这里插入图片描述

    [5]. 搜索房间信息并显示

    在这里插入图片描述

    九、主界面

    [1]. 界面设置

    具体的内容和前面的类似,此处就直接显示最终的结果
    在这里插入图片描述
    在这里插入图片描述
    虚幻引擎4蓝图节点-小狐狸233

    [1]. 创建游戏房间

    Create Session和前面的Find Session节点是互相对应的,一个创建会话,一个搜索会话

    在这里插入图片描述

    [2]. 搜索房间

    主要的搜索功能是在查找服务器界面中实现的,主界面的搜索按钮主要是用来打开查找服务器界面

    在这里插入图片描述

    [3]. 退出游戏

    在这里插入图片描述

    展开全文
  • 一直都想做一个网络端的...首先,想要使用UE4的网络模块,就必须在你的项目目录的Confi/DefaultEngine.ini文件中加入几行代码 这个部分叫OnlineSubSystem,官网也有介绍https://docs.unrealengine.com/latest/INT/P

    一直都想做一个网络端的游戏,可以自己创建房间,可以让别人加入。学习的时候参考了官方的MultiplayerShootout 的例子。

    首先,想要使用UE4的网络模块,就必须在你的项目目录的Confi/DefaultEngine.ini文件中加入几行代码

    这个部分叫OnlineSubSystem,官网也有介绍https://docs.unrealengine.com/latest/INT/Programming/Online/Steam/index.html

    添加了这些之后重新打开你的项目。

    第一步

    创建自己的GameInstance

    第二步

    添加几个自定义事件




    第三步

    调用这几个事件,为了简便期间我没有做相应的UI,把调用部分都做在了关卡蓝图里


    另外Gamemode 和playercontroller也做了一些流程图,都是仿照官方那个例子的,作用就是重置玩家的位置而已。

    主要的创建房间以及加入房间功能就是上面的截图了。特别注意的是Creat Session之后需要打开你要玩的游戏地图,其中Public Connections 参数就是指定可以多少个人加入这个房间。UseLAN参数表示是使用局域网还是广域网。之后的OpenLevel 需要全部展开,Options 参数中加入listen,不然别人是无法加入你的地图的。


    展开全文
  • 原帖地址:https://arcecho.github.io/2017/04/28/...这篇文章会展示如何使用蓝图制作一个简单的局域网对战小游戏及使用UE4网络的需要注意的地方。注意示例并非step=by-step,只是列出主干并提及一些需要注意到地方,

    原帖地址:https://arcecho.github.io/2017/04/28/使用UE4制作简单的局域网对战小游戏/

    大多数文章都是只讲到大致的UE4网络的概念,并未涉及实际使用。事实上在使用的时候还是有很多要注意的地方。这篇文章会展示如何使用蓝图制作一个简单的局域网对战小游戏及使用UE4网络的需要注意的地方。注意示例并非step=by-step,只是列出主干并提及一些需要注意到地方,最后会讨论下自己对UE4网络部分的理解(非完全的概念解释,大部分是自己试验观察并思考的结论),如果有什么错误请不吝赐教。

    效果展示

    大致思路

    这里不过多的累述具体的代码细节,想要了解更多可以直接查看(源码)(https://github.com/ArcEcho/SpaceshipWar)。且先声明下面的讨论建立在我们使用的是Listening server模式下的,因为这个示例中即使用这种模式。

    所需要的核心成员

    GameInstance

    对应代码里的BP_SpaceshipWarGameInstance。GameInstance顾名思义,一个client就拥有这么一个对象的实例。生命周期自游戏创建到游戏结束,不会受关卡切换影响,适合于处理一些全局的事物。像UE4就把类似NetError的处理的入口放在GameInstance里面。
    GameInstance的代码总览

    官方的示例上面的都是把CreateSession放在了GameInstance里面处理,我为了简便直接在Menu的事件响应里面直接处理。

    GameMode

    对应代码里的BP_BattleGameMode,注意继承的是GameModeBase,而不是GameMode,这是因为GameModeBase足矣。它制定游戏的规则等,是游戏的核心部分。在Multiplayer中处理玩家登录OnPostLogin(在蓝图中关于登录的只有这个事件,但是C++中有额外的PreLogin等处理)后的响应,确定是否要进行比赛等以及玩家得分,对局情况等。
    GameMode代码总览

    GameState

    这个例子中没有扩展GameState,因为暂时没有用到GameState。但是提一下,GameState存在于Server,且各个Client有其copy。里面存储了诸如所有PlayerState等关于游戏client希望能取到的全局数据,用途也由此决定,不累述。

    PlayerController

    对应代码里的BP_SpaceshipController。处理脱离Pawn无关的操作,如显示等待界面或者向server告知玩家已经准备好进行新一轮比赛的信息等。总的来说,PlayerController是玩家在server的抽象概念,是处理输入的中枢(虽然有一部分操作是在Pawn里面直接处理的,如move和开火等,但是实际上Pawn的输入也来源于PlayerController。相当于派发到Pawn自己处理,这是设计的考量),是沟通server和client时玩家的主要中介。
    PlayerController代码总览

    Pawn

    对应代码里的BP_Spaceship。这个不用多说,我们的操作的对象的表现基本上由它来实现。
    Pawn里面的代码总览

    Bullet Actor

    对应代码里的BP_Bullet。被发射,然后击中敌人就会触发其HP减少,这个检测时在Server完成的。
    Bullet代码总览

    PlayerState

    对应代码里的’BP_SpaceshipPlayerState’,用来存储玩家的血量信息,用以Client表现以及对局输赢的判断。

    其它辅助的成员

    UI界面

    UI界面很简单,全部使用了UMG来完成,没有使用资源来美化界面,使用了部分UMG动画,如等待时闪烁的动画。且除了在ServerList中的ListItem比复杂一点以外,逻辑什么的都是很简单的,故不累述。

    CameraShake

    当spaceship被击毁时就会产生镜头抖动的效果,很简单实用的功能。

    特效

    大部分特效是借鉴别人的东西。但是需要注意的是原来的引擎喷射特效的某个Emitter的InitialVelocity是常量,在飞船方向改变时不会变化。这里把这个提升成一个变量,可以通过自己传值来改变其方向。

    音效

    需要注意的就是简单的处理了下背景音乐,创建一个cue资源,然后设置背景音乐wave为循环播放。

    制作时需要注意的地方

    在制作时有些细枝末节的地方需要注意,且他们隐藏的较深,但是没正确设置不行。下面说一下我在制作时遇到的问题,也会解释解决的方案。

    最优先的是需要在配置修改网络配置

    简单使用网络功能时请确保在DefaultEngine.ini的配置是正确的!!!

    关于PlayerController的AutoManageActiveCameraTarget

    在场景中放置一个CameraActor,然后各个client改变其roll角并通过SetViewTargetWithBlend来使用,会发现只有一个Client(在listening server模式下即server所在的client)上的表现正常,另外一个使用的默认相机。虽然这个可以通过放置两个摄像机来解决,但是按照最初设计那是hack式的做法。正确的解决方案如下:

    若要在multiplayer game中使用一个固定的camera,则需要关掉PlayerController的 AutoManageActiveCameraTarget,否则不能同时使用一个。

    关于Actor的Component的同步问题

    我们飞船的在左右移动的时候,其roll角会随速度发生变化,在原来space shooter tutorial中表现正常,但是在multiplayer时却表现出没有正确同步。原因是Actor的component并不会受actor本身的Replicates属性影响,必须自行启用。

    虽然Pawn的Replicates是默认勾选的,在其下面加上一个Mesh。不勾选ComponentReplicate的时候,在Server端改变其Relative Rotation,则只会在Server端看到效果,Client不会同步变化。勾选之后Client就会同步了。
    为什么不会自动继承同步呢?因为不是所有的Component都需要在Server去操作然后同步到各个Client的,比如自己的角色下的光圈只需要在当前Client显示,这个光圈可以是一个DecalComponent,它不需要同步。鉴于此种情况,组件同步需要用户手动来启用。

    UE4默认情况下,当程序被挂起的时候是不播放声音的

    这个挂起是指焦点不在程序窗口。这时候UE4不播放声音,我开始还以为是我的代码出错,后面排除并得出了这么个结论。需要修改一些设置之后才行,但是这里没有必要暂不处理。

    在哪里以及如何处理类似用户开火及移动的输入

    前面在介绍核心成员PlayerController的时候有提到将开火及移动输入的处理放到了Pawn中处理。为什么这么做呢?所有操作不是都是应该由PlayerController来处理么?这个问题恰巧群里也有人问到,我解释了我的看法,这里也提一下把。放在哪里处理是个设计问题,按道理来说确实应该由PlayerController来处理,因为所有用户输入都必须要经过PlayerController,比如我们在SetInputMode的时候target是一个PlayerController,通过PlayerController可以BlockInput等等。虽然存在且必须存在一个PlayerController,但是它可能就没有possess任何一个Pawn,实际响应输入的时候,就需要做Pawn是否valid的验证,这真的很麻烦,如果将这个和Pawn直接关联操作响应移到Pawn中处理,这个写判断就可以省去,因为只有Possess的时候(当然不要勾选AutoRecieveInput什么的选项。。。)才会响应输入,代码就变得更加合理优雅了。另外如果在输入的时候需要时就是要判断Pawn有没有并给出提示信息的话,这些个处理代码移动到PlayerController里面才合适。所以归根结底这是一个设计问题,并且这也是UE4灵活性的一个体现。
    然后在谈Multiplayer中如何处理这些输入。UE4提供了多种Replication机制,有属性的Replicate和3种类型的RPC方式。其中RPC的Multicast及RunOnServer方式可以将用户操作传到Server并作出响应。但是具体何时及如何使用是值得商榷的。举个例子角色开火会发射子弹。这个操作(Server的pawn是取不到且不应该input数据的,Server要的输入数据必须从Client传过去)由Client输入发起,应当请求Server进行操作,即调用一个RunOnServer的RPC,这点应当没有疑问,但是重点来了,到底要不要调用Multicast来spawn对应的bullet呢?答案是不应该!spawn的时候可能需要取到和actor位置相关的数据,注意Multicast是Server和各个Client上面的Pawn都会去调用相应的操作代码,然后这个时候取到的分别是Server和Client自己的位置数据,那么由于client和Server的同步差异会导致取到的位置的可能是不同的。然后且会Spawn多个Actor,因为每次调用都会spawn,若是bullet是一个replicated的actor那么各个Client上面都会显示多个bullet,这明显不是我们要的。我们仅需要一次spawn一个actor即可,那么这就需要仅在Server调用spawn函数,然后通过replication机制来同步到各个Client。那么Multicast函数的使用时机是什么呢?上面描述的是仅需要在Server干的活,但是Client也会要同时要做一些事情,比如同时播放个声音什么的,这个时候如果只在上面的那个RunOnServer事件里面执行这句话,只会在Server上(listening server模式下即host game的Client上生效),这显然也不是我们想要的。这个时候就是Multicast的应用场景了。
    再然后讨论在讨论移动需不需要使用Multicast,不同于服务器Spawn,不会产生多个actor,因为整个操作过程中只有实际意义上的一个Pawn受控制(客户端会同步服务器上对应的Pawn)。第一种方案,在服务端移动Pawn,并且将RootComponent设置成Replicate的就可以看到同步效果了,但是似乎这种方式客户端的对象由于延迟感觉移动不是很流畅。而第二种方式使用Mutilcast在Server和Client分别让关联的Pawn自己处理自己的移动,然后通过同步来让服务器纠正客户端的位置的话,这样感觉移动比上面的更加连贯了。大部分网络游戏好像都是这么做的。

    关于UE4的Network的思考

    UE4的提供的Network功能,有他自己的一套方案,且和大多数S/C结构不一样,它的Server和Client端的代码是混在一起而不是各自独立分离。当然有好处也有坏处,比如好处是可以少写很多Client和Server共用的重复的代码,并在UE4的支持下快速实现联网游戏;也比如坏处是代码看起来就比较杂,也额外多了很多概念让人感到混乱。下面就我自己的理解来谈谈把。

    理解UE4中通常意义的单机游戏实际上可以看作是联网游戏的退化版

    这个我个人认为是Epic早年是做对战游戏的,然后将引擎特化出来后,了同时支持联网和单机类型,选择了这么个设计。单机模式下,实际上就是本地Server,只有玩家一个人在这个Server里面。这个可以从单机模式下GameMode的依旧会调用Login相关的处理且此时也不会创建Session等可以简单的看出来。

    但谈论到UE4的网络的时候必须分清楚使用的是Dedicated Server还是Listening Server模式

    必须要区分清楚,因为这个实际上会影响代码里面的一些写法,而且这个也是让人混淆的一个知识点。不同的模式下,可能处理的方式不一样。比如authority的问题。不过不管怎么样,记住一点当时用Listening Server的时候,Host game的Client即是Cient也是Server,而Dedicated Server模式下Serverr和Client有直接关系。

    RPC调用时请注意调用时的context是处于Server还是Client

    首先就RunOnOwningClient方式而言,它必须调用在Server上Context中被调用,否则会被当成一个普通的事件被调用。比如下图的打印,存在两个Pawn,并在Pawn的BeginPlay中调用,Server加上两个Client总共是6个对象,上面确实打印了6次

    而加入authority的判断后打印如下,这是加上了Authority的判断后的打印,当拥有Authority的时候才执行RunOnOwning的事件,并在其中打印(注意这并不是判断server)。

    • 这里的对象都在server和相应的client都有copy,且pawn的copy存在于每个客户端。在authority的干涉下,执行RunOnOwningClient事件,仅在其对应的client有打印。这就表明拥有copy不一定代表own它,这个client owned的关系是明确指定的。
    • 额外的启示是从打印对象的名称如BP_MyPawn_C_0最后的suffix index可以看出,client在产生相应actor的时候,这个名字和server(选择性不考虑listening server 自身的client)上的不是对应的,这个suffix index是生成顺序决定的(经验上这个0代表的是自己的pawn),所以并不能作为判断对象的唯一性的标准。换句话说打印名字一致不是说就是同样的copy,唯一性还是要通过一个unique id来表明。
      RunOnServer的话,在服务器上调用RunOnServer方式,本来就是就是server端了,这个RunOnServer的事件类型的指令就是冗余的。实际例子就是GameMode里面调用自己内部的事件时,还将其指定为RunOnServer话就是多余的。因为GameMode本身就是直存在于server,其一切操作就是RunOnServer的。又比如在TakeDamage里面去调用RunOnServer事件,TakenDamage只会在服务器触发,因此前面的做法也是冗余的。

    明确Authority的具体含义

    上面有说Authority的判断不是判断是否是Server。我所在的讨论群里就有这种错误的认识,认为蓝图节点SwtitchHasAuthority就是判断是Server还是Client。这是不准确的。比如HUD类似的对象,只在owning client上存在,即其在且仅在owning client上有authority。而且我前面提到的要注意分清楚使用的是Dedicated Server还是Listening Server模式,这是因为那个Listen Server的缘故,在Server扮演Client时,对所有拥有的对象都有Authority。具体可以看下图,均是在BeginPlay中打印Authority信息。

    我认为使用Authority判断的情景是,如果客户端和服务器都会执行同一段代码且让最终执行结果仅由有authority的一方决定,就可以使用authority判断。当然像前面所说的HUD就没有必要判断authority了,因为它的代码只在客户端执行。不能滥用,避免冗余,引起混淆。
    UE4官方论坛上有个帖子对这个问题有深入的讨论:What is the actual meaning of “Authority”?

    不可忽略延迟以及相关的时序问题

    只要是使用到网络就不能忽略延迟,比如UE4里面的RPC有时候没有调用成功,很可能就是延迟导致的。另外值得注意的时这也是导致单机模式下和联网模式下代码差异的一个因素哦。
    比如在Server的PlayerController的BeginPlay中直接调用一个RunOnOwningClient的RPC,这个成不成就看运气了,纵使它是Reliable的。
    再比如测试Multiplayer中,假设这么个情形,场景中设置两个player start设置两个玩家,然后登录,这个时候有可能出现第二个客户端的pawn没有正确生成。

    首先pawn里面的component有collsion设置,然后由于在Editor里面启动的时候,两个client访问server时的间隔过短,导致了可能取到了同一个player start,这样就导致了第二个pawn尝试被spawn的时候由于collsion而失败,然后就出现上述的情形了。

    • 验证其实很简单把collision去掉,则个时候不会出现上面的情况,但是两个pawn有几率重合在一起。
    • 这点我认为在处理多人游戏时应该注意一下,因为玩家的登录间隔是无法预测的。


    上面例子说明UE4并没有保证那些个单机模式下的时序,且估计也不想去保证,因为网络环境时不可预测的。这样就导致了我的项目中存在一些bug,比如要对pawn判断是不是当前client拥有时,可能由于同步延迟server的posses操作的结果还有同步过来,就出错等。我暂时也没有想到比较好的解决方案,暂时只好加上个delay来处理,不过这也是治标不治本。这个我会在后面的项目中继续思考,这暂时当作一个问题放在这里把。

    评估项目是否可能需要做成联网,这很重要!

    由上面的讨论可知,联网和单机类型的代码差异还是比较大。如果不好好评估,则可能到时候会很痛苦。

    总结

    通过学习并编写这个项目,算是把UE4中关于网络部分的表面功能弄清楚了。就这个项目而言C++部分的代码实际上和蓝图差不多。但是蓝图上提供的功能时比较有限,而C++代码里面支持更多了。比如对登陆人数的限制,蓝图只提供了OnPostLogin的BlueprintImplementable事件来协助处理,但是这个时候实际上server已经接受了,已经为其创建了PlayerController了,如过设置了PawnClass那也就已经生成Pawn了,没有办法直接拒绝超出预期的人数的玩家。这就需要C++中的PreLogin方法协助处理。不管怎么样,一个playable的游戏做出来了,虽然存在问题,但是不能停滞不前,带着问题继续思考学习,这才是一个比较好的状态啊。

    展开全文
  • UE4 VR局域网(二)基础知识

    千次阅读 2017-11-20 14:14:31
    复制 1.引用类型可以复制。(实际传递的是引用对象的ID(FNetworkGUID)) 2.大部分组件不支持复制。   ...1.使用组件的set is replicated时,可以用RepNotify(服务器和客户端执行相同的同步后的事件): ...

    复制

    1.引用类型可以复制。(实际传递的是引用对象的ID(FNetworkGUID)

    2.大部分组件不支持复制。

     

     

    1.使用组件的set is replicated时,可以用RepNotify服务器和客户端执行相同的同步后的事件):

    I managed to resolve the issue by getting rid of the Set Is Replicated nodes and making the variable of DeltaRELCombine (the one which is set after calculations and determines where the new StaticMesh should be placed) RepNotify. In the On Rep function I implemented the StaticMeshComponent addition so that it executes both on the client and the server in the same way. I also had to play with the dynamic material instances a bit as they where replicated only upon some significant events.

     

    2.同步static mesh

     https://answers.unrealengine.com/questions/21524/replicate-static-mesh.html  //利用创建static meshactor 解决。

     

    3.变量同步,事件通知

     例:

    //声明示例

    UPROPERTY(Transient, Replicated)

    TArray<class AShooterWeapon*> Inventory;

     

    //声明示例

    UPROPERTY(Transient, ReplicatedUsing = OnRep_CurrentWeapon)

    class AShooterWeapon* CurrentWeapon;

     

    //此函数不需要声明,用来设置不同条件的定义同步变量

    cpp加上#include "UnrealNetwork.h"

     

      void AShooterCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const

    {

    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    // only to local owner: weapon change requests are locally instigated, other clients don't need it

    DOREPLIFETIME_CONDITION(AShooterCharacter, Inventory, COND_OwnerOnly);

    // everyone except local owner: flag change is locally instigated

    DOREPLIFETIME_CONDITION(AShooterCharacter, bIsTargeting, COND_SkipOwner);

    DOREPLIFETIME_CONDITION(AShooterCharacter, LastTakeHitInfo, COND_Custom);

    // everyone

    DOREPLIFETIME(AShooterCharacter, CurrentWeapon);

    DOREPLIFETIME(AShooterCharacter, Health);

    }

     

    上面的事件通知可以传递此变量同步前的值作为参数,像这样:

    UFUNCTION()

    void OnRep_CurrentWeapon(class AShooterWeapon* LastWeapon);

    void AShooterCharacter::OnRep_CurrentWeapon(AShooterWeapon* LastWeapon)

    {

    SetCurrentWeapon(CurrentWeapon, LastWeapon);

    }

     

    注意:

    1.结构体不可以同步。

    2.服务器上OnRep_CurrentWeapon这个函数不会触发,只会在客户端上触发!如下


    4.replicate属性下的replicate movement这个同步功能:1.位置同步。2.旋转同步。actor不能同步缩放.

     

    5.C++中同步函数使用注意:

       如:

    void AMyActor::DoFun()

    {

    if (Role<ROLE_Authority)

    {

    ServerRotateFunitureEnter(_begin,_end);

    return;    //存在和不存在的区别!!!

    }

     

    //逻辑部分

    }

    //省略Validate函数

    Void AMyActor::ServerDoFun_Implementation()

    {

    DoFun();

    }

     

    基本上RPC函数都是这样的模型,当客户端调用DoFun()时,没有return时,客户端调用后转到服务器上执行逻辑部分后,客户端自己又会执行一次逻辑。所以,如果逻辑部分只在服务器上执行逻辑部分时需要加上return,这样客户端只需要等待服务器执行完逻辑部分后的同步效果。


    相关性

     

       

     

    //关联性先用看到来理解。

    Only relevant to onwer :不关联给别人,只有自己能看的。

    Always relevant :  始终关联,大家都能看到的。

    Net user owner relevancy: 根据自己的所有者来决定关联性。

    Net cull distance squared: 在一定距离内能被看到。

     

    //注意!

    Only relevant to owner 使用时,从服务器上生成的话不会同步到客户端即使勾上了replicates

    owner默认为谁生成这个actor,这个actor的owner就是谁。可以AActor::setowner()来设置owner。

     

     

    Priority(优先级),更新频率

     

     

    //一般比较重要的如主角色优先级是3,普通actor是1.

    //2通常是1更新速度两倍。

     

    Net update frequency :更新频率

    Min net update frequency: 最小更新频率



    展开全文
  • 客户端会向255.255.255.255发送广播信息如果接受消息失败的话可以运行一个bat命令netsh int ip reset c:\resetlog.txt 重置一下网络环境看看 还有一种比较黑的方式就是修改LanBeacon.cpp中的 FLanBeacon::Init()...
  • Unreal Engine Pixel Streaming

    千次阅读 2018-11-24 00:31:19
    https://docs.unrealengine.com/en-us/Platforms/PixelStreaming/PixelStreamingIntro ... UnrealEngine4.21发布的一个新功能,基于WEBRTC技术,在浏览器(ch...
  • 1.网址:https://docs.unrealengine.com/zh-CN/Resources/ContentExamples/Networking/index.html <联网内容示例> 2.网址:...
  • https://answers.unrealengine.com/questions/592480/run-two-game-instance-on-one-computer.html //SteamVR导致 解决方法,Plugin设置里不启用SteamVR。   2. HTC vive 的MotionControlle
  • ue4有两种联机方式,一种是局域网联机,另外一种是外网联机,需要有独立的服务器。但是无论是何种联机方式,都是只有一个服务器端,区别在于局域网联机中客户端和服务器端都同在CreateSession那...
  • Unreal里PlayerController、Player、Character之间的关系,要理解它们之间的关系,本质是搞明白Pawn和Controller的关系。
  • ue4源码本地git管理

    千次阅读 2019-09-22 16:49:54
    本文主要记录一下使用gitlab在局域网管理ue4源码的流程 大体思路是在局域网创建gitlab仓库来管理ue4的源码,当引擎源码需要更新时,先把本地代码同步到github上最新的,然后在push到局域网的gitlab仓库,其他人通过...
  • 局域网有一台自用的Ubuntu 18.04桌面版作为服务器,以ssh方式管理,用的时候开机,不用就关机 发现在用putty成功两次连接后必定连不上,进到路由器管理界面发现ip为0.0.0.0, 可本来这台机子有保留ip,而换个保留...
  • 虚幻引擎4(unrealengine4)免费版v2.0.1中文版 软件大小:58.2MB 软件语言:简体中文 软件类别:游戏工具 软件授权:免费版 更新时间:2015-03-04 应用平台:/Win8/Win7/WinXP 虚幻引擎4(unrealengine...
  • Unreal Swarm 联机构建配置说明

    千次阅读 2019-11-13 14:54:55
    要进行联机构建,并不需要参与的每台电脑上都安装好UE4,只需拷贝少数的几个文件即可(稍后说明)。并且Unreal Swarm比较智能,配置好之后可以从任意一台上发起构建,会自动分发至其他电脑。 Coordinator(调度器...
  • UE4 局域网斗地主(二)

    千次阅读 2017-09-04 11:37:22
    在此之前,先具备了解UE4大体框架的前提下,然后了解UE4的Repication是怎么运作的。步骤如下: 1.客户端-服务器模式及连接过程。 2.复制机制。(组件,Actor,属性复制) 3.RPC。 首先通读官方文档网络连接与多人...
  • UE4 网络物理同步

    千次阅读 2019-03-04 10:24:02
    在static mesh actor上,detail-Actor中勾选Static Mesh Replicate Movement
  • UE4多人联机

    千次阅读 2016-10-07 22:58:57
    UE4自带网络联机功能,但是似乎只有蓝图接口,而真正写功能的时候不能用C++,让人感觉相当诡异 还是作一个简单记录 1.建一个第三人称模板,为什么会用他呢,因为它自带模板的很多组件,直接支持联机功能,...
  • UE4之简单的多人游戏

    千次阅读 2019-07-24 21:54:25
    UE4多人游戏主要用到CreateSession,FindSession和JoinSession,功能分别是创建会话,查找会话以及加入会话。以下第三人称模板为例实现一个两人游戏。 1、创建第三人称模板工程,删除ThirdPersonExampleMap关卡中...
  • Unreal4教程总结

    2019-06-29 00:42:25
    Ue4大神的博客 http://www.tomlooman.com 关于CustomDepth的文章的翻译 http://gad.qq.com/program/translateview/7173279?sessionUserType=BFT.PARAMS.202650.TASKID&ADUIN=378100977&ADSESSION=...
1 2 3 4 5 ... 15
收藏数 291
精华内容 116
热门标签
关键字:

unreal4局域网