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

news2024/11/28 9:23:16

目录

  • 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.coloradmin.cn/o/1055678.html

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

相关文章

优雅的写Controller 层代码这样写才可以

前 言 本篇主要要介绍的就是controller层的处理&#xff0c;一个完整的后端请求由4部分组成&#xff1a; 接口地址(也就是URL地址)请求方式(一般就是get、set&#xff0c;当然还有put、delete)请求数据(request&#xff0c;有head跟body)响应数据(response) 本篇将解决以下3个…

DHCP服务器原理

DHCP (Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议) Linux系统DHCP服务配置文件为 /etc/dhcpd.conf DHCP租约过程 DHCP租约过程就是DHCP客户机动态获取IP地址的过程。 DHCP租约过程分为4步: •客户机请求IP(客户机发DHCPDISCOVER广播包)&#xff1b;…

Electron 惊现十级漏洞,到底谁的锅?

最近开源软件又爆出一个十级漏洞,该漏洞冲击范围巨大,涉及数百万不同的应用程序,其中也包括 iOS、Android 应用程序以及使用 Electron 构建的跨平台应用程序。 这个漏洞两周前就已经被苹果和谷歌发现,但苹果和谷歌在披露漏洞时缺乏关键信息,造成了“巨大的盲点”,导致全…

ASUS华硕飞行堡垒5笔记本FX504GM_FX80GM原装出厂Windows10系统

系统自带所有驱动、出厂主题壁纸、系统属性华硕专属LOGO标志、Office办公软件、MyASUS华硕电脑管家等预装程序 下载链接&#xff1a;https://pan.baidu.com/s/1C8vPvqiwqoUY3PxC915LXg?pwdv079

1、手把手教你学会使用 FlinkSQL客户端

目录 1、FlinkSQL客户端的功能 2、FlinkSQL客户端启动参数配置 2.1 基本语法 2.2 相关参数([MODE])&#xff1a; 2.3 相关参数(embedded [OPTIONS])&#xff1a; 3、启动Flink的sql-client 3.1 启动时使用初始化脚本 3.2 启动时指定依赖的jar包 3.3 基于yarn-session模…

28391-2012 建筑施工机械与设备 人力移动式液压动力站

声明 本文是学习GB-T 28391-2012 建筑施工机械与设备 人力移动式液压动力站. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了人力移动式液压动力站(以下简称动力站)的范围、分类、要求、试验方法和检验规则。 本标准适用于以中小…

在pycharm中弹出图后,需要关闭才会显示Process finished with exit code 0

在pycharm中弹出图后&#xff0c;需要关闭才会显示Process finished with exit code 0 在PyCharm中&#xff0c;当你运行一个Python程序并弹出一个图形窗口时&#xff0c;程序会等到图形窗口关闭后才会显示 “Process finished with exit code 0” 的消息。 这是 由于代码执行…

【Java 进阶篇】JDBC(Java Database Connectivity)详解

JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 中用于连接和操作数据库的标准 API。它允许 Java 应用程序与不同类型的数据库进行交互&#xff0c;执行查询、插入、更新和删除等操作。本文将详细介绍 JDBC 的各个类及其用法&#xff0c;以帮助您更好地理解和…

Vue.js3学习篇--Vue模板应用

目录 一,模板基础 1.模板插值 &#xff08;1&#xff09;基础插值 &#xff08;2&#xff09;HTML代码插值 &#xff08;3&#xff09;标签属性插值 2.模板指令 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;指令参数 二.条件渲染 1.使用v-if指令渲染 2.使…

采集SEO方法-添加链接段落

采集大量的文章数据&#xff0c;要想批量做SEO添加链接段落方法&#xff0c;可以使用简数采集器的处理规则实现。 简数采集器的一个处理规则&#xff0c;可以包含多种SEO方法&#xff0c;还可自由组合&#xff0c;强大灵活方便。 添加补充链接段落的SEO技巧&#xff1a; 1&a…

vue2与vue3 v-model的区别

目录 Vue 2中的v-model 默认使用 自定义使用 修饰符.sync (Vue2) Vue3.x 使用 v-model vue 3 的v-model使用原理 多个 v-model 使用 总结 Vue 2中的v-model 在Vue 2中&#xff0c;v-model是一个用于在子组件和父组件之间双向绑定数据的指令。当在子组件中使用v-mode…

【数据结构】AVL树(C++实现)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【数据…

性格敏感怎么办?改变性格敏感的方法有哪些?

有这么一群人&#xff0c;他们的情绪很容易受到外界的影响&#xff0c;就像一汪宁静的湖水&#xff0c;被风轻易地吹出皱纹。他们有着高度敏感的神经&#xff0c;外界稍微一点风吹草动&#xff0c;就会牵动他们紧张的情绪。 他们的思维就像脱缰的野马&#xff0c;生活中任何一…

String 进阶

字符串拼接 // 常量与常量的拼接结果放在常量池 // 常量池中不会存在相同的常量 String str1 "a" "b"; System.out.println(str1 "ab");// 拼接时有一个为变量&#xff0c;则结果会放在堆中。 // 变量拼接的原理是 StringBuilder append 最后…

C++代码示例:进制数简单生成工具

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;编译和运行命令结果总结参考资料作者的话 前言 C代码示例&#xff1a;进制数简单生成工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) …

VSCode 在部分 Linux 设备上终端和文本编辑器显示文本不正常的解决方法

部分Linux设备上运行VSCode时&#xff0c;发现文本编辑器的缩放不明显&#xff0c;终端字体间距过大等。 这里以Kali Linux为例&#xff0c;其他Linux发行版请选择对应的系统内置的等宽字体 我们依次打开 设置 -> 外观 -> 字体 这里我们可以发现&#xff0c;Kali Linux默…

华为云云耀云服务器L实例评测|Elasticsearch的可视化Kibana工具安装 IK分词器的安装和使用

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍Elasticsearch的可视化Kibana工具安装&#xff0c;以及IK分词器的安装和使用。 其他相关的Elasticsea…

为什么需要工业物联网 (IIoT)?如何实施?

制造业数字化、网络化、智能化已经是大势所趋。这些特性都在改变着制造业的格局&#xff0c;进而影响着我们生活和工作的方式。工业物联网作为一种利用传感器、云计算、大数据和人工智能等技术&#xff0c;实现了工业设备、流程和服务的智能化&#xff0c;正逐渐成为制造业的发…

【U8+】查看余额表只有科目,没有借贷方发生额以及余额。

【问题描述】 使用用友U8时&#xff0c; 查询发生额及余额表过程中&#xff0c; 打开报表后&#xff0c;只有科目列&#xff0c;所有金额列都没有。 并且点击【还原列宽】没有没有任何反应&#xff1b;点击【栏目】后&#xff0c;发现栏目设置中全部为空。 【解决方法】 跟踪…

转转闲鱼交易猫链接源码搭建 独立后台

转转交易猫闲鱼后台源码&#xff0c;功能强大包含了多种模板和功能等等 后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库账号 不会可以看源码里有教程 下载源码&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3