我正在为我的朋友和我正在制作的游戏编写导出器,它涉及为对象设置自定义属性和标签,然后在游戏中识别并进行相应处理。我们用 C/C++ 编写的引擎已经用我当前版本的导出脚本成功测试,我目前正在整理它。
该脚本使用 Blender 的自定义属性功能将自定义标签写入输出文件。该模型通常由多个“部分”(Blender 网格对象作为父对象形成一棵树,具有一个“父”和多个“子”对象)组成,其中一些部分是简单的 Blender Empty 对象(只有它是 X、Y和 Z 坐标是必需的)具有自定义属性,用于标记诸如船舶推进(它是一个 3D 射击游戏)之类的东西的放置位置,或者船舶被射击时火焰/爆炸出现的位置。这些空的部分也是“根”对象或其任何子对象的父对象。到目前为止它运行良好,我编写了一个通用 Operator 类和一些扩展类,它们驻留在面板中设置部件的属性(非常方便,因为你不这样做'
现在我想进一步加快速度,即能够简单地单击所需类型的运算符,它应该自动将其添加到场景中并将其作为活动/选定对象的父级。我知道该怎么做,但我不能让那些运营商改变他们的标签。Basically, what I want is to operator to say 'Bullet point' when an existing empty is selected (I've got that part done), and when there's a mesh object selected to say 'Add bullet point'. 所以我只需要一种根据上下文动态更改操作员标签的方法(因为问题的标题清楚地说明了:))
这是我到目前为止得到的:
class OBJECT_OT_tg_generic (bpy.types.Operator):
bl_label = "Sets Generic Part Type"
bl_idname = "rbm.set_generic_part_type"
OB_TYPE = None
@classmethod
def poll (cls, context):
act = context.active_object
if 'Type' in act.keys ():
if act['Type'] == cls.OB_TYPE:
cls.bl_label = 'foo'
print (cls.bl_label)
# this prints foo but doesn't change the label
return False
return True
def execute (self, context):
# TODO: add code to automatically place empties and parent them to active object
bpy.context.active_object['Type'] = self.OB_TYPE
return{"FINISHED"}
还有一个子类的例子:
class OBJECT_OT_tg_bullet_point (OBJECT_OT_tg_generic):
bl_label = "Bullet Point"
bl_idname = "rbm.set_bullet_point"
OB_TYPE = OT_BULLET_POINT
这是它在 Blender 中的外观:http: //i.imgur.com/46RAS.png