记录一下这周搞到头秃的需求。
需要修改修改蓝图组件的属性。
过去我修改组件属性都是通过 Actor 实现。
但是 Actor 需要在 Game World 当中进行修改,而这个时候其实是已经实例化了。
这里需要将值赋值到蓝图当中,等于下次生成 Actor 的时候已经自动带有配置好的初始值了。
原先我觉得 Actor 修改就是分分钟的事,蓝图相信也可以直接获取进行修改吧。
然而我是图样图森破了_(:з」∠)_ 修改蓝图组件属性尝试
Component 更新相关的逻辑就是红框框住的部分。
可以看到这其中有一个关键操作。
AActor* Actor = GetActorContext();
// 代码省略 ...
AActor* BlueprintCDO = Actor->GetClass()->GetDefaultObject<AActor>();
这个操作通过 Actor 获取类,然后再通过 类 获取 DefaultObject 来进行操作。
这个变量的命名就很灵性,于是去查一下 unreal cdo 相关的内容,然后可以追查到 AnswerHub 链接
根据最佳回答可以知道, CDO 是 Unreal 的 Class Default Object 的简称。
专门用来存储 类 的实例化初始值对象,也就是当 类实例化的时候,会通过反射系统从 CDO 对象中取值。
所以针对蓝图这种就更为重要,因为蓝图其实是一个 C++ 类生成器,可以简单理解为 Compile 的时候生成相应的 C++ 类以及对应的 Class Default Object
进而通过 Class Default Object 来衍生出其他的实例。
所以修改蓝图 Component 的属性,本质上就是要修改 Class Default Object 即可。 Python 尝试修改 CDO
通过上面的 C++ 源码,我想到在游戏场景里面获取 Actor 然后模仿上面的方式获取类。
import unreal
actors = unreal.EditorLevelLibrary.get_selected_level_actors()
for actor in actors:
print(actor.get_class())
# LogPython: <Object &#39;/Game/sequence/NewBlueprint.NewBlueprint_C&#39; (0x00000209683ADD00) Class &#39;BlueprintGeneratedClass&#39;>
果然 Actor 获取到的 Class 是特殊的 BlueprintGeneratedClass
然而在 Python 里面也提供太多特殊的调用方式。
我用 dir 列出这个类可以调用的方法,发现还有 get_default_object 方法,继承于 unreal._ObjectBase 链接
import unreal
actors = unreal.EditorLevelLibrary.get_selected_level_actors()
for actor in actors:
print(actor.get_class().get_default_object())