UE5 虚幻引擎 详解蓝图通信 必备的知识技能之一!!!

目录

  • 0 引言
  • 1 直接蓝图通信
    • 1.1 在关卡蓝图中直接拖拽Actor
    • 1.2 Get Actor of Class/Get All Actors of Class
  • 2 事件分发器
    • 2.1 创建事件分发器
    • 2.2 绑定事件分发器
    • 2.3 调用事件分发器
  • 3 蓝图接口
    • 3.1 使用步骤
    • 3.2 为什么要使用蓝图接口
  • 4 蓝图转换

0 引言

  • 问题:为什么需要掌握蓝图通信?
  • 答案:在开发一个项目时,总是会遇到一个蓝图对象需要获取另一个蓝图对象的属性值或者函数功>能等。例如,在制作一个开关门时,人物蓝图就需要调用门蓝图的一些功能。
  • 蓝图通信的四种方式:直接蓝图通信事件分发器蓝图接口蓝图转换(castTo**)

1 直接蓝图通信

  • 直接蓝图通信其实还有几种方式,下面一一介绍。
  • 缺点:是只能实现一种蓝图和另一种蓝图通信,不能实现一对多的通信方式。

1.1 在关卡蓝图中直接拖拽Actor

  • 这种方式只有在关卡蓝图中才能使用,因为只有关卡蓝图才能直接将本关卡中的Actor直接选中拖入蓝图中,如下图所示:
    在这里插入图片描述
  • 然后可以将两个需要通信的Actor都拖拽到关卡蓝图中,然后进行属性或函数的访问。

1.2 Get Actor of Class/Get All Actors of Class

  • 利用Get Actor of Class(获取类的Actor)或Get All Actors of Class(获取类的所有Actors)这两个节点获得场景中的Actor。
  • 这两个节点的区别是一个获取一个Actor(第一个实例化的Actor),另一个是获取所有实例化的Actor。
  • 案例:两个蓝图,一个是BP_Pawn,一个是BP_Door,BP_Pawn需要调用Door蓝图中的OpenDoor函数,来实现开门的功能。
    在这里插入图片描述

2 事件分发器

  • 事件分发器(Event Dispatchers)可以实现一对多的蓝图通信方式,功能更加强大
  • 其实事件分发器这个功能和MFC的消息/事件机制类似,和QT中的信号槽机制类似。所以学习过类似的编程思想的话,学习这个会更好上手。
  • 使用场景:在一个游戏关卡中,一个BOSS的死亡,往往会触发很多功能,例如,爆装备、打开隐藏机关、人物升级等等。这就是一个事件发生后触发很多其他事件。这个业务就能使用事件分发器来实现。
  • 使用步骤:在BOSS蓝图中创建一个事件分发器(EP_BOSSDead),然后机关蓝图、人物蓝图等其他需要响应BOSS死亡事件的蓝图中,绑定EP_BOSSDead事件分发器。

2.1 创建事件分发器

  • 在BP_BOSS蓝图中创建事件分发器EP_BOSSDead。点击图中的加号即可。
    在这里插入图片描述

2.2 绑定事件分发器

  • 首先通过直接蓝图通信的方式获取BP_BOSS蓝图对象,然后绑定事件分发器。
  • 绑定事件分发器的可以是事件,也可以是函数。(大家可以自己去试试)
    在这里插入图片描述

2.3 调用事件分发器

  • 调用事件分发器,Call ****,即可。事件分发器被调用后,之前和该事件分发器绑定的事件/函数,都会被调用。
    在这里插入图片描述

3 蓝图接口

  • 问题:什么情况需要使用蓝图接口?
  • 答案:当同样的操作,需要不同的响应时,就可以使用蓝图接口(其实概念和C++中的多态一样)。例如,玩家按下键盘E键时,物体会被拾取,NPC会与玩家对话,等等。又或者子弹击中不同目标时响应不同,油桶会爆炸,NPC会死亡等等。

蓝图接口特性

  • 蓝图接口(简称 接口)是一对一通信方式,这点需要注意。
  • 蓝图接口是函数的集合体,只有 函数 名称没有 函数 实现。(其概念和C++中的接口基本一样,C++的接口。C++抽象类是至少有一个纯虚函数即可,还可以有属性值)
  • 和C++中抽象类的区别:子类继承一个蓝图接口后,不重写接口函数,也能实例化(创建对象)。但是C++子类不重写父类的纯虚函数是无法实例化的。
    在这里插入图片描述
  • 蓝图接口通信的前提:①需要有被通信放的引用;②被通信方实现了蓝图接口函数;
  • 从上一点通信前提不难看出,其实蓝图接口通信本质上还是直接蓝图通信,只不过是获取被通信方的引用后调用了蓝图接口函数而已。(所以不知道,为什么虚幻官方要单独将蓝图接口列为一种通信方式,可能比较特殊吧)

3.1 使用步骤

  1. 创建一个蓝图接口,是全局的。名叫(BPI_MyInterface),同时新建一个接口函数OnTakeWeaponFire(只有名称,参数信息,没有函数具体实现)
    在这里插入图片描述

  2. 需要使用蓝图接口的类,在类设置(Class Setting)中继承该接口
    在这里插入图片描述

  3. 编译蓝图后,再重写接口函数。(不编译蓝图的话,找不到接口函数)
    在这里插入图片描述
    在这里插入图片描述

  4. 获取被通信方的引用,然后通过引用调用接口函数(接口函数会出来两种,不要选错了,看下面图片)
    在这里插入图片描述

在这里插入图片描述

3.2 为什么要使用蓝图接口

  • 思考:既然 直接通信蓝图接口 都是要先获取对象的引用再去调用函数,那直接调用类成员函数,和调用类的接口函数有什么区别呢?
  • 解答:方便调用,降低程序耦合。假如使用直接调用类成员函数的方式来通信,在收信方(上面叫做被通信方)做的工作没有区别,都是实现响应函数而已。但是发信方所做的工作就繁琐了,需要知道对象的具体类型。
  • 这个问题的同等于为什么需要多态?
  • 如何实现多态:基类指针指向子类对象,然后调用纯虚函数,实现多态!!!
class animal
{
public:virtual void name() = 0;
};class cat : public animal
{
public:virtual void name(){std::cout << "cat\n";}
private:int a;double b;
};class dog : public animal
{
public:virtual void name(){std::cout << "dog\n";}
};void name(animal* MyNimal)
{// 基类指针指向子类对象,然后调用纯虚函数,实现多态!!!MyNimal->name();
}int main()
{// animal是抽象类,是不能实例化对象的。但是可以抽象类定义指针!!!// 原因:编译器在编译时需要了解类的所有信息以便准确的为要实例化的对象分配内存;//       由此可见,定义一个类对象是要生成一个类的实例的,而C++规定抽象类是不能实例化的。//       但是抽象类指针的内存大小是可以确定的,因为指针都是4个字节。animal* cat1 = new cat();animal* dog1 = new dog();name(cat1);name(dog1);
}

4 蓝图转换

  • Cast To *(类型转换为),其实就是将父类对象类型转换为子类对象类型。因为有些时候获取的并不是具体的子类对象,而是父类对象。
  • 例如Event Hit事件返回的Hit结构体中的Hit Actor变量就是一个父类类型,因为这样设计可以大大降低程序的耦合性,因为谁也不知道以后会有多少种类是集成Actor的,不可能把每一种子类都重写一个函数,这样程序设计效率非常低。
    在这里插入图片描述

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

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

相关文章

图像处理与计算机视觉--第四章-图像滤波与增强-第一部分

目录 1.灰度图亮度调整 2.图像模板匹配 3.图像裁剪处理 4.图像旋转处理 5.图像邻域与数据块处理 学习计算机视觉方向的几条经验: 1.学习计算机视觉一定不能操之过急&#xff0c;不然往往事倍功半&#xff01; 2.静下心来&#xff0c;理解每一个函数/算法的过程和精髓&…

Vue中如何进行图表绘制

Vue中的图表绘制&#xff1a;数据可视化的艺术 数据可视化是现代Web应用程序的重要组成部分之一。Vue.js作为一种流行的JavaScript框架&#xff0c;提供了许多强大的工具和库&#xff0c;用于在前端应用程序中创建各种图表和数据可视化。本文将深入探讨在Vue中进行图表绘制的方…

怒刷LeetCode的第16天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;迭代 方法二&#xff1a;模拟 方法三&#xff1a;循环模拟 方法四&#xff1a;传递 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;回溯 方法二&#xff1a;枚举优化 第三题 题目来源 题目…

差分放大器的精髓:放大差模信号 抑制共模信号

参考如图基本的差分放大电路&#xff0c;在R1R2 R3R4的条件下&#xff0c;其输出与输入的关系为 &#xff1a; 具体推导过程参考&#xff1a;差分运算放大器的放大倍数的计算及结论_正在黑化的KS的博客-CSDN博客 由这个式子我们可以发现&#xff0c;差分放大器放大的是同相端与…

stable diffusion和gpt4-free快速运行

这是一个快速搭建环境并运行的教程 stable diffusion快速运行gpt快速运行 包含已经搭建好的环境和指令&#xff0c;代码等运行所需。安装好系统必备anaconda、conda即可运行。 stable diffusion快速运行 github: AUTOMATIC1111/稳定扩散网络UI&#xff1a;稳定扩散网页用户界…

STL upper_bound和lower_bound函数

声明&#xff1a; 首先包含头文件#include<algorithm> 这里的两个函数所运用的对象必须是非递减的序列&#xff08;也就是数组&#xff0c;数组必须是非递减的&#xff09;&#xff0c;只有这样才可以使用upper_bound和lower_bound这两个函数。 还有一点&#xff0c;就…

(七)Flask之路由转换器

引子&#xff1a; from flask import Flaskapp Flask(__name__)# 通过使用<int>转换器&#xff0c;可以捕获URL中的整数值&#xff0c;并将其作为参数传递给视图函数。 app.route(/index/<int:nid>, methods[GET, POST]) def index(nid):print(nid)return Indexi…

软件测试之Python基础学习

目录 一、Python基础 Python简介、环境搭建及包管理 Python简介 环境搭建 包管理 Python基本语法 缩进(Python有非常严格的要求) 一行多条语句 断行 注释 变量 基本数据类型(6种) 1. 数字Number 2. 字符串String 3. 列表List 4. 元组Tuple 序列相关操作方法 …

黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)

文章目录 1、什么是版本控制2、特点3、发展历史4、SVN和Git比较5、Git6、GitHub7、Gitee&#xff08;国产&#xff09;8、Git的基础命令 1、什么是版本控制 版本控制系统&#xff08; Version Control &#xff09;版本控制是一种管理和跟踪软件开发过程中的代码变化的系统。它…

树莓派4B串口通信配置方式

目录 1树莓派4B的安装&#xff1a; 1.1安装Serial与使用 1.1.1安装serial 1.1.2打开串口 1.2设置硬件串口为GPIO串口&#xff08;修改串口映射关系&#xff09; 1.2.1修改配置文件 2.1minicom串口 2.1.1安装minicom 这篇博客源于&#xff1a;工创赛。需要让树莓派与STM…

JDK11优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析

一、前言 上一期讲了JDK10的一些新特性&#xff0c;需要回顾的朋友们可以去该专栏回顾一下 这一期讲一讲JDK11的一些新功能 二、新增特性 以下是JDK 11的一些新增或变化的特性&#xff1a; 1. 纯字符串类型的 HTTP 客户端: JDK 11 引入了一个新的 HTTP 协议的客户端 API&…

【Java】super 关键字用法

目录 this与super区别 1.访问成员变量-示例代码 继承中构造方法的访问特点 2.访问构造方法-示例代码&#xff1a; 继承中成员方法访问特点 3.访问成员方法-示例代码&#xff1a; super 关键字的用法和 this 关键字相似 this : 代表本类对象的引用super : 代表父类存储空间…

使用 Elastic 输入包自定义你的数据摄取

作者&#xff1a;Ishleen Kaur Elastic 通过集成&#xff08;integrations&#xff09;实现了外部数据源和 Elastic Observability Solution 之间数据流的收集、转换和分析。 集成包通过封装多个组件来实现这一点&#xff0c;包括代理配置 (agent configuration)、数据收集输入…

利用DMA的触发循环实现eTMR的PWM周期计数

利用DMA的触发循环实现对eTMR的PWM周期计数 文章目录 利用DMA的触发循环实现对eTMR的PWM周期计数引言分析问题eTMR的调试模式ModulizationFTM的多次重载事件终极大招-使用触发链 解决问题确认DMAMUX中的eTMR相关触发源eTMR产生触发信号 软件总结参考文献 引言 最近在同客户一起…

Docker学习_镜像和容器篇

简介 Docker是一种容器化的技术&#xff0c;可以实现在一台宿主机电脑上运行多个不同的容器&#xff0c;每个容器之间都相互独立&#xff0c;具有完整的一套文件&#xff0c;网络和端口。 可以将其理解为一种虚拟机技术&#xff0c;只不过和VMware等虚拟化技术不同&#xff0…

【工具】idea 设置自动渲染注释

前言 需求&#xff1a;自动渲染文档注释&#xff0c;看源码更加舒服。 已知 crtl alt Q 可以 设置 尝试搜索 render&#xff0c;发现有启用 “渲染文档注释” 的地方 坐标 &#xff1a; Settings -> Editor-> Appearance

链表经典面试题(五)

求链表的公共结点 1.题目2.详细的图示3.详细注释和代码实现 1.题目 2.详细的图示 3.详细注释和代码实现 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//定义两个表示长度的指针,让它们指向headA和headB//我们暂时无法知道哪…

14:00面试测试岗,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

ElementUI之首页导航+左侧菜单

文章目录 一、Mock.js1.1.什么是Mock.js1.2.安装与配置1.3使用 二、登录注册跳转2.1.在views中添加Register.vue2.2.在Login.vue中的methods中添加gotoRegister方法2.3.在router/index.js中注册路由 三、组件通信&#xff08;总线&#xff09;3.1 在main.js中添加内容3.2.在com…

分布式搜索引擎es-3

文章目录 数据聚合聚合的种类RestAPI实现聚合 自动补全自定义拼音分词器自动补全查询案例&#xff1a;实现酒店搜索框自动补全自动补全的javaAPI实现搜索框自动补全 口述自动补全数据同步集群集群的分布式存储集群分布式查询集群故障转移 数据聚合 什么是聚合&#xff1f; 聚合…