在游戏内,我们会遇到获取道具的情况,在众多物品中获取自己选择的物品就需要线性检测功能,线性检测可简单理解为射线,也是替玩家拿取物品的方向标。

  首先理清逻辑,我们需要有这么一条射线作为线性检测装置,其次我们要实现“检测”这个功能,也就是指向某物时产生效果,移开时产生另一种效果,就相当于指向我们需要的道具就会准确的锁定该道具。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  虚幻4线性检测制作过程 随笔 第1张

  那么接下来我们将开始实现线性检测功能

  第一步,创建上图中的红线;

打开人物蓝图,因为我这里使用的是第一人称,所以选择FirstPersonCharacter,在左上方找到FP_Gun(人物枪械模型),在下面添加组件Arrow(箭头),也就是“线”,调整好线的位置,与枪械模型方向一致。

虚幻4线性检测制作过程 随笔 第2张虚幻4线性检测制作过程 随笔 第3张

  第二步,创建接口蓝图;创建Actor蓝图(用来制作道具,反馈线性检测效果);

右键选择蓝图,在里面可以找到接口蓝图,点击蓝图类可以创建Actor蓝图,接口蓝图不能被直接调用,需要我们的蓝图包含接口蓝图才能生成接口事件,打开类设置后调整应用的接口。

虚幻4线性检测制作过程 随笔 第4张

虚幻4线性检测制作过程 随笔 第5张

 

 当然可以直接在Actor蓝图里写函数接口,只是调用的话比较麻烦,这里选择简单做法,接口函数相当于自定义事件,只不过在调用上方便许多。

虚幻4线性检测制作过程 随笔 第6张

 

第三步,创建两个函数,一个负责聚焦,一个负责转移

虚幻4线性检测制作过程 随笔 第7张

设立这两个接口是为了定义两件事情,第一个是当我们聚焦时,也就是射线指向物体时会产生什么效果;第二个是当我们转移时,也就是射线不指向物体上时会产生什么效果。这次我们要做的是聚焦时,物体会显示名字,反之隐藏。

  第四步,制作道具样貌;添加一个Widget(小装置);创建一个控件用来显示道具名字;将小装置中的Widget class选择为控件名;

  我做了个钥匙道具;在添加组件内部可以找到Widget;右键选择用户界面,在内部选择控件蓝图,之后从左侧控制板内拖拽Text至空白处,里面输入我们要显示的道具名称;在右侧的细节内可以找到Widgetclass(最后一行),之后选择我们创建的控件名称,这里注意要把Space(空间)设置成Screen,不然我们的名字就是一纸片,不会跟随玩家视角而改变;

虚幻4线性检测制作过程 随笔 第8张虚幻4线性检测制作过程 随笔 第9张虚幻4线性检测制作过程 随笔 第10张虚幻4线性检测制作过程 随笔 第11张虚幻4线性检测制作过程 随笔 第12张虚幻4线性检测制作过程 随笔 第13张

  第五步,为聚焦和转移两个函数添加事件,先为聚焦添加事件;

  1.在道具内添加一个接口图表,并创建事件“视口聚焦”和“视口转移”。

  在空白处右键节点,输入“接口”即可找到接口蓝图里的内容。

虚幻4线性检测制作过程 随笔 第14张虚幻4线性检测制作过程 随笔 第15张

 

 

  2.在两个事件后面分别建立两个同类型事件:Set Visibility,并从组件中将Widget拖拽至空白。

  因为我们要做到显示名字和隐藏名字这两个效果,而Widget本身就和显示道具名字的控件绑定,所以只需要对Widget进行显示和隐藏操作即可。

  虚幻4线性检测制作过程 随笔 第16张

  3.我们要设定个距离可以显示名字

  要是从老远距离就可以拾取道具,那和八百里打死一个鬼子有什么区别!!!所以我们要获取人物的位置,道具本身的位置,当两者距离在300厘米之内时才能拾取道具。这里就要进行分部讲解(新知识)

  如果我们要获取人物位置,那么先要获取人物,因为在游戏内不止我一个人可以看到道具信息(单机游戏除外),所以只需要Get Player Character(获取玩家人物),而不需要在引用FirstPersonCharacter。

  虚幻4线性检测制作过程 随笔 第17张

  Get Player Character本身就包含了不同玩家的相同类型信息,比如位置、身高、速度等,只是信息内容不一致罢了,所以我们不需要再单独引用人物位置,而是创建一个新的事件Get Distance to(达到距离),这个事件其实是获取两个Actor之间的距离,因为这个事件是写在道具蓝图内的,所以在目标处写Self(自己)即可。

虚幻4线性检测制作过程 随笔 第18张

  因为我们是300厘米内才可以拾取道具,所以要从Get Distance to中获取距离,并设定为小于300厘米,给与一个分支事件,并创建一个变量来表明是否可以拾取道具

虚幻4线性检测制作过程 随笔 第19张

虚幻4线性检测制作过程 随笔 第20张

  之后只要基于“可以被拾取”这个布尔变量来添加自定义事件即可,这里就不细写这些。

  4.我们要提醒玩家可否拾取道具(分部讲解)

  我们作为开发者是知道3米内能拾取道具的,可玩家不知道啊,他又不是开发者,所以我们要照顾玩家感受,给他们一个提醒,但不能赤裸裸的告诉他们“3米内才能拿”,那就成了“哄孩子”,所以这里我选择用信息明暗显示来提醒玩家,这也是游戏内常用的套路。我是用道具名称控件内的文字来做明暗显示,不能拾取物品时,物品名称显示为灰色,可以拾取时显示为白色,这里就又要用到Widget,因为它和控件绑定。拖拽Widget到空白,从蓝色节点拖出蓝线并创建Get User Widget Object(获取用户小部件对象),之后再创建“类型转换为 XXX(控件名称)”,因为我们的Widget class选择的是控件类型,所以抓取Widget对象就是抓取控件类,之后在众多控件蓝图中抓取(类型转换)显示道具名称控件,这样就可以调用该控件内的任何事件或是函数。

虚幻4线性检测制作过程 随笔 第21张

  我们需要改变文字颜色,所以要从该控件内(显示名称)获得颜色控制,这就需要我们进入控件本身,为控件内的文字颜色进行事件绑定,或者说是为文字颜色添加控制。

  先选定我们的Text文本框,在控件右侧的详细信息内找到Color and Opacity,这边是文字颜色,右侧有个绑定(可以看看上面的Text属性)点进去后再点击创建绑定就能为颜色添加控制函数接口

虚幻4线性检测制作过程 随笔 第22张

虚幻4线性检测制作过程 随笔 第23张

 

  之后我们就需要控制颜色了,左下角创建变量,名称随意,类型设置为Slate Color(石板颜色),这就是控制颜色的参数了,我们需要控制这个参数。

虚幻4线性检测制作过程 随笔 第24张

  从控件内调用这个变量,并用Slate Color来修改这个变量,未靠近道具,颜色变暗(灰色),靠近颜色变亮(白色)

虚幻4线性检测制作过程 随笔 第25张

  这里我们提醒玩家识别物品是否能拾取的功能就完成了,而整体的聚焦和转移事件就全部完成了。

  然而事儿完成了,但是怎么触发还没有提及,那么这就开始关于人物与道具的交互制作过程

 第六步,创建线性检测。

  线性检测所用到的检测射线其实就是之前创建的Arrow组件,Arrow是跟随FP_Gun的朝向而发射红线,就像装备在枪上的红外线装置一样,设置DrawDebugType为ForOneFrame,我们只需要对这个组件进行碰撞检测即可,在这里我们用到LineTraceByChannel(按频道跟踪),其实就是对地图上某条线进行碰撞检测。

虚幻4线性检测制作过程 随笔 第26张

  Start就是“线”的起始,End就是“线”的末端,Out Hit就是“线”的碰撞,Return Value就是“线”是否碰撞,我们的射线是基于Arrow组件本身,所以起点设置成Arrow本身的起点即可,而末端则是决定道具距离射线起点多少米才会产生碰撞,这里我设置成10米,由于人物本身就是基于世界在移动,那么获取Arrow的起点只需要用到GetWorldLocation(获取世界位置),之后我们要获取终点,也就是从起点沿射线到10米距离上的点,这就用到了GetForwardVector(获取正向向量),这个事件表示的是某物的正前方,对于射线的起点,它的正前方就是这条线所指向的位置,也就完成所谓“沿着这条线”,之后我们乘以1000厘米(虚幻4以厘米为单位),这里就用到3D数学的知识,空间上要获得终点位置(X、Y、Z)就需要用到乘法,之后与起点相加即可得出终点世界位置(起点随人物移动,终点也需要移动,不是相对位置)。(自定义事件_发射射线会在后面用到)

虚幻4线性检测制作过程 随笔 第27张

  第七步,连接碰撞聚焦事件

  因为存在多种碰触,比如碰触天空、其他玩家、道具等等,所以我们要提取指定碰撞来产生我们想要的道具碰撞效果。Break Hit Result(中断命中结果)就负责分化碰撞事件,选择Hit Actor(碰撞演员),因为接口可以直接调用,所以右键创建即可,只有碰撞有效才能触发接口事件,所以前面要做个判断。

虚幻4线性检测制作过程 随笔 第28张

  第八步,连接碰撞转移事件(以下内容的道具我都替换成钥匙了)

   按理说我们在“假”的位置牵引出接口视线转移事件就可以了,但是这样并不会产生任何效果,为什么会这样,首先我们要明白,地面是Actor、墙也是Actor,为什么我们碰触墙和地面不会触发视线聚焦事件,是因为视线聚焦事件是专属于钥匙的(我们将事件写在道具蓝图内),同样视线转移事件也是专属于钥匙的。聚焦还好说,毕竟聚焦钥匙就会触发聚焦事件,但是转移视线的话,我们触发的转移事件就不会是钥匙内部的转移事件,而是比如墙的或者地面内的转移事件(假设我们聚焦在墙或者地面上),又由于墙和地面根本没有聚焦和转移事件,所以不会产生视线转移效果(都不看着钥匙怎么触发钥匙内的转移事件?),钥匙内的转移事件我们永远也触发不了。

虚幻4线性检测制作过程 随笔 第29张

虚幻4线性检测制作过程 随笔 第30张虚幻4线性检测制作过程 随笔 第31张

  既然只有聚焦才能触发Actor内的接口事件,那么对于“假”我们暂时不做任何处理,而是在聚焦的同时进行进一步的判断,前面说过,地面和墙也是Actor,它们与钥匙的区别在于只有钥匙内部写了接口事件,这是不是说明我们也要在其他Actor也写上关于钥匙的接口事件呢?答案是否定的,因为谁会去花大量时间给墙和地面写一堆关于钥匙的事情?它们自己都还有事儿要做啊!!!

  那么除了这个区别外,还存在一个典型区别,就是:钥匙是钥匙、墙是墙、地面是地面,我们聚焦钥匙,就会触发钥匙内的事件,不会去触发地面内的事件对吧?(这就跟身为人要干人事儿一个道理),所以我们要做的是区分我们到底指向的是钥匙还是地面,进一步去思考,指着钥匙和指着地面的区别在哪里?除了东西不一样外还有时间点也不一样,射线只有一条还不会穿透,怎么做到同一时间指着两个东西呢?所以时间就是关键,我们要为线性检测添加Tick事件来让检测过程处于持续状态,同时,如果射线不处于持续状态的话,我们是见不到射线的。之后我们要创建两个变量:前一帧、当前帧,因为这两个变量代表我们指向的Actor对象,所以类型便是Actor对象。

虚幻4线性检测制作过程 随笔 第32张

虚幻4线性检测制作过程 随笔 第33张虚幻4线性检测制作过程 随笔 第34张

 

  接下来我们要做刷新帧操作了,也就是以帧的流逝去记录我们的射线指向,不管游戏开没开始,时间都是流逝着的,即使开始游戏的前一帧我们的射线没有指向任何东西(都不能去指好吧),那也需要给它进行赋值(赋值为Null),我们随着每帧的流逝,当前帧所指向的东西要赋予给前一帧,就像流水一样,我们这一刻在水上放个纸船,下一帧这纸船就会随水流飘到下一位置,之后再将新的东西赋予给当前帧,如同在纸船前往下一帧的时候又往水里放了个树枝一样,这样就完成指向刷新操作。

虚幻4线性检测制作过程 随笔 第35张

  之后就简单的多了,这一帧的“钥匙”和前一帧的“地面”不是一个东西,说明我们的射线指向转移了,进而触发转移事件,那么,这个转移事件为什么不会随指向转移而改变呢?是因为我们执行的是前一帧Actor内的转移事件啊!!!(前一帧不是指着钥匙吗?)还有,不用在意Set Actor Scale3D

虚幻4线性检测制作过程 随笔 第36张

  还有别忘了在“假”那块也连上前一帧的视线转移事件,不然指向非Actor时钥匙提示信息还会显示 。

虚幻4线性检测制作过程 随笔 第37张

  至此,线性检测全部做完,也许是我先做完再写笔记,所以逻辑上是反过来的,不过不影响理解。之后我们可以在视线聚焦那里DIY事件,比如添加个弹窗或者触发机关等,这里要说明一点,如果我们的道具有碰撞事件(Box collision或者Sphere collision)的话,红线的碰撞指向是不会显示出来的,这里需要调整碰撞属性,调整的依据在于Arrow组件的响应属性是Visible,所以碰撞内追溯响应里的Visibility在区块部分画√,其他的随意;很多变量可以不用直接创建,而是将相应变量节点拉出来并提升为变量即可。

虚幻4线性检测制作过程 随笔 第38张

 

虚幻4线性检测制作过程 随笔 第39张

 

 

 

 

 

 

 

 

 

 

  

 

 

  

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄