当前位置: 首页 > news >正文

Unreal Engine11:触发器和计时器的使用

写在前面

主要是介绍一下触发器和计时器的使用;

一、在Actor中使用触发器

1. 新建一个C++类

  • 创建的C++类也是放在Source文件夹中的Public和Private文件夹中;
  • 选择Actor作为继承的父类;
  • 头文件包括一个触发器和两个静态网格,它们共同组成一个Actor,定义如下:

头文件

  • cpp文件的构造函数实现如下:

函数实现

  • 一些注意的点如下:
    • 触发器的类型是UBoxComponent,也是一种不可见的非网格组件,这里同时设为根组件
    • 由于触发器是不可见的,所以这里的碰撞类型仅设为QueryOnly,也就是仅返回碰撞信息,不发生实际的碰撞;
    • 由于触发器仅针对人物Pawn,因此除Pawn外的都忽略碰撞,仅设置对Pawn的碰撞,又因为是不可见,所以当碰撞发生时用重叠而不是阻挡;

2. 为触发器动态绑定响应事件函数

  • 因为是动态绑定,所以如果是在构造函数中就绑定可能会有一些Bug;
  • 这里推荐是在BeginPlay()中动态绑定响应事件函数到触发器上,如下:

函数实现

  • 其中,OnOverlapBegin()OnOverlapEnd()是两个自定义函数,在头文件的定义如下:

头文件

  • 这两个自定义的函数因为要进行动态绑定,所以一定要声明UFUNCTION()宏;
  • 两个自定义函数的参数列表并不是随便填的,而是要到PrimitiveComponent.h中找它们对应绑定的签名的类型,它们对应的声明如下:

声明

  • 从声明中可以看出,FComponentBeginOverlapSignature是六参数SixParams类型,所以对应的OnOverlapBegin()需要六个参数,也就是声明中的最后的六个参数,把它们复制到参数列表中即可,记得去掉类型和变量之间的逗号;
  • 同样的,FComponentEndOverlapSignature是四参数FourParams类型,所以对应的OnOverlapEnd()需要四个参数,也就是声明中的最后的四个参数,把它们复制到参数列表中即可;

二、构建触发器蓝图类

  • AFloorSwitchC++类派生一个蓝图类;

新建蓝图类

  • 打开蓝图类:
    • 给FloorSwitch和Door组件设置静态网格体;
    • 然后调整它们的相对位置,大致如下:

设置静态网格体

  • 注意,调整位置的时候可以点击左上角的透视,选择不同的视图进行对齐,这样比在三维空间中对齐方便;
  • 最后把这个蓝图类拖到地图中,如下:

放置在地图中

三、实现触发器功能

1. 头文件

  • 在头文件中新增:
    • 门和开关的初始位置成员变量;
    • 升降门、升降开关成员函数;
    • 更新门和开关位置成员函数;

头文件

  • 注意:升降门、升降开关的成员函数均是蓝图实现而非C++实现,宏说明符是BlueprintImplementableEvent

2. cpp实现

  • BeginPlay()中获取门和开关的初始位置,如下:

函数实现

  • 实现动态绑定的响应事件函数,如下:

函数实现

  • 实现更新门和开关的成员函数,如下:

函数实现

3. 蓝图实现

  • 升降门、升降开关的四个成员函数需要在蓝图类中实现;

3.1 时间轴的使用

  • 时间轴可以实现在一段时间内有特定的输出值
  • 在蓝图中右键搜索添加时间轴… 即可添加时间轴气泡到组件中,如下:

时间轴气泡

  • 双击打开时间轴,点击左上角添加浮点型轨迹,并添加关键帧如下:

时间轴

  • 一些注意的点如下:
    • X轴为时间轴,Y轴为输出值轴(这里修改了Y轴的名称为DoorPosition);
    • 在二维网格中右键即可添加关键帧到xxx
    • 点击关键帧的白色菱形点,可以通过输入来修改它的时间(X)值(Y)
    • 长度的值表示输出值的总时间,但可以通过勾选使用最后一个关键帧? 将输出时间截断到最后一个关键帧上;
    • 按住Ctrl键选中两个关键帧,在其中一个关键帧上右键进行关键帧插值平滑两帧之间的直线,也就是平滑输出的值,如下:

平滑直线

  • 同理,开关的时间轴Switch Timeline的设置如下:

时间轴

  • 一些注意的点如下:
    • 之所以是最后输出-20是因为此时开关的网格体正好可以降到地面以下,这也是我们想要得到的效果;
    • 开关网格体向下移动20后的左透视图如下:

开关网格体

3.2 函数的蓝图实现

  • 函数的蓝图实现如下:

蓝图实现

四、实现定时器功能

1. 头文件

  • 头文件增加计时器句柄、关门间隔的时间和控制关门的函数,如下:

头文件

2. cpp实现

  • 在构造函数中初始化关门时间:

函数实现

  • 实现关门函数,如下:

函数实现

  • 修改动态绑定的响应事件函数,如下:

函数实现

  • 一些注意的点如下:
    • OnOverlapEnd()中,也就是Pawn离开触发器后,不是马上就把门和开关复原,而是启动计时器,在间隔一段时间后在调用CloseDoor()函数;
    • CloseDoor()函数中就是调用了将门和开关复原的函数;
    • OnOverlapBegin中,也就是Pawn踏上触发器后,需要将计时器停止而且重置,这样如果之前的计时器还没有计时完成(也就是还没有调用CloseDoor()函数),则不会继续往下计时导致门还会被关上;

五、将Actor放置在地图中

1. 使用地图中的资源

  • 地图中的网格体都是可以被再次使用的;
  • 选中需要的网格体,在世界大纲视图中右键,点击浏览至资源,就可以打开该资源的所在位置;

选中地图中的资源

  • 内容浏览器中选中该资源,然后到细节面板的静态网格体属性中,点击左箭头按键即可选择当前内容浏览器中选中的资源;

复制到静态网格体中

  • 替换网格后的组件还需要重新调整大小、位置和旋转方向,如下:

使用地图中的资源

2. 在地图中移动Actor

  • 在地图中选中Actor,右键->控制xxx,可以很方便地移动Actor;

获得Actor的控制

  • 点击左上角的按钮可以退出Actor的控制视角;
  • 修改Actor细节面板中的变换,把它放到合适的位置,如下:

放置到地图中

  • 一些注意的点如下:

    • 可以在世界大纲视图中选择其中的Actor,效果和在地图中选中是一样的,而且可以快速搜索想要控制的Actor;
    • 可以点击世界大纲视图的左侧眼睛,令地图中的Actor不可见(但在游戏开始时仍然是可见的);
  • 最后把对应的墙删掉,即可完成一个自动门的Actor;

相关文章:

Unreal Engine11:触发器和计时器的使用

写在前面 主要是介绍一下触发器和计时器的使用; 一、在Actor中使用触发器 1. 新建一个C类 创建的C类也是放在Source文件夹中的Public和Private文件夹中;选择Actor作为继承的父类;头文件包括一个触发器和两个静态网格,它们共同…...

Qt之信号槽原理

Qt之信号槽原理 一.概述 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这…...

【MySqL】 表的创建,查看,删除

目录 一.使用Cmd命令执行操作 1.使用( mysql -uroot -p)命令进入数据库 2.创建表之前先要使用数据库 3.创建表之前要先确定表的名称,列名,以及每一列的数据类型及属性 4.创建表 注意: 5.查看所有已创建的表 6.查看单表 …...

Python 字典修改对应的键值

将 key ‘1’ 的值 ‘1’, ‘3’, ‘5’ 字符,修改为 ‘2’, ‘4’, ‘5’ 。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单………...

【JFace】ComboViewer 设置了默认值,但没有效果

问题 在数据回显时,明明在代码中通过comboViewer.setSelection设置了默认值,但没有生效(回显),是怎么回事呢 ? 分析 如果comboViewer.setSelection(new StructuredSelection(items[1]))不起作用&#xf…...

基于Redis的Stream结构作为消息队列,实现异步秒杀下单

文章目录 1 认识消息队列2 基于List实现消息队列3 基于PubSub的消息队列4 基于Stream的消息队列5 基于Stream的消息队列-消费者组6 基于Redis的Stream结构作为消息队列,实现异步秒杀下单 1 认识消息队列 什么是消息队列:字面意思就是存放消息的队列。最…...

ePWM模块-时基模块(2)

ePWM模块(2) 时基模块的使用 TBPRD:周期寄存器 (设置的时钟周期存入此,可通过阴影寄存器缓冲后写入,也可通过活动寄存器立即写入) TBCTR:时基计数变值寄存器 (时基当前所计数的值存入,用于和所设定周期值比较) TBPHS:时基相位寄存器 TBSTS:时基状态寄存器 …...

让GPT对话写小说

## 来自你的消息: 写个小说 ## 来自ChatAI的消息: 很好,我可以为您编写一个小故事。以下是一个短小精干的故事: 《夜行者》 夜,是个寂静而神秘的时间,很多人都选择睡眠。但在这个城市,有一群人——夜行者,他…...

Docker 应用部署-MySQL

一、安装MySQL 1搜索mysql镜像 docker search mysql 2拉取mysql镜像 docker pull mysql:8.0.20 3创建容器 通过下面的命令,创建容器并设置端口映射、目录映射 #在用户名目录下创建mysql目录用于存储mysql数据信息 mkdir /home/mysql cd /home/mysql #创建docker容…...

电容笔哪个厂家的产品比较好?苹果平板的电容笔推荐

从目前来说,这个苹果的正版电容笔,售价真的是太贵了,一支就要接近上千元。事实上,对于那些没有很多预算的人来说,平替电容笔是一个很好的选择。一支苹果电容笔,价格是四支平替电容笔的四倍,但平…...

今年的面试难度有点大....

大家好,最近有不少小伙伴在后台留言,又得准备面试了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约时间&a…...

【PWN · ret2libc】ret2libc2

ret2libc1的略微进阶——存在systemplt但是不存在“/bin/sh”怎么办? 目录 前言 python3 ELF 查看文件信息 strings 查看寻找"/bin/sh" IDA反汇编分析 思路及实现 老规矩,偏移量 offset EXP编写 总结 前言 经过ret2libc1的洗礼&a…...

深度学习01-tensorflow开发环境搭建

文章目录 简介运行硬件cuda和cuddntensorflow安装。tensorflow版本安装Anaconda创建python环境安装tensorflow-gpupycharm配置配置conda环境配置juypternotebook 安装cuda安装cudnn安装blas 云服务器运行云服务器选择pycharm配置代码自动同步远程interpreter 简介 TensorFlow是…...

linux相关操作

1 系统调用 通过strace直接看程序运行过程中的系统调用情况 其中每一行为一个systemcall ,调用write系统调用将内容最终输出。 无论什么编程语言都必须通过系统调用向内核发起请求。 sar查看进程分别在用户模式和内核模式下的运行时间占比情况, ALL显…...

PMP项目管理-[第十章]沟通管理

沟通管理知识体系: 规划沟通管理: 10.1 沟通维度划分 10.2 核心概念 定义:通过沟通活动(如会议和演讲),或以工件的方式(如电子邮件、社交媒体、项目报告或项目文档)等各种可能的方式来发送或接受消息 在项目沟通中,需要…...

13个UI设计软件,一次满足你的UI设计需求

UI设计师的角色是当今互联网时代非常重要的一部分。许多计算机和移动软件都需要UI设计师的参与,这个过程复杂而乏味。这里将与您分享13个UI设计软件,希望帮助您正确选择UI设计软件,节省工作量,创建更多优秀的UI设计作品。 1.即时…...

sentinel介绍

介绍 官网地址 Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源&…...

手把手教你怎么搭建自己的ChatGPT和Midjourney绘图(含源码)

AI程序采用NUXT3LARAVEL9开发(目前版本V1.1.7) 授权方式:三个顶级域名两次更换 1.AI智能对话-对接官方和官方反代(markdown输出)PS:采用百度与自用库检测文字 2.AI绘图-根据关键词绘图-增加dreamStudio绘画-增加mid…...

继承多态经典笔试题

注:visual studio复制当前行粘贴到下一行: CTRLD 杂项 调用子类重写的虚函数(带默认参数),但参数用的是基类的虚函数中的默认参数: 这是由于参数是在编译时压入 试题一 交换两个基类指针指向的对象的vf…...

如何使用Typeface-Helper-自定义字体

随着科技的不断发展,人们对于视觉效果的要求也越来越高。在设计领域中,字体设计是非常重要的一环,因为它直接影响了整个设计的风格和品质。因此,越来越多的设计师开始寻找能够帮助他们自定义字体的工具。在这个过程中,…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...