UE5制作推箱子动作时获取物体与角色朝向的角度及跨蓝图修改变量

就是脑残死磕,你们如果有更好的方法一定要留言啊~~独乐乐不如众乐乐。

做推箱子的时候需要考虑脸是不是面对着箱子,不是必须90度,可以有一个-45~45度的范围。

在这里插入图片描述

摸索了一下,有几种做法和几个小白坑,这里列出来。

一、准备工作(实现跨蓝图修改变量)

  1. 准备一个名为LightRobot的玩家蓝图(pawn)
    就用正常的配置操作即可,我这里写明LightRobot是为了方便与截图中的名称一一对应。
    在这里插入图片描述

  2. 准备一个名为BP_Box的角色蓝图(actor),其中放入Cube立方体组件和Box盒体碰撞组件。
    Box的四周比Cube大一点,底顶比Cube小一点。
    在这里插入图片描述

注意: 需要将Box作为Cube的子级,否则Cube移动后,Box并不会跟随移动,下次想要推就没法激活了。
同理: DefaultSceneRoot不会随着Cube移动,因为它是根,是Cube的父级,而父级不会跟随子级移动。
这点很重要哦,搞错的话将无法获取正确的位置。

在这里插入图片描述

  1. 准备一个动画蓝图LightRobot_ABP,其中放入一个变量isPush来确定是否激活推动动画
    动画部分不在本文展开。
    在这里插入图片描述

  2. 使用重叠事件来更改LightRobot_ABPisPush的值
    这个流程人物只要走到箱子附近就会释放推动动画,哪怕人物是背对着箱子的。
    在这里插入图片描述

两个知识点和流程

知识点:

  • 跨蓝图修改需要用Castto...节点,翻译为类型转换为~~(明明是施法-_-!);
  • 要读取动画蓝图则需要先获取动画实例

流程:
(1) 重叠事件发生,于是从一堆Other Actor碰撞到的物体中Cast to BP_LightRobot找到玩家蓝图;
(2) 再Get Mesh找到该玩家蓝图下的网格体;
(3) 这个网格体下有动画,于是Get Anim Instance获取动画实例;
(4) 在用Cast To LightRobot_ABP 从一堆动画中找到玩家用的动画蓝图;
(5) 最后Set isPush设置变量。

下面的图片是从玩家蓝图中找到动画蓝图的顺序,看完是不是就清楚上面的流程了?
在这里插入图片描述

这些准备好后,现在开始正式判断角度。

一、根据位置判断

基本原理:

  1. 获得箱子的位置和玩家的位置,计算得到一个人到箱子的向量A;
  2. 获得玩家脸朝向的向量,其实就是前进的向量B;
  3. 计算得出A和B之间的夹角

不过这种方法并不精准哦,毕竟站在箱子边缘和站在箱子中间,本身就会产生角度,当然如果箱子不那么大,也够用了。

1. 通过Cube的相对位置来实现

我之前说过,在BP_Box蓝图中,Cube是能动的,可根self是不会移动的,需要通过Get Relactive Location来获得Cube相对DefaultSceneRoot的位置。

在这里插入图片描述

这里的点积Dot Product和反余弦Acos(Dgrees)只要知道是比较两个向量后再换算成角度

2. 将Cube设置为根级来实现

这里直接调用Cube的位置,但是必须要将Cube作为根替换掉原来的DefaultSceneRoot,道理是一样的,因为根DefaultSceneRoot不会跟随子级Cube移动,那么当第一次重叠时能获得正确的角度,而第二次重叠时虽然箱子已经移动过位置了,但箱子的根位置还在原来的地方,于是就出错了。
在这里插入图片描述

二、根据射线判断

上面的方法是根据角色到物体的方向角色前进方向来算出两个方向的夹角是否满足面对物体的要求。
但这个方法在遇到小物体是没问题,但遇到一个很大的物体时,就会出错了——当你站在物体边缘,这时候两个方向的角度已经很大了,就更不用提脸的朝向了。

然后就找到了真正的解决办法~~,应该也是真正常用的办法:“胸口射线法”,学会了这个方法基本可以解决90%以上的碰撞问题了;
简单来说就是:

  1. 当组件重叠事件激活时,从玩家胸口射出一根有指定方向和距离的射线;
  2. 当这个射线击中某个可以碰撞的物体时检测是否符合要求,符合则为真;
  3. 本例中因为触发盒体碰撞的范围离箱子很近,那么射线的第一个遇到的目标肯定是盒体,所以就为真了;
  4. 本例中的射线长度为1500,目的是为了测试时能看清射线,实际运行时是有问题的,因为你斜着箱子站的时候,射线虽然没有击中箱子,但可能击中更远的墙了,那么也会判定命中为真,所以射线长度设个50、100短一点的就行了。
  5. 注意Ignore Self需要去掉勾,因为打勾意味着忽略触发射线的Actor,也就是说射线投射将不会与触发该投射的Actor产生碰撞。
    由于我们是重叠时才会激活这个射线,重叠的前提就是玩家与箱子共同参与这个触发,如果此刻Ignore Self为真的话,那么射线就会忽略掉箱子,直接穿到后面去了。
    网上很多案例的情况与本文不同,他们并不涉及重叠事件,因此Ignore Self为真是没问题的,这点需要注意。

在这里插入图片描述

主要是理解LineTraceByChannel按通道进行线条追踪的用法:

  • start开始值为玩家的当前位置(向量);
  • End结束值为玩家面对的方向多n个距离的位置(向量);

1. 根据世界坐标射出射线

在这里插入图片描述

2.根据角色坐标射出射线

在本例中用这个方法也没问题,反正就是胸口射出射线么,用这个还不需要查询根组件,效率更高一点。
在这里插入图片描述

也可以把其中向前的向量直接简写为如下

在这里插入图片描述

小知识:
乘法默认情况下两个乘数的单位是相同的,但是你可以选中其中一个数右键菜单更改其单位。

在这里插入图片描述

参考:
Using a Single Line Trace (Raycast) by Channel
虚幻引擎图文笔记:如何实现角色推箱子(使用Line Trace By Channel实现)
虚幻引擎图文笔记:如何实现角色推箱子(使用碰撞实现的初级版)

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

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

相关文章

mysql 索引原理为什么用b+树而不用二叉树

在数据库中,索引是一种数据结构,它能够快速定位到存储在数据库表中特定行的数据。MySQL等数据库管理系统通常使用B树作为索引的数据结构,而不使用二叉树,主要基于以下几个原因: 高度平衡:B树是一种多路搜索…

软件推荐 篇三十七:开源免费无广告的在线音乐免费播放 | MusicFree纯净无广告体验-小众冷门推荐

引言 自从QQ音乐没了杰伦、某云开始收费,除了各种广告弹窗导致电脑卡的要死,打工人就靠这点音乐背景熬夜了,木有办法,得有个开源免费的听歌软件吧,一搜github,软件一大堆,作为一个打工仔&#…

【前端寻宝之路】学习和总结HTML表格的实现和合并

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IWDj0gWiFt6IMq3x {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

GraphPad Prism 10:一站式数据分析解决方案

GraphPad Prism 10是一款功能强大的数据分析和可视化软件,广泛应用于生命科学研究、医学、生物、化学等多个领域。以下是对其详细功能的介绍: 首先,GraphPad Prism 10具有出色的数据可视化功能。它支持各种类型的图表和图形,包括…

解决arco-design下拉框回显id的问题

问题描述 下拉框回显选项中没有的选项,就会出现以下情况,只能把uid回显上去 解决方案 使用ui框架自带的属性fallback-option 用法 按以上操作,即可解决选择框回显uid问题

论文阅读:机器人跑酷学习

项目开源地址:https://github.com/ZiwenZhuang/parkour 摘要: 跑酷对腿部机动性是一项巨大的挑战,要求机器人在复杂环境中快速克服各种障碍。现有方法可以生成多样化但盲目的机动技能,或者是基于视觉但专门化的技能,…

代码随想录笔记|C++数据结构与算法学习笔记-二叉树(一)|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

全文基于代码随想录及相关讲解视频。 文字链接:《代码随想录》 文章目录 二叉树的递归遍历二叉树的前序遍历C代码如下 二叉树的中序遍历二叉树的后序遍历 二叉树的迭代遍历前序遍历前序遍历C代码 右序遍历右序遍历C代码 中序遍历为什么中序遍历不同中序遍历迭代法的…

FEX-Emu在Debian/Ubuntu系统使用

FEX-Emu在Debian/Ubuntu系统使用 1. Debootstrap子系统安装(可选)2. Debian/Ubuntu依赖包安装3. 获取FEX-Emu源码并编译4. 根文件系统RootFS安装5. 基于 FEX-Emu 运行应用 1. Debootstrap子系统安装(可选) sudo apt-get install …

如何让电脑定时开机?这个方法你一定要学会

前言 前段时间小白在上班的时候,个人使用一台台式机和一台笔记本电脑。台式机并不是经常使用,但整个公司的数据中心是建立在小白所使用的那台台式机上。 如果台式机没有开机,同事们就没办法访问数据中心获取自己想要的资料。领导也没办法链…

C#、.NET版本、Visual Studio版本对应关系及Visual Studio老版本离线包下载地址

0、写这篇文章的目的 由于电脑的环境不同,对于一个老电脑找到一个适配的vscode环境十分不易。总结一下C#、.NET、Visual Studio版本的对应关系,及各个版本Visual Studio的下载地址供大家参考 1、C#、.NET版本、Visual Studio版本对应关系如下 2、Visua…

李国武:如何评估一家精益制造咨询公司的实施能力?

在制造业转型升级的大背景下,精益制造已成为企业提升竞争力、实现可持续发展的关键。然而,面对市场上众多的精益制造咨询公司,如何评估其实施能力成为了众多企业的难题。本文将从多个方面为大家揭示评估精益制造咨询公司实施能力的方法&#…

MySQL数据库的索引

目录 1、索引的概念 2、索引的作用 优点 缺点 3、创建索引的原则依据 4、索引的分类和创建 ​编辑 4.1普通索引 直接创建索引 修改表方式创建索引 创建表时添加索引 删除索引 4.2唯一索引 直接创建唯一索引 修改表方式创建 创建表时指定索引 4.3主键索引&…

Lamdba表达式

Lamdba表达式 Lambda是一个匿名函数,我们可以将Lambda表达式理解为一段可以传递的代码(将代码像数据一样 传递)。使用它可以写出简洁、灵活的代码。作为一种更紧凑的代码风格,使java语言表达能力得到提 升。 Lambda表达式在java语…

Android Kotlin(六)协程的并发问题

书接上回:Android Kotlin知识汇总(三)Kotlin 协程 协程的并发问题 在一个协程中,循环创建10个子协程且单独运行各自Default线程中,并让每个子协程对变量 i 进行1000次自增操作。示例如下: fun main() …

Golang基础知识(笔记迁移)

golang 变量作用域 局部作用域:代码块、函数内的全局作用域:顶层作用域,代码块外的就是全局,如果变量名大写,则改变量整个程序都可以使用。 类型断言 golang的类型断言在变量后加上.(type),如果类型断言…

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制,包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏,非待机,并黑屏后点击触摸屏可以唤醒屏幕,可以借助 xrandr 命令来实现。 首先,…

比一比gitee、gitlab、github

gitee、gitlab、github,哪个是目前国内大型公司使用最多的呢?共同点:三者都是基于git的代码托管工具,都支持版本管理。 gitee:适合国内开发者,更友好的本地化服务,形成了一个适合中国宝宝学习的…

计算机网络:分层体系结构

计算机网络:分层体系结构 基本分层概述各层次的任务物理层数据链路层网络层运输层应用层 数据传递过程分层体系常见概念实体协议服务 基本分层概述 为了使不同体系结构的计算机网络都能互联,国际标准化组织于 1977 年成立了专门机构研究该问题。不久他们…

【C++】1597. 买文具

问题:1597. 买文具 类型:基本运算、整数运算 题目描述: 花花去文具店买了 1 支笔和 1块橡皮,已知笔 x 元/ 支,橡皮 y元 / 块,花花付给了老板 n 元,请问老板应该找给花花多少钱? 输…

pycharm安装插件

pycharm安装插件显示网络错误/无法安装 输入以下网址 https://plugins.jetbrains.com/ 然后重启pycharm就可以安装软件了