目标
在UE编辑器中使用Python设置枚举类属性值会遇到些问题,本篇记录了这些问题的解决方法。
1. 设置数值类属性值
先在编辑器中选择一个Actor,然后运行下面Python代码:
actor = unreal.EditorLevelLibrary.get_selected_level_actors()[0]
actor.set_editor_property("InitialLifeSpan",0.369)
即可设置此属性:
你也许不知道准确的属性名字 “InitialLifeSpan” 如何得到,毕竟编辑器中显示的名字带有空格。对于Actor的属性,可以参考【附录1】中的方式查看属性名。
2. 设置枚举类属性值(枚举类定义在C++代码里)
对于枚举类型的属性,下面脚本
actor.set_editor_property("SpawnCollisionHandlingMethod",unreal.SpawnActorCollisionHandlingMethod.ADJUST_IF_POSSIBLE_BUT_DONT_SPAWN_IF_COLLIDING)
将会设置:
脚本里的 “unreal.SpawnActorCollisionHandlingMethod.ADJUST_IF_POSSIBLE_BUT_DONT_SPAWN_IF_COLLIDING” 其实是 unreal.枚举类名.枚举成员名
。你也许不知道他们的准确名字,为此可以参考【附录2】中的方式。
需要注意的是,此方式仅适用于 枚举类定义在C++代码里 的情况。
3. 设置枚举类属性值(枚举类定义在Enumeration资源里)
假如枚举类定义在Enumeration资源里:
为了测试,做一个蓝图Actor添加此类型的属性:
这里遇到的问题是:unreal.枚举类名
失效了:
不过,“先获得属性value
,然后使用type(value)
获得枚举类”的方式依旧奏效。所以可以用下面的脚本:
value = actor.get_editor_property("MyTest")
actor.set_editor_property("MyTest",type(value).CCC)
(实验发现,去掉type()
,即直接使用value.CCC
也是可以的)
4. 设置枚举类属性值(枚举类定义在Enumeration资源里,且成员名以数字开头)
当我们在Enum资源中定义的枚举成员有数字开头时:
使用之前的方式将会产生问题:
这大概是因为Python中的枚举成员不能以数字作为开头。
这时,需要用cast
函数:
value = actor.get_editor_property("MyTest2")
actor.set_editor_property("MyTest2",type(value).cast(2))
cast
将一个数字转换为枚举值。当然,需要事先确认自己想要设置的值和数字的对应关系。
总结
- 假如枚举类定义在C++中,则直接使用
unreal.枚举类名.枚举成员名
。 - 假如枚举类定义在Enumeration资源中。则需要先获得值
value
,然后使用type(value)
来取代之前的unreal.枚举类名
。 - 假如枚举类定义在Enumeration资源中,且枚举成员是数字。则需要先获得值
value
,然后使用type(value).cast(i)
将数字i
转换为枚举值。此时也需要事先确认自己想要设置的值和数字的对应关系。
附录1:如何知道准确的属性名?
对于Actor,首先在编辑器中找到一个此类型的Actor,并修改一下你感兴趣的属性(确保此属性不是默认值)。然后,选择此Actor后按Ctrl+C来复制,然后找一个文本编辑器按Ctrl+V,就能看到Actor的字符串形式,然后就可以根据显示名和当前值来找到其准确的属性名了:
附录2:如何知道准确的枚举类名和枚举成员名
直接打印当前属性值:
value = actor.get_editor_property("SpawnCollisionHandlingMethod")
print(value)
这将会打印枚举类名
,以及当前的枚举成员名
:
在编辑器中修改属性值,并再次打印,就可以按这种方式知道所有编辑器显示的名字与枚举成员名
的对应关系。
要想知道当权枚举类的所有成员,有两种方式:
(1) 直接遍历unreal.枚举类名
for member in unreal.SpawnActorCollisionHandlingMethod:
print(member)
(2) 先获得属性value
,然后遍历 type(value)
:
actor = unreal.EditorLevelLibrary.get_selected_level_actors()[0]
value = actor.get_editor_property("SpawnCollisionHandlingMethod")
for member in type(value):
print(member)