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.mzph.cn/news/92655.shtml

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

相关文章

【C++】map和set的使用

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT。 Chapter 10 Mining Social-Network Graphs The essential characteristics of a social network are: There is a collection of entities that participate in the network. Typically, these entiti…

JS defineProperty详解

defineProperty Object.defineProperty():方法会在对象上直接定义个新的属性&#xff0c;或者修改现有的属性&#xff0c;并返回此对象 let obj {} //与我们使用 obj.name zhangsna 效果一样 但是用defineProperty定义的属性无法改变 或者删除 Object.defineProperty(obj,n…

MEIS —— 前端部分基本配置

项目基本配置 这篇文章我们随着上一篇文章继续往下叙述&#xff0c;主要是将element和windicss等开发配置进项目中&#xff0c;以及基本的一些页面和组件给他完成。 1. 安装element plus 运行&#xff1a; npm install element-plus --save 这里我们是按需引入(自动)&#x…

flink处理函数--副输出功能

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

基于YOLOv8的安全帽检测系统

1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前YOLO成功基础上&#xff0c;并引入了新功能和改进&#xff0c;以进一步提升性能和灵活…

树的表示——孩子兄弟表示法

从图中可以看出&#xff0c;树的每个结点&#xff0c;都有不确定的指向他们的孩子的节点&#xff0c;如果我们定义这样一个结构体来便是数的结构的话&#xff1a; struct TreeNode { int val; struct TreeNodep1; struct TreeNodep1; … }; 是不能够表示一棵树的&#xff0c;因…

9.25 day 2

1. 简述方法重写与方法重载的意义与区别&#xff1a; 方法重写&#xff1a; 1.参数列表必须完全与被重写方法相同 //参数列表&#xff08;分为四种&#xff09;&#xff1a; &#xff08;1&#xff09;无参无返回值方法&#xff1b; &#xff08;2&#xff09;有参无返回…

“智慧时代的引领者:探索人工智能的无限可能性“

目录 一.背景 二.应用 2.1金融领域 2.2医疗领域 2.3教育领域 三.发展 四.总结: 一.背景 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;&#xff0c;是指通过计算机程序模拟人类智能的一种技术。它是计算机科学、工程学、语言学、哲学等多…

【Redis】redis基本数据类型详解(String、List、Hash、Set、ZSet)

目录 RedisString(字符串)List(列表)Hash(字典)Set(集合)ZSet(有序集合) Redis Redis有5种基本的数据结构&#xff0c;分别为&#xff1a;string&#xff08;字符串&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、hash&#xff08;哈希&a…

音频编辑软件Steinberg SpectraLayers Pro mac中文软件介绍

Steinberg SpectraLayers Pro mac是一款专业的音频编辑软件&#xff0c;旨在帮助音频专业人士进行精细的音频编辑和声音处理。它提供了强大的频谱编辑功能&#xff0c;可以对音频文件进行深入的频谱分析和编辑。 Steinberg SpectraLayers Pro mac软件特点 1. 频谱编辑&#xff…

transformers简介

目录 1、前言 2、网络结构 &#xff08;1&#xff09;、Transformers的总体架构可以分为四部分 &#xff08;2&#xff09;、输入文本包含 &#xff08;3&#xff09;、输出部分包含 &#xff08;4&#xff09;、编码器部分 &#xff08;5&#xff09;、解码器部分 1、前…

SpringBoot 如何解决跨域问题

Spring Boot 中的跨域请求&#xff08;Cross-Origin Request&#xff09;问题与解决方案 跨域请求是指浏览器从一个域名的网页去请求另一个域名的资源&#xff0c;它是为了增强 Web 安全性而产生的限制。Spring Boot 应用程序通常会面临跨域请求的问题&#xff0c;本文将介绍跨…

AWS SAA知识点整理(作成中)

共通 一些信息已经更新了&#xff0c;但参考题的答案还是旧的。 比如&#xff1a; S3的最大读写性能已经提高到 3,500 PUT/COPY/POST/DELETE or 5,500 GET/HEAD requests per second 并且不再要求使用random prefix 题目中有时候会让选择Not violation 不合适的一项&#xff…

AI编程助手 Amazon CodeWhisperer 全面解析与实践

目录 引言Amazon CodeWhisperer简介智能编程助手智能代码建议代码自动补全 提升代码质量代码质量提升安全性检测 支持多平台多语言 用户体验和系统兼容性用户体验文档和学习资源个性化体验系统兼容性 功能全面性和代码质量功能全面性代码生成质量和代码安全性 CodeWhisperer的代…

在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” 的消息。 这是 由于代码执行…

毛玻璃员工卡片悬停效果

效果展示 页面结构组成 通过效果展示图&#xff0c;我们可以看出页面布局比较常规&#xff0c;最核心的就是卡片&#xff0c;当鼠标没有悬停在卡片上时&#xff0c;文字和头像处于半透明状态&#xff0c;当鼠标悬停在卡片上是&#xff0c;底部会展示社交图标。 CSS 知识点 b…

1.物联网射频识别,RFID概念、组成、中间件、标准,全球物品编码——EPC码

1.RFID概念 RFID是Radio Frequency Identification的缩写&#xff0c;又称无线射频识别&#xff0c;是一种通信技术&#xff0c;可通过无线电讯号识别特定目标并读写相关数据&#xff0c;而无需与被识别物体建立机械或光学接触。 RFID&#xff08;Radio Frequency Identificati…

Qt扩展-QCustomPlot 简介及配置

QCustomPlot 简介及配置 一、概述二、安装教程三、帮助文档的集成 一、概述 QCustomPlot是一个用于绘图和数据可视化的Qt 控件。它没有进一步的依赖关系&#xff0c;并且有良好的文档记录。这个绘图库专注于制作好看的、发布质量的2D绘图、图形和图表&#xff0c;以及为实时可…