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

news2024/12/25 23:44:04

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

做推箱子的时候需要考虑脸是不是面对着箱子,不是必须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.coloradmin.cn/o/1538450.html

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

相关文章

Etcd Raft 协议(进阶篇)

前言 在正式开始介绍 Raft 协议之间,我们有必要简单介绍一下其相关概念。在分布式系统中,一致性是比较常见的概念,所谓一致性指的是集群中的多个节点在状态上达成一致。在程序和操作系统不会崩溃、硬件不会损坏、服务器不会掉电、网络绝对可靠…

电商系统秒杀二 秒杀场景下如何进行限流

本章学习内容 1、在秒杀页面,客户点击秒杀后,在前台弹出一个验证码,需要用户输入验证码才能往后端发送请求,这样能够错开秒杀下单的时间。 2、通过验证码,对后台下单请求进行保护,防止刷单,即防…

产品推荐 | 基于 Xilinx ZU19/ZU17/ZU11-Zyng Ultrascale+SOM 板卡

一、产品描述 iWare推出基于Xilinx FFVC1760封装的Zynq Ultrascale MPSoC系列SOM板卡,完美兼容ZU19/ZU17/ZU11 EG设备,具备卓越性能,最大内存带宽达64位,搭载8GB PS DDR4 RAM并支持ECC,满足高端应用需求。 二、产品参数…

MySQL主键冲突问题分析处理

目录 背景问题分析分析数据分析代码验证分析结果 原因分析验证MySQL参数解决办法修改MySQL配置参数修改代码 背景 因公司业务及预算调整,系统部署从原有云服务提供商迁移到另外一家云服务提供商,在测试新服务能力的时候,发现应用系统某个功能…

总结: HQL语句

总结: HQL语句 Part1 数据库的操作Part2 数据表的操作1. 创建普通表2. 内外部表3. 内外部表转换 Part1 数据库的操作 查看数据库: show databases; 创建数据库: create database if not exists 数据库名 使用数据库: use 数据库名; 查看数据库详细信息: desc database 数据库名…

通过Anaconda安装Python会得到的重要文件夹

E:\Anaconda\路径下 Scripts 文件夹:该文件夹包含了可执行的Python脚本文件,例如pip和conda等命令行工具。【pip3.exe和django-admin.exe等】Lib 文件夹:该文件夹包含了Python的标准库和其他第三方库的源代码文件。【Lib下面的site-packages…

JVM—内存可见性

什么是可见性 可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JMM) Java内存模型(Java Memory Model)描述了Java程序中各种…

【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

1. 长度最小的子数组 - 力扣(LeetCode) 1.题目解析: 2.算法原理 (1)方法一:暴力列举出所有的子数组的和 时间复杂度:O(n**2):枚举所有子数组O(…

Linux信号处理

Linux信号处理 什么是linux信号 本质是一种通知机制,用户 or 操作系统通过发送一定的信号,通知进程,某些事情已经发生,你可以在后续进行处理。 信号产生是随机的,进程可能正在忙自己的事情,所以&#xf…

【LVGL-按钮按钮矩阵部件】

LVGL-按钮&按钮矩阵部件 ■ LVGL-按钮部件■ 按钮部件: 点击三个按钮一个回调函数修改label值。 ■ LVGL-按钮矩阵部件■ 示例一:按钮换行,和宽度设置。■ 示例二:设置按钮宽度为2倍■ 示例三:获取点击的按钮下标&…

Deep_Learning_readme

本文目录 1.环境安装2. A1-1实验:3. A1-2实验:4. A1-3实验 :**5. A2-CNN实验****6. A3-RNN实验** !!!!!!!!提示:全程路径和环境名字不…

Linux安装Nacos

安装前必要准备 准备Java环境 ,8以上的版本,mysql(集群相关信息),nginx(进行代理) 安装Nacos 首先我们要有一个nacos的包,我们可以在线下载,也可以提前下载好&#xf…

MySQL数据库事务介绍

前言 在MySQL数据库中,事务(Transaction)是指一组SQL语句的执行序列,这些SQL语句要么全部执行成功,要么全部执行失败,保证数据库的一致性和完整性;用于操作量大、复杂度高的数据。 目录 一、…

Ubuntu 22.04安装Python3.10.13

Ubuntu最好设置为英文,我之前用中文在make的test的时候,总是会有fail。 查了下有人怀疑是language的问题,保险起见都用英文,个人实践也证明改为英文就不报错了。 issue 44031: test_embed and test_tabnanny fails if the curre…

【史上最全面arduino esp32教程】ESP32Time时间库

文章目录 前言一、安装ESP32Time库二、ESP32Time使用2.1 基础使用构造ESP32Time对象设置当前时间获取当前时间结构体 2.2 其他函数 总结 前言 欢迎来到这篇Arduino ESP32教程!在本教程中,我们将介绍ESP32Time时间库的使用。时间在许多项目中起着重要的作…

IPC网络摄像头媒体视屏流MI_VIF结构体

一个典型的IPC数据流 下图是一个典型的IPC数据流模型,流动过程如下: 1. 建立Vif->Vpe->Venc的绑定关系; 2. Sensor 将数据送入vif处理; 3. Vif 将处理后的数据写入Output Port申请的内存,送入下一级;…

docker 不同架构镜像融合问题解决

1、背景 docker 作为目前容器的标准之一,但是对于多种架构的平台的混合编译支撑不是很好。因此衍生了镜像融合,分别将多种不同的架构构建好,然后将镜像进行融合上传。拉取镜像的会根据当前系统的架构拉取不同的镜像,也可以通过 -…

Redis 不再“开源”,对中国的影响及应对方案

Redis 不再“开源”,使用双许可证 3 月 20 号,Redis 的 CEO Rowan Trollope 在官网上宣布了《Redis 采用双源许可证》的消息。他表示,今后 Redis 的所有新版本都将使用开源代码可用的许可证,不再使用 BSD 协议,而是采用…

深入理解HTTP协议本质与应用

教程介绍 HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。简单来说,如果你不懂HTTP协议,那就相当于是个只有“半桶水”的程序员。在这个课程中,带你一起花最少的时间,用最少的精力…

前端学习笔记 | Node.js

一、Node.js入门 1、什么是Node.js 定义:是跨平台JS运行环境(可以独立执行JS的环境)作用: 编写数据接口,提供网页资源功能等等前端工程化:为后续学Vue和React等框架做铺垫 2、Node.js为何能执行JS&#xff…