76. UE5 RPG 实现场景阻挡剔除功能

news2024/11/24 19:42:38

在俯视角游戏中,我们总会碰到一个问题就是,建筑会遮挡住角色的问题。遇到这种问题有多种解决方案,厂商经常使用的一种方案是,如果角色被遮挡,则使用一种纯色或者增加一些菲涅尔的效果来实现
在这里插入图片描述
这种效果我之前在unity内实现过对应的效果,unity urp 实现遮挡显示角色轮廓思路就是获取深度,使用模版测试,获取到被遮挡的区域再重新绘制,这里,我想使用一种新的方式去实现这种,那就是在角色被遮挡时,获取到遮挡角色的模型,将其中间掏空,防止阻挡角色。
这种方案有个弊端就是,游戏模式必须是锁定视角的方案,等实现了,你就明白其中的逻辑。

锁定相机和角色的距离

首先,我们现调解一下相机和角色的距离,它们通过弹簧臂进行链接,如果相机被阻挡,弹簧臂会缩回到不被阻挡的位置,这样就会造成相机靠近角色。我们不想让相机出现这种情况,让相机和角色的距离固定。
实现相机固定,我们需要将可以阻挡相机的建筑的物理设置成忽略
在这里插入图片描述
对于场景中这种立柱类型的,我们将其两个通道都设置为忽略,Visibility主要用于鼠标拾取,我们不需要去拾取柱子
在这里插入图片描述

创建遮挡材质

最重要的就是我们需要一个遮挡后,能够让中心部分不遮挡角色溶解材质,这里我直接实现了一个材质函数。
如果你想创建一个材质函数,可以在材质栏找到
在这里插入图片描述
在材质函数里面,我首先获取到了距离场景中心点的距离,和屏幕中心距离越近,强度就越暗,这里是使用屏幕uv去做的
在这里插入图片描述
为了不让溶解的边缘太过去单调,这里我使用节点生成了一个扰动强度,可以控制扰动的Tilling和移动的速度,这样在溶解的边缘,就可以产生动态的效果,然后增加一个强度,去控制对于中心的值的扰动
在这里插入图片描述
由于Noise生成的值在-1到1之间,所以我们直接将其和距离相加,然后增加一个偏移参数,通过控制偏移的参数来控制溶解的区域
在这里插入图片描述
在材质里面,我们使用MaterialFuntionCall函数,来实现对函数的调用
在这里插入图片描述
在左侧细节这里,可以选择我们需要使用的MaterialFunction
在这里插入图片描述
接着,我们在外部设置它的参数,其实你也可以在函数内部设置,但是项目大了,你不好查找参数到底在哪个Material Function里面
在这里插入图片描述
由于右侧的这些小节点,我是通过添加命令重路由声明节点实现的
在这里插入图片描述
就是基础的PBR
在这里插入图片描述
最终效果预览如下
在这里插入图片描述

创建遮挡蓝图

为了实现这个功能,我们需要在运行时,修改材质的参数,让建筑遮挡角色时,能够溶解掉,这个需要在蓝图内进行逻辑处理。
首先创建一个基于Actor的蓝图类
在这里插入图片描述
将蓝图的帧更新关闭
在这里插入图片描述

在蓝图内增加一个静态网格体组件,并添加一个测试模型
在这里插入图片描述
将模型的碰撞修改掉
在这里插入图片描述

要实现材质的修改,我们的思路是,在构造时,将模型的默认材质存储下来,然后在建筑阻挡角色时,将模型材质替换成溶解材质,运行溶解效果,并在结束时,替换回默认材质节约性能。
材质的性能消耗 半透明 > masked(透明裁剪)> 不透明
我们在蓝图构造阶段,将模型所有的材质都存储为变量,存储数组,因为模型有可能有多个材质实例
在这里插入图片描述
接着,我们创建一个数组,用于存储动态材质实例,首先切换为对象引用
在这里插入图片描述
在右侧切换为数组
在这里插入图片描述
接着,我们需要创建一个溶解材质实例数组,这个数组内存储在阻挡角色时,替换默认的材质时使用的材质。
在这里插入图片描述
在构造函数中,我们首先将模型默认的材质存储下来
在这里插入图片描述
清空动态材质数组,防止多次构造,导致数组内材质过多
在这里插入图片描述
接着使用创建动态材质实例,来生成阻挡时所需的替换材质
在这里插入图片描述
接下来,我们实现一个函数,用来将默认材质替换成动态材质
在这里插入图片描述
然后在事件开始运行时测试效果
在这里插入图片描述
查看效果是否符合预期
在这里插入图片描述
接着,我们创建一个时间轴,实现它的平滑过渡
在这里插入图片描述
我们将创建两个自定义函数用于播放这个时间轴,一个向前播放,一个向后播放,用于修改溶解的强度,如果在时间轴播放完成时,回到了初始位置,我们将模型使用的材质恢复到默认材质
在这里插入图片描述
Reset Material节点就是我们实现的替换默认材质函数
在这里插入图片描述

创建与角色交互遮挡

材质和蓝图我们创建完成了,还有重要的一步,就是模型在遮挡到角色的时候,我们期望它能够溶解,显示角色,在不遮挡的时候,需要使用默认材质去渲染,以减少不必要的性能消耗。
为了实现这个效果,我们需要能够获取到遮挡角色模型,并调用它的FadeIn和FadeOut事件,遮挡实现肯定是通过碰撞检测去实现,对于以后可能会出现多种类型的场景模型蓝图,我们就创建一个专门用于场景溶解的蓝图接口,在碰撞里,将碰撞对象转换为蓝图接口去调用函数。
我们现创建一个蓝图接口
在这里插入图片描述
命名为BI_FadeInterface BI_是蓝图接口的缩写前缀
在这里插入图片描述
在蓝图接口内,我们创建两个函数,继承此接口的蓝图,必须要实现这两个函数
在这里插入图片描述
接着打开蓝图的类设置
在这里插入图片描述
在细节这里,接口项添加上接口
在这里插入图片描述
然后将函数内调用修改为蓝图接口函数调用
在这里插入图片描述
接着打开玩家角色蓝图,我们在角色蓝图的弹簧臂上面添加一个碰撞体
在这里插入图片描述
在这里插入图片描述
为了防止角色挨着墙体时,就触发边缘溶解,我们需要将挂载的碰撞盒子比角色的碰撞胶囊宽度要窄,这个可以通过切换视图查看
在这里插入图片描述
然后修改一个合理的大小
在这里插入图片描述
接下来修改它的碰撞,让其只能够和场景的静态物体产生重叠交互,以减少性能消耗
在这里插入图片描述
注意,它只和世界静态模型产生碰撞交互,所以,我们需要将场景模型设置为静态才可以实现双方的交互
在这里插入图片描述

选中碰撞节点,为其添加一个重叠回调事件
在这里插入图片描述
回调实现就是,判断碰撞对象是否继承了蓝图接口,如果继承,则调用它的FadeOut事件,触发溶解
在这里插入图片描述
如果结束重叠事件,就调用FadeIn
在这里插入图片描述
对于masked的材质,阴影会有问题,我们可以直接关闭其阴影,或者后续使用其它方式解决
在这里插入图片描述
接着测试效果,在柱子后面,会在角色周围显示出角色
在这里插入图片描述
在前方则正常显示
在这里插入图片描述

创建其它溶解蓝图

有了实现的当前蓝图,我们接着再将场景内的巨石的材质修改成它的蓝图子类
在这里插入图片描述
命名这里,我们讲究点,既然是FadeActor,我们以FA_作为前缀,然后以模型的名称作为后缀
在这里插入图片描述
创建完成新的子类蓝图
在这里插入图片描述
进入蓝图,我们首先将它的模型修改掉
在这里插入图片描述

发现它有一个材质
在这里插入图片描述
接着创建一个可以实现遮挡的材质实例
在这里插入图片描述
替换掉蓝图内的参数
在这里插入图片描述
对于复制的位置,我们不需要重新设置一遍,只需要在位置上复制
在这里插入图片描述
然后再点击粘贴
在这里插入图片描述

bug修复

我们发现一个bug,就是楼梯这种,需要对鼠标交互的这种产生交互,所以,我们需要在于阻挡玩家角色时,将其的可视性的碰撞通道关闭,这样,它就无法通过点击移动,在正常情况下时,我们需要开启通道。
所以,我们增加一个布尔变量,所有子蓝图可以通过设置此值设置是否需要交互,我们并在时间轴结束时,设置它
在这里插入图片描述
然后在时间轴结束时调用
在这里插入图片描述
楼梯这种,在碰撞时,默认开启,或者在场景的蓝图实例中设置也可以
在这里插入图片描述
如果需要在场景中设置,我们需要将变量的眼睛打开
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1876445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费使用文心一言会员教程

领取&安装链接:Baidu Comate 领取季卡 有图有真相 原理:百度comate使用文心一言最新的4.0模型。百度comate目前免费使用,可以借助comate达到免费使用4.0模型目的。 如何获得 点击「Baidu Comate 领取季卡 -> 领取权益」&#xff0…

Cesium Model 中的剪裁平面 (ClippingPlane)

Cesium Model 中的剪裁平面 (ClippingPlane) 参考: https://www.cnblogs.com/webgl-angela/p/9197672.html Cesium Model 中的剪裁平面 (ClippingPlane) // 相关类: class ClippingPlaneCollection {} class ClippingPlane {}// 剪裁的整体流程: Model.prototype.update () …

Mathematica训练课(45)-- 一些常用的函数Abs[],Max[]等函数用法

①绝对值函数:Abs[]函数 ②最大值和最小值函数 ③反函数

SAP ATP可用性检查简介

Availability Check,就是可用性检查,指的是要检查一下此物料是否能满足我的需求。 接到一张销售订单(SALES ORDER),客户要求数量为100PC,并且客户要求的出货日期是2024-07-01,此时我们的销售人员肯定会想到底能否出货给客人呢?系统中建立此单时,SAP就会做一个所谓的检…

实验八 T_SQL编程

题目 以电子商务系统数据库ecommerce为例 1、在ecommerce数据库,针对会员表member首先创建一个“呼和浩特地区”会员的视图view_hohhot,然后通过该视图查询来自“呼和浩特”地区的会员信息,用批处理命令语句将问题进行分割,并分…

17859划分准则小结

17859《划分准则》 发布时间:1999.9.13 实施时间:2001.1.1 计算机信息系统安全保护能力的五个等级: 第一级:用户自主保护级 第二级…

Java知识点整理 15 — MyBatis框架

一. 什么是 MyBatis MyBatis 是一款优秀的持久层框架,支持自定义 SQL、存储过程以及高级映射。它免除了几乎所有 JDBC代码以及手动设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(普通老式 Jav…

人脑网络的多层建模与分析

摘要 了解人类大脑的结构及其与功能的关系,对于各种应用至关重要,包括但不限于预防、处理和治疗脑部疾病(如阿尔茨海默病或帕金森病),以及精神疾病(如精神分裂症)的新方法。结构和功能神经影像学方面的最新进展,以及计算机科学等…

决定佛蒙特州版图的关键历史事件:

​决定佛蒙特州版图的关键历史事件: 1. 早期探险与命名: - 1609年,法国探险家萨缪尔德尚普兰(Samuel de Champlain)到达了现在的佛蒙特州区域,并探索了尚普兰湖(Lake Champlain)。他将周围的山…

mwwz库添加对多模板匹配的支持:find_shape_models

多模板匹配的实现只需要对单模板匹配做一些扩展,传入的模板由不同的id表示,在金字塔顶层完成模板的分类,在剩下的金字塔完成对每一类模板的匹配,匹配结果由id标识。测试程序已集成该方法,清除模板后所创建的模板被看作…

Python基于决策树分类模型、支持向量机分类模型、随机森林分类模型和XGBoost分类模型实现月亮数据标签预测项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在探索机器学习算法的性能与适用性时,我们往往需要依赖于精心设计的人工数据集来测试和验证…

全面对标GPT-4 Turbo,讯飞星火V4.0凭什么?

大数据产业创新服务媒体 ——聚焦数据 改变商业 自从ChatGPT爆火出圈之后,大模型就走上了发展的快车道。 一方面,大模型技术快速演进,Sora为我们打开了视频生成的想象空间,各大厂商争相打破大模型的“模态墙”,长文本…

pytest中的极其重要固件(request)的理解

pytest 是一个非常流行的Python测试框架,它为开发人员提供了丰寴的测试工具和功能。 在pytest中,固件(fixture)是一种非常核心的概念,用于设置测试前的预条件,清理测试后的环境,或者提供测试过…

什么是DEQ?

DEQ (Delivered Ex Quay, Duty Paid) 是指目的港码头交货 (……指定目的港)。 这种术语规定卖方在指定目的港码头将货物交给买方处置,并且不办理进口清关手续。 DEQ适用范围 DEQ术语仅适用于海运、内河运输或多式联运,并且在目的港码头卸货时使用。如…

RAG 基本流程及处理技巧 with LangChain

LLM 主要存在两个问题:幻想和缺乏领域知识。领域知识缺乏的原因是因为训练 LLM 本身的知识更新慢,对特定领域的知识也没有太细致的输入。 RAG 主要是解决 LLM 缺乏领域知识的问题。底层的逻辑是:把 LLM 作为逻辑推理引擎,而不是信…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解; 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容 1.构建网络拓扑; 2.根据各网络所指定的地址块完成以下工作&#…

Python 面试【中级】

欢迎莅临我的博客 💝💝💝,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Linux----> tail、cat、more、head、less的用法详解

1.tail命令&#xff1a;用于查看文件的最后几行内容。 基本用法&#xff1a;tail [选项] [文件] 常用选项&#xff1a; -n <行数>&#xff1a;显示最后的 <行数> 行。-f&#xff1a;实时显示文件新增内容&#xff0c;通常用于查看日志文件。 示例&#xff1a;…

程序中的Reduce(CPU和GPU)

前提 最近在看Reduce&#xff08;归约&#xff09;的相关知识和代码&#xff0c;做个总结。这里默认大家已经明白了Reduce的基础概念。 Reduce 根据参考链接一&#xff0c;Recude常见的划分方法有两种&#xff1a; 相邻配对&#xff1a;元素和它们相邻的元素配对 交错配对…

动态人物抠图换背景 MediaPipe

pip下载 MediaPipe pip install mediapipe -i 手部特征点模型包包含一个手掌检测模型和一个手部特征点检测模型。手掌检测模型在输入图片中定位手部&#xff0c;手部特征点检测模型可识别手掌检测模型定义的被剪裁手掌图片上的特定手部特征点。 由于运行手掌检测模型非常耗时&…