【UE5】23 - 蓝图综合(上):一劳永逸的解决蓝图通讯中类型转换(Cast to)的Object引脚

作者: 殷雷Studio分类: 野生技能协会 发布时间: 2022-12-25 16:27:28 浏览:16789 次

【UE5】23 - 蓝图综合(上):一劳永逸的解决蓝图通讯中类型转换(Cast to)的Object引脚

GRIS灰白:
讲的很细致,不过如果有初学的人看,有3点要注意。 1是cast to属于运行时动态类型转换(RTTI),执行代价极高,把鼠标移到这个节点上看注释它也会提醒你。简单说下原理就是它会递归展开两个对象的全部内存空间并一一比较全部变量类型,所以它是万能的,但非常耗时,只建议在进行载入或单次构建使用,一定不要在tick中出现这个东西。 2是如果我没记错,game mode是伴随level构建,所以在运行上和关卡蓝图可以看成并列的。它的作用是抽离同类关卡的共用逻辑,比如两个关卡都会下雨,你就可以在game mode中实现然后两个关卡共用。但要注意一旦切换关卡,game mode实例也会被重构,所以它并不能用来在关卡间共用数据。如果要共用,可以使用player state。 3是虽然up展示了在玩家角色蓝图中发现一颗石头,但从设计角度来讲,特殊行为还是写进特殊类型,因为游戏里会有很多东西,石头树花花草草桌椅板凳,如果每添加一个都要改写一次角色蓝图,这种耦合太过巨大。还是要在石头中检测玩家,因为玩家类型是能唯一确定的,所以可以在任何其他类型中检测这个类。[tv_点赞]

【回复】第二点没说到点上,gamemode与关卡蓝图本质区别是服务端与客户端的区别,仅此而已。 每一个主关卡会有对应一个worldsetting,其开放的编程接口就是levelscript关卡蓝图。而worldsetting主要任务有两个:1,在开始runtime时还原editor时创建编辑的对象。2,决定实例的gamemode。 如果仅仅是在单机模式下关卡间传递数据,gamemode做不到是因为其生命周期是小于整个世界周期。一般会用整个游戏实例对象(game instance)。如果是客户端与服务端就角色(也能包括npc角色)数据通信,才能用到playerstate
【回复】回复 @Libailiu : 感谢指正[tv_点赞]
【回复】建议用游戏实例保存数据
陶仁贤TRX:
感觉 Cast to 就是一个无脑全挂上的模式,会挂太多不需要的东西,如果只是传参数的话,我觉得 interface 更简单一些,要传啥就用啥。要不然 Cast to 多了,容易卡。

【回复】回复 @信息-茧房 :要看你用的参数多不多了,不多的话用 Interface也很简单的,如果要传的数据多,倒是可以尝试把数据更新到一个 黑板里面。也省事。
【回复】回复 @陶仁贤TRX :更新到黑板里可以试试
【回复】如果一定要获取角色蓝图的参数怎么办?总不能让角色蓝图对着目标蓝图用接口传吧?[笑哭]
騳虤:
actor组件应该也算间接吧?或者说某些情况下可以是另外一种蓝图接口?(我没怎么用过蓝图接口) 讲的挺详细的。 还有一个建议:UP或许可以把消耗低的几个方式排一下名?(更早地规范使用它们,不至于成为屎山,卡成PPT才手足无措),我看有一些插件,最初版经常是Cast To Cast To,后来更新版本后就极大降低Cast To的依赖,那么他们一般是怎么处理这种情况的呢?

【回复】CastTo对卡顿的影响可以忽略不计。它的麻烦之处在于灾难性耦合,会导致功能依赖于某个具体的类。CastTo的正确用法是依赖抽象类(这里不指代C++中的抽象类,代表一个功能的非常底层的类)。减少CasTo不是目的,是表现,你的方向应该是,抽象不应该是一个东西有什么功能,而是什么功能会组成了一个东西,也就是组合(UE的component),不过UE的component有点太重了,一般复杂功能才用(移动系统,战斗系统等等),对于单一场景有不同表达(比如不同子弹的击中效果),建议用另外一种形式去表达,策略模式,这是对新人最友好的设计模式。再进一层,就是极致的组合——ECS,建议学习UE5的Mass框架,这个很复杂,可以作为最终目标[呲牙],共勉。
【回复】消耗排行 cast to > interface > 共用基类。性能损耗cast to大约是interface的3倍以上,而且不固定,类型越复杂倍率越高。
【回复】回复 @殷雷Studio :是新方式噢,看来要看相关的视频了
FQ火热火热:
请教UP两个问题。 1. 比如我开发一个JRPG,那么角色的数据,如等级,HP,MP,EXP,金钱,道具列表这些信息是不是就应该储存在GameMode蓝图中?因为这些数据从读档进入游戏开始一直要用到退出游戏; 2. 将Level中出现的怪物数据,背景音乐等信息储存在Level蓝图中? 非常感谢

【回复】回复 @殷雷Studio :好的,非常感谢
【回复】从进入游戏开始到退出游戏,应该存储在 Game Instance 中,详细使用可以参考这期视频:https://www.bilibili.com/video/BV12N411H7az/ 背景音乐应该是存储在 Level 蓝图中比较好吧
FHangH:
关卡蓝图里面一般不让写东西 我还是喜欢delegate,控制性能消耗和解耦效果拔群 tick我一般也不用,我会自己写个方法,begin的时候创建一个计时器去执行这个方法,可以很好的控制刷新频率

VX故事:
殷老师好。想请问下在一个控件蓝图里类型转换到另一个控件蓝图时,这个Object应该连什么呀?

【回复】如果你在角色里加了个控件组件,那你可以拖出来,先连一个获取控件的节点,再转换
【回复】回复 @帕拉斯兔狲 :同问
大包子11:
我看 BP_AAA Cast To BP_BBB 是用来强制类型检查 BP_AAA 是不是 BP_BBB 类型,或者说 BP_BBB 是不是 BP_AAA 的子类型。获取子类型只是一个副产品,Cast To 的主要目的是强制检查。

斑鸠夏声:
好!讲的又细又好,仿佛把便秘通畅了一样爽快

阿尼拉丝:
一直不理解cast to是什么意思,到底是谁转换成了谁啊。。。是翻译的问题吗

【回复】回复 @Hammer89 :太深奥了,不懂馁[doge]
【回复】回复 @regry : 在虚幻官方文档的解释是这样的:“类型转换 类型转换是一种常用的通信方法,方法是获取Actor的引用,并尝试将其转换为其他类型。如果转换成功,则可以通过直接通信来访问其信息和功能。 此方法要求引用关卡中的Actor,以便使用 Cast 节点来将它转换成特定的类。采用此通信方法时,当前Actor和目标Actor之间是一对一关系。” 那么也就是说,这个解释中关键还是获取actor的引用在转换,以此获取转换的对象的信息,但是问题来了,为什么要转换,为什么要有object
【回复】回复 @regry :应该是不理解什么是转化,为什么要转换,因为在使用上来说,新人眼里的cast to节点,其实是在用于获取某个actor进行蓝图间通信,那么这个名字就和使用上(我们新人眼里的使用上)是打不着北的,而实际上到底该怎么理解,我也想知道
账号已注销:
bpi可以用来对指定地址发消息,发变量,cast可以直接获得对象的子类地址,ed可以广播消息,需要指定广播源地址。

yuwongx:
很给力的教程,基本上是最给力的中文教程之一...

虚幻引擎 独立游戏 游戏开发 蓝图通讯 蓝图 UE4 UE4教程 类型转换 虚幻5

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读