UE5 关于获取引用和获取引用消息

UE5(Unreal Engine 5)中,获取引用(Get Reference)和获取引用消息(Get Reference Message)通常是在处理对象、蓝图通信或数据流时涉及的概念。尽管这两个术语听起来相似,但它们在实际应用中有不同的含义。下面是对这两个概念的详细解释:

区别

1. 获取引用(Get Reference)

“获取引用”指的是获取一个对象或变量的引用,即指向该对象的指针或引用。通过引用,蓝图或C++代码可以直接访问该对象或变量,修改其属性或调用其方法。

  • 引用是一个指向对象的指针或内存地址,而不是对象本身。通过引用,你能够访问该对象,并且对其进行修改时会影响到原始对象。

  • UE5 中,引用经常用于:

    • 获取其他对象或组件:比如,你可以通过 Get Actor ReferenceGet Component Reference 或 Get Object Reference 来获取场景中的其他 Actor 或组件。
    • 调用函数或修改属性:当你有了对象的引用,就可以对其进行属性修改或调用该对象的方法。

    例子

    • 假设你有一个 Actor 对象,使用 Get Reference 操作将其引用存储到一个变量中,这样你就可以随时访问或修改该 Actor 的属性。
  • 使用场景

    • 获取场景中的其他 Actor 或组件的引用,以便执行交互、更新状态等。
    • 在蓝图中,你可以通过 Get Reference 获取角色、敌人、UI 元素等对象的引用。

2. 获取引用消息(Get Reference Message)

“获取引用消息”是指在 UE5 蓝图或代码中,通过消息传递的方式从一个对象或系统获取引用。这通常用于解耦对象之间的直接依赖,使用消息机制来传递引用,而不是直接通过引用访问对象。

  • 消息机制是蓝图或对象之间的一种间接通信方式,通常通过事件、委托或消息传递的形式。与直接获取引用不同,获取引用消息的方式让对象之间的关系更为松耦合,通常用于系统间的通信而不是直接引用。

  • 获取引用消息的过程通常涉及某些事件或触发器,这些事件或触发器会发送消息来通知接收者对象或数据的引用。这种方法不直接访问对象,而是通过一个消息系统传递数据或引用。

  • 使用场景

    • 事件驱动:在事件驱动系统中,一个对象会触发事件或消息,通知其他对象获取它的引用。
    • 松耦合设计:通过消息系统,多个系统或对象之间可以在不直接依赖的情况下进行交互,从而提高系统的灵活性。

区别总结:

特性获取引用(Get Reference)获取引用消息(Get Reference Message)
访问方式直接通过引用(指针)访问对象或变量通过消息机制间接获取对象或变量的引用
对象间耦合通常有较强的直接依赖或耦合通过事件或消息机制实现松耦合,解耦对象之间的直接引用关系
用途获取场景中其他对象、组件的引用,直接操作对象属性或方法使用消息通知其他系统或对象获取某个对象的引用,通常用于事件驱动系统
适用场景需要直接操作或修改其他对象时,例如获取其他 Actor 的引用多系统间的交互,减少系统之间的依赖,常见于事件驱动架构或广播机制

举个例子:

  1. 获取引用

    • 你可能会在一个蓝图中通过 Get Actor Reference 获取一个敌人角色的引用,并通过该引用修改敌人的健康值或执行某个函数。
  2. 获取引用消息

    • 另一个例子是,你的游戏中有一个系统负责广播消息,告诉其他对象该被攻击。在这种情况下,敌人可能通过监听某个消息,接收到这个事件后,获取自己的引用,并处理攻击逻辑。这里的“获取引用消息”是通过事件通知的,而不是直接访问对象。

总结:

  • 获取引用是指直接获取对象或变量的引用,通常用于直接操作该对象或调用其函数。
  • 获取引用消息是一种间接的方式,通过消息或事件通知其他对象或系统获取某个对象的引用,通常用于松耦合和事件驱动的交互方式。

各自的优点

1. 获取引用(Get Reference)的好处

获取引用的方式让你直接持有对象的引用,通过它可以立即访问或操作目标对象。它的主要优点包括:

直接性与效率:
  • 直接访问与操作:获取引用后,能直接对目标对象进行操作,修改属性或调用函数。这种方式通常比较高效,尤其是在需要频繁与目标对象交互的情况下。
  • 简洁性:获取引用后的操作直接而简单,不需要额外的消息传递或事件系统,适合那些逻辑简单、交互频繁的场景。
可控性:
  • 灵活性与可控性:通过直接引用,你能够对目标对象的状态进行完全控制。你可以随时访问其属性、调用方法,甚至修改其生命周期(如销毁对象)。
  • 减少抽象层级:直接获取引用意味着你不需要依赖于其他系统的消息通知或事件驱动,逻辑上更加直观清晰。
适用场景:
  • 当对象之间的交互是 同步 和 直接 的,比如获取并修改一个角色的状态(例如血量、位置等)。
  • 当需要与 具体的对象 频繁交互或操作时,比如游戏中的玩家角色、敌人、武器、UI 元素等。
举例:
  • 在一个射击游戏中,玩家获取敌人的引用后,可以立即操作敌人的属性(例如减少血量、触发死亡动画等)。这是一个经典的获取引用的场景。

2. 获取引用消息(Get Reference Message)的好处

获取引用消息使用的是一种间接的通信方式,通常基于事件驱动或消息传递系统。它的好处主要体现在松耦合灵活性方面,适合更复杂的系统或需要多个模块交互的情况。

松耦合与可扩展性:
  • 解耦对象间的关系:通过消息传递系统,发送方与接收方不需要直接知道对方的具体实现细节。这种设计使得系统模块之间的耦合度较低,降低了代码间的依赖,提升了系统的灵活性和可维护性。
  • 更好的扩展性:当你使用消息传递系统时,你可以很容易地添加新的消息处理方式或者改变现有的交互方式,而不需要修改其他模块的代码。例如,新增一个监听事件的系统来处理消息,而不必修改发送消息的对象。
异步与解耦:
  • 异步处理:消息传递通常支持异步处理。发送方可以在发送消息后继续执行,而接收方可以在合适的时机处理消息。这种异步方式尤其适合于需要处理多个任务的复杂系统。
  • 事件驱动:在事件驱动的架构中,通过消息来通知其他对象进行某种操作。这使得对象之间的交互更加灵活,减少了直接调用导致的依赖性。
适用场景:
  • 复杂系统间的通信:在多模块或多系统之间通信时,使用消息传递比直接引用更为适合。比如,一个游戏中的多个系统(例如物理系统、动画系统、UI 系统)可能需要知道某些事件的发生,但不必直接依赖于彼此。
  • 广播与通知:当一个事件或状态的变化需要通知多个接收者时(例如玩家死亡、任务完成、敌人生成等),消息传递是一个更好的选择。
  • 动态的游戏机制:当你需要支持动态创建和销毁对象,或多个对象之间的互动关系是动态变化的,消息传递可以使得系统更加灵活和易于扩展。
举例:
  • 在一个多人游戏中,玩家死亡后可能会触发一个“玩家死亡”事件,并将该事件广播给多个接收方,例如 UI 系统、积分系统和其他玩家。接收方根据这个消息来更新游戏状态,而不需要直接引用或访问死亡玩家的对象。

总结:两者的对比与选择

特性获取引用(Get Reference)获取引用消息(Get Reference Message)
耦合度较高,引用直接连接对象较低,消息传递减少了对象间的直接依赖
灵活性低,通常依赖于具体实现对象的引用高,可以轻松改变事件的处理方式和对象间的交互方式
适用场景简单、频繁的对象交互,如修改属性、调用方法等复杂、多模块的系统,事件驱动和广播消息时
扩展性较差,添加新功能时可能需要修改现有的代码较好,通过增加新的事件监听器和消息处理可以扩展系统
性能通常更高效,直接操作对象可能稍慢,涉及到消息发送和处理,但对于大型系统中的异步任务有优势
代码清晰度简洁,直接访问对象易于理解可能需要额外的消息传递机制和事件监听器,复杂度较高,但更灵活和解耦

选择建议:

  • 使用获取引用:如果你需要高效、直接地与对象交互,且对象之间的依赖关系较简单,可以选择获取引用。
  • 使用获取引用消息:如果你需要一个解耦的、事件驱动的系统,或对象之间的交互复杂且需要高度扩展,可以选择获取引用消息。消息传递方式适合需要广播、异步处理或跨系统通信的场景。

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

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

相关文章

Elasticsearch vs 向量数据库:寻找最佳混合检索方案

图片来自Shutterstock上的Bakhtiar Zein 多年来,以Elasticsearch为代表的基于全文检索的搜索方案,一直是搜索和推荐引擎等信息检索系统的默认选择。但传统的全文搜索只能提供基于关键字匹配的精确结果,例如找到包含特殊名词“Python3.9”的文…

SpringCloudAlibaba学习路线:全面掌握微服务核心组件

大家好,我是袁庭新。 星友给我留言说:“新哥,我最近准备开始学Spring Cloud Alibaba技术栈,计划冲刺明年的春招,想全面掌握微服务核心组件。但不知从何学起,没有一个有效的学习路线,我需要学习…

Scala的隐式转换(1)

package hfd //需求: //完成一个功能,让所有的字符串都能调用isPhone方法,来校验自己是不是一个手机号 object Test37_1 {class StrongString(val str: String) {//开始你的代码def isPhone(): Boolean {val reg "1[3-9]\\d{9}".…

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…

租赁系统|租赁小程序|租赁小程序成品

租赁系统是现代企业管理中不可缺少的数字化工具,它通过高效的信息整合与流程管理,为企业带来极大的便利和效益。一个完善的租赁系统开发应具备以下必备功能: 一、用户管理 用户管理模块负责系统的访问控制,包括用户注册、登录验证…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

C++ 列表初始化(initializer_list)

列表初始化(initializer_list) 列表初始化是C中的一种语法特性,引入于C11,用于更简单直观地初始化变量、对象或容器。它使用花括号 {},提供了更安全的初始化方式,避免了类型窄化转换等潜在错误。 定义 列表初始化是用花括号 {}…

java+ssm+mysql美妆论坛

项目介绍: 使用javassmmysql开发的美妆论坛,系统包含超级管理员,系统管理员、用户角色,功能如下: 用户:主要是前台功能使用,包括注册、登录;查看论坛板块和板块下帖子;…

Java-21 深入浅出 MyBatis - 手写ORM框架2 手写Resources、MappedStatment、XMLBuilder等

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

关于Python的常用模块

Python拥有丰富的标准库和第三方库,这些库提供了大量的模块,使得Python能够广泛应用于各个领域。以下是一些Python的常用模块: 一、系统交互与文件操作模块 os模块:用于与操作系统进行交互,如获取当前工作目录、创建…

专业135+总分400+华中科技大学824信号与系统考研经验华科电子信息与通信工程,真题,大纲,参考书。

考研成功逆袭985,上岸华科电子信息,初试专业课824信号与系统135,总分400,成绩还是很满意,但是也有很多遗憾,总结一下自己的复习,对于大家复习给些参考借鉴,对自己考研画个句号&#…

ElementUI:el-tabs 切换之前判断是否满足条件

<div class"table-card"><div class"card-steps-class"><el-tabsv-model"activeTabsIndex":before-leave"beforeHandleTabsClick"><el-tab-pane name"1" label"基础设置"><span slot&…

java中的数组(2)

大家好&#xff0c;我们今天继续来看java中数组这方面的知识点&#xff0c;那么话不多说&#xff0c;我们直接开始。 一.数组的使用 1.数组中元素访问 数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,数组可以通过下标访问其任意位置的元素. 也可以进行修改…

在 OAuth 2.0 中,refreshToken(刷新令牌)存在的意义

在 OAuth 2.0 中&#xff0c;refreshToken&#xff08;刷新令牌&#xff09; 的主要目的是为了提升用户体验和安全性&#xff0c;同时确保访问令牌的有效性。以下是需要使用 refreshToken 的原因&#xff1a; 1. 访问令牌的有限生命周期 访问令牌&#xff08;accessToken&…

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(6)进阶模式-Web Fuzzer(下)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Oracle 19c RAC到单机ADG部署及Broker管理配置-最佳实践

一、概述 前面文章列举了几种ADG常见的搭建方式&#xff0c;此处我以最佳的方式作为实践过程演示&#xff1b;架构为RAC到单机&#xff0c;通常这种架构大家用得比较多&#xff1b;这里实践的案例ADG全程是Broker进行管理&#xff0c;Broker其实是ADG非常简单易用的工具&#x…

每日一题 LCR 097. 不同的子序列

LCR 097. 不同的子序列 使用动态规划就可以解决&#xff0c;重点是知道 动态规划的状态是如何转移的 class Solution { public:int numDistinct(string s, string t) {int ns s.size();int nt t.size();vector<vector<long>> dp(ns1,vector<long>(nt1,0)…

如何在 JavaScript 中进行深度克隆?

在 JavaScript 中进行深度克隆&#xff08;deep clone&#xff09;是指创建一个对象的完整副本&#xff0c;并且副本中所有的嵌套对象也被复制&#xff0c;而不是只是引用原始对象中的嵌套对象。深度克隆与浅克隆的主要区别在于&#xff0c;浅克隆只复制对象的引用&#xff0c;…

C# 关于加密技术以及应用(一)

在 开发过程中&#xff0c;加密是一个常见的需求&#xff0c;数字签名和验证、网络通信安全、数据加密解密、用于保护数据的安全性和隐私。如几种常用的加密技术AES、SSL/TLS、RSA、HMAC 、SHA等&#xff0c;都是我们开发过程中常用到的加密方式&#xff0c;只不过每一个加密方…

Python 爬虫 (1)基础 | XHR

一、XHR 1、概念 XHR&#xff0c;全称XMLHttpRequest&#xff0c;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。它允许网页的JavaScript代码与服务器进行异步通信&#xff0c;即在发送请求后&#xff0c;浏览器不会阻塞用户的后续操作&#xff0…