介绍

在开发过程中,您会希望一次列出并更改 Blueprint (BP) 和 Component 的每个属性的默认值(初始值)。例如,检查是否不必要地启用了 Ticks,或者更改组件使用的资产。 (我不是在谈论关卡上的演员,而是在内容浏览器上作为他们来源的 BP 资产)

但,内容浏览器上的 BP 资产 (UBlueprint)什么时候实现中使用的 BP 类(AActor 等)牙齿另一件事所以真的很麻烦...而且,C++或者Python几乎是必须的,单靠BP是不可能实现的……

但是,通过使用 UE5 中添加的SubobjectDataSubsystem您现在可以轻松地检查和更改 BP 的属性!

上帝! (其实你也可以添加组件但那是另一篇文章......)

所以,这次我将介绍如何使用 SubobjectDataSubsystem 来检查和更改属性的默认值。还有一点详细的故事,所以我想尽快使用它!可以跳到下半场。

UE4时代

在 UE4 时代,BP 类的每个属性的默认值都可以从类默认对象 (CDO) 中访问。但是,如下图可以看到,它是纵长的,如果仔细观察,它会略微缺乏……(例如,TickGroup)。
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について
并且由于未准备 Set,因此无法更改属性的初始值。因此,如果要获取/设置目标BP或Component的属性的初始值,则必须使用C++或Python。

对于 C++

C++
#include "MyEditorBlueprintFunctionLibrary.h"
#include "Kismet2/CompilerResultsLog.h"
#include "Kismet2/KismetEditorUtilities.h"

void UMyEditorBlueprintFunctionLibrary::EditActorProperty(UBlueprint* Blueprint)
{
	if (!Blueprint)
	{
		return;
	}
	
    // CDOを取得して初期値を変更
	UClass* Class = Blueprint->GeneratedClass;
	AActor* CDO = Class->GetDefaultObject<AActor>();
	CDO->SetTickGroup(TG_DuringPhysics);

	// コンパイルして変更を反映
	FCompilerResultsLog LogResults;
	FKismetEditorUtilities::CompileBlueprint(Blueprint, EBlueprintCompileOptions::None, &LogResults);

	// Blueprintに編集されたことを通知
	Blueprint->MarkPackageDirty();
}

[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

对于 Python

Python
import unreal

selected_asset_datas = unreal.EditorUtilityLibrary.get_selected_asset_data()
for asset_data in selected_asset_datas:
    asset_class = unreal.load_class(None, str(asset_data.object_path) + "_C")
    cdo = unreal.get_default_object(asset_class)
    cdo.set_tick_group(unreal.TickingGroup.TG_POST_UPDATE_WORK)
    unreal.SystemLibrary.transact_object(cdo)

参考

[UE4] 使用 DefaultObject 获取资产的初始值
【UE4】【Python】批量修改BlueprintClass的默认变量值【★★★】
从 C++ 创建和编辑蓝图

在 UE5 中添加的 SubobjectDataSubsystem

这种情况的解决方案是SubobjectDataSubsystem
由于是最新的功能,遗憾的是几乎没有资料或文档,但如果你看一下引擎代码中的注释

子对象数据子系统将根据给定的根对象生成反射的子对象数据。根对象可以是任何东西,可以是通过关卡编辑器单击的actor实例,通过打开资产获得的UBlueprint*,或者从python或其他管道输入的东西脚本语言。
子对象数据子系统根据指定的根对象生成反射的子对象数据。根对象可以是通过关卡编辑器单击的演员实例、打开资产的 UBlueprint*、从 Python 或其他脚本语言输入的任何内容。 . (快速谷歌翻译的结果)

您可以说这是一个很棒的功能,可以让您编辑任何内容,例如关卡上的 Actor 和蓝图,这是本次讨论的主题!而且,由于BP上有很多节点是对公众开放的,看来只有BP才能做各种事情!一种神机的预感!
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

所以,让我们使用SubobjectDataSubsystem 来获取和更改属性的初始值!但这超级容易!此外,为了使用多个仅编辑器节点,我们将与Editor Utility BlueprintEditor Utility Widget 结合处理。

使用SubobjectDataSubsystem“获取”BP的属性初始值

首先,使用SubobjectDataSubsystem 拥有的Gather Subobject Data For Blueprint 节点从指定的BP 资产(UBlueprint)中获取BP 类(AActor)......好吧,我们已经到达了AActor!超级简单!
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

↑节点说明

通过使用Gather Subobject Data For Blueprint 节点,您可以获得目标BP 资产拥有的子对象数据列表。此列表由 BP 资产管理血压类八园BP 类具有的组件信息被存储。

然后Get DataIs Actor节点判断信息是否为BP类,如果是BP类,Get Object获取实际数据,最后投射到你要编辑的类。

之后,像往常一样,您可以从 Get 节点或专用函数中获取每个属性的值!超级简单! ! !
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

使用SubobjectDataSubsystem“改变”BP属性的初始值

由于您可以转换为 BP 类,因此您可以在该流程中实现初始值的更改。这很简单!
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

Transact Object 节点用于将资产标记为正在编辑/未保存(脏标志)。如果不这样做,编辑器将无法判断数据已更改,因此可能会出现忘记保存或版本管理问题等问题。所以这非常重要。
顺便说一句,Transact Object 节点在实现 Undo/Redo 时使用,但它也可以用于此类目的。方便的。
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

使用 SubobjectDataSubsystem 来“获取/编辑”组件属性的初始值

接下来,让我们更改 BP 拥有的 Component 的初始值!
是的。这很简单!
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について
之前是通过Data的内容是不是Actor来判断的,但是如果是Component的话,可以通过Is Component节点来判断。一旦你确定了它,你所要做的就是转换到你想要检查/编辑的组件。

顺便说一句,我之前省略了它,但您也可以从Get Editor PropertySet Editor Property 节点获取和编辑属性。在这种情况下,您可以使用字符串指定属性,例如我想使用 Excel 数据批量更改属性!作为情况方便。此外,会自动附加脏标志。
但是,由于它直接接触到属性,因此可能会出现意想不到的问题,因此在处理时需要小心一点。
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

使用 SubobjectDataSubsystem 在关卡上编辑 Actor

作为奖励,我还使用SubobjectDataSubsystem 编辑选定的演员! ……不过,既然是Actor,直接触摸速度更快,所以用SubobjectDataSubsystem没意义!
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

但是由于Gather Suboject Data For Instance / Blueprint返回的数组的类型是相同的,所以在编辑属性的初始值和已经放置在关卡上的Actor的属性值时,或者在比较的同时运行校验过程我觉得很方便。

最后

感觉故事有点长,不过SubobjectDataSubsystem您现在可以仅使用 BP 获取和编辑各种属性!
在一定的发展规模下,手动检查和编辑大量资产和演员变得不现实。在这种情况下,这是一个非常有用的功能,所以请利用它!

结尾

续(通知)

如何使用SubobjectDataSubsystem 将组件添加到 BP 资产


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623853.html

相关文章: