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

在俯视角游戏中,我们总会碰到一个问题就是,建筑会遮挡住角色的问题。遇到这种问题有多种解决方案,厂商经常使用的一种方案是,如果角色被遮挡,则使用一种纯色或者增加一些菲涅尔的效果来实现
在这里插入图片描述
这种效果我之前在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,就是楼梯这种,需要对鼠标交互的这种产生交互,所以,我们需要在于阻挡玩家角色时,将其的可视性的碰撞通道关闭,这样,它就无法通过点击移动,在正常情况下时,我们需要开启通道。
所以,我们增加一个布尔变量,所有子蓝图可以通过设置此值设置是否需要交互,我们并在时间轴结束时,设置它
在这里插入图片描述
然后在时间轴结束时调用
在这里插入图片描述
楼梯这种,在碰撞时,默认开启,或者在场景的蓝图实例中设置也可以
在这里插入图片描述
如果需要在场景中设置,我们需要将变量的眼睛打开
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 项目整合 MyBatis 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatis 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisTest 五、浏览器测试结果六、…

一文了解什么是车载Tbox

目录 前言一、Tbox是什么呢?二、Tbox架构三、App——TSP——Tbox交互时序图四、汽车混合网关拓扑结构示例五、Tbox功能 前言 强烈建议提前阅读一下这篇文章:车机Tbox介绍 一、Tbox是什么呢? Tbox是汽车上的一个盒子,指的是Telematics BOX&#xff0c…

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol 0. 版本0.1 ERC1967Upgrade.sol 1. 目标合约2. 代码精读2.1 _getImplementation() internal && _upgradeTo(address newImplementation) internal2.2 _upgradeToAndCall(address newImplementation,…

常见反爬及应对

一,特殊混淆的还原 1.1 还原 AAEncode 与 JJEncode AAEncode是一种JavaScript代码混淆算法,利用它,可以将代码转换成 颜文字 表示的JavaScript代码。 去掉代码最后的 (‘‘),这是函数的自调用,去除后就是函数的声明…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验13 静态路由配置错误导致的路由环路问题

一、实验目的 1.验证静态路由配置错误导致的路由环路问题; 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容 1.构建网络拓扑; 2.验证路由环路。 四、实验…

探囊取物之多形式登录页面(基于BootStrap4)

基于BootStrap4的登录页面,支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器,首次加载速度较慢,请耐心等候;演练页面可点击查看源码 预览页面:http://www.daelui.com/#/tigerlair/saas/pr…

【AI提升】如何使用大模型:本机离线和FastAPI服务调用

大模型本身提供的功能,类似于windows中的一个exe小工具,我们可以本机离线调用然后完成具体的功能,但是别的机器需要访问这个exe是不可行的。常见的做法就是用web容器封装起来,提供一个http接口,然后接口在后端调用这个…

electron教程(二)控制应用程序的事件生命周期

1.will-finish-launching 当应用程序完成基础的启动的时候被触发,在 Windows 和 Linux 中, will-finish-launching 事件与 ready 事件是相同的; 在 macOS 中,这个事件相当于 NSApplication 中的 applicationWillFinishLaunching 提示。 app.on(will-fi…

Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了

昨天凌晨,知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想:完全由神经网络驱动的计算机,不再依赖传统的软件代码。 嗯,这是什么意思?全部原生LLM硬件设备的意思吗&#xff1f…

机械设备制造企业MES系统解决方案介绍

机械设备制造行业涵盖了各类工业设备、工程机械、农业机械等多个领域,对生产精度、质量控制和效率提出了较高要求。为了提升生产效率、保证产品质量并满足客户需求,越来越多的机械设备制造企业引入了MES系统。本文将详细介绍MES系统在机械设备制造行业的…

魔镜魔镜,我要变得更漂亮!按需搭配一键叠穿,效果拿下新SOTA!中山大学字节智创数字人团队提出虚拟试穿新框架

魔镜魔镜,我要变得更漂亮!按需搭配一键叠穿,效果拿下新SOTA!中山大学&字节智创数字人团队提出虚拟试穿新框架。 多件衣服按指定穿法一键虚拟试穿! 中山大学&字节智创数字人团队提出了一个名为MMTryon的虚拟试穿框架,可以通过输入多个服装图像及指定穿法的文本指…

COB封装的LED显示屏是什么?

COB(Chip on Board)封装的LED显示屏,是一种采用先进倒装COB封装技术的显示屏,其中LED芯片是直接被安装并封装在PCB电路板上,而不是先对单个封装再焊接至电路板,与SMD(Surface Mount Device&…

怎么快速给他人分享图片?扫描二维码看图的简单做法

现在通过二维码来查看图片是一种很常见的方法,通过二维码来查看图片不仅能够减少对手机存储空间的占用,而且获取图片变得更加方便快捷,只需要扫码就能够查看图片,有利于图片的展现。很多的场景中都有图片二维码的应用,…

2024软件设计师经验贴(一考就过)

2024软件设计师经验贴(一考就过) 第一阶段、基础积累:把书读厚 这一阶段可以跟着视频、书籍或文章进行基础知识的学习。 推荐的视频系列: 「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 40–14.3设计模式 推荐的文…

下载和使用SLUN数据集

1. 下载数据集 网址在https://opendatalab.com/OpenDataLab/lsun/tree/main/raw/scenes 下载bedroom_val_lmdb.zip 然后解压后会又两个文件,一个data.mdb,另一个lock.mdb。 2. 使用torchvison使用LSUN数据集 我把解压后的bedroom_val_lmdb放在/home/…

3.js - 深度测试、深度写入、深度函数

md,艹,这玩意得理解,只看代码不管事 效果图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } …

山东访老友 | 同成建材数字化转型两年前后的巨大变化

山东省济宁市同成建材有限公司(简称“同成建材”)成立于2013年,目前共建有混凝土生产线2条、砂浆生产线1条,是济宁市最早建成的预拌混凝土搅拌站之一。 2020年,同成建材产量增长,市场环境变化,…

Redis的使用(二)redis的命令总结

1.概述 这一小节,我们主要来研究一下redis的五大类型的基本使用,数据类型如下: redis我们接下来看一看这八种类型的基本使用。我们可以在redis的官网查询这些命令:Commands | Docs,同时我们也可以用help 数据类型查看命令的帮助文档。 2. 常…

【漏洞复现】D-Link NAS 未授权RCE漏洞(CVE-2024-3273)

0x01 产品简介 D-Link 网络存储 (NAS)是中国友讯(D-link)公司的一款统一服务路由器。 0x02 漏洞概述 D-Link NAS nas_sharing.cgi接口存在命令执行漏洞,该漏洞存在于“/cgi-bin/nas_sharing.cgi”脚本中,影响其 HTTP GET 请求处…

STM32F1+HAL库+FreeTOTS学习3——任务创建(动态和静态两种)

STM32F1HAL库FreeTOTS学习3——任务创建(动态和静态两种) 任务创建API函数任务创建流程代码实现1. 动态任务创建和删除2. 静态任务创建和删除 上期我们学习了STM32移植FreeRTOS搭建基准工程,现在我们来学习任务创建 任务创建API函数 前面我们…