我正在为我和朋友制作的游戏编写导出器,它涉及将自定义属性和标签设置到对象中,然后在游戏中识别并相应处理。我们的引擎是用C/C++编写的,已经成功地使用我的当前版本的导出脚本进行了测试,我目前正在整理它。
该脚本使用Blender的自定义属性功能向输出文件写入自定义标签。模型通常由多个“部分”组成(Blender网格对象被父级化以形成树,其中一个“父”对象和多个“子”对象),其中一些部分是简单的Blender空对象(仅需要其X、Y和Z坐标),具有标记船只推进(它是一个3D射击游戏)放置位置的自定义属性,或者标记当船只被击中时火焰/爆炸出现的位置。这些空部件也被父级化到“根”对象或任何其子对象中。到目前为止,它一直运行良好,我编写了一个通用的Operator类和一些扩展类,它们驻留在面板中,设置部分的属性(非常方便,因为您不必手动添加这些自定义属性)。
现在我想进一步加快速度,即能够简单地单击所需类型的操作符,它应自动添加到场景中并将其父级化到活动/选定对象。我知道如何做到这一点,但我无法使那些操作符更改它们的标签。基本上,我想要的是当选择现有空对象时,操作符应显示“Bullet point”(我已经完成了这部分),当选择网格对象时,应显示“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