当前位置: 首页 > 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-自定义字体

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

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...