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

本文主要是介绍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实现)
虚幻引擎图文笔记:如何实现角色推箱子(使用碰撞实现的初级版)

这篇关于UE5制作推箱子动作时获取物体与角色朝向的角度及跨蓝图修改变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838255

相关文章

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提