3

私は友人と私が作っているゲームのエクスポーターを書いています。これには、ゲームで認識され、それに応じて処理されるオブジェクトにカスタム プロパティとタグを設定することが含まれます。C/C++ で記述された当社のエンジンは、現在のバージョンのエクスポート スクリプトで正常にテストされており、現在、整理に取り組んでいます。

このスクリプトは、Blender のカスタム プロパティの機能を使用して、カスタム タグを出力ファイルに書き込みます。モデルは通常、複数の「パーツ」(1 つの「親」オブジェクトと複数の「子」オブジェクトを持つツリーを形成するために親になっている Blender メッシュ オブジェクト) で構成され、これらのパーツの一部は単純な Blender Empty オブジェクトです (X、Y のみ)。および Z 座標が必要です) 船の推進力 (3D シューティングゲームです) のようなものを配置する場所、または船が撃たれたときに炎/爆発が現れる場所をマークするカスタム プロパティを使用します。これらの空の部分も、「ルート」オブジェクトまたはその子のいずれかの親になります。これまでのところ、うまく機能しています。一般的な Operator クラスと、パーツのプロパティを設定するパネルに常駐するいくつかの拡張クラスを作成しました (そうでないので非常に便利です)。

ここで、さらにスピードアップしたいと考えています。つまり、目的のタイプのオペレータをクリックするだけで、自動的にシーンに追加され、アクティブ/選択されたオブジェクトにペアレント化されます。その方法は知っていますが、それらのオペレーターにラベルを変更させることはできません。基本的に、私が望むのは、既存の空が選択されたときにオペレーターに「箇条書き」と言うようにすることです (私はその部分を完了しました)、そして「箇条書きを追加」と言うために選択されたメッシュ オブジェクトがある場合。したがって、コンテキストに応じてオペレーターのラベルを動的に変更する方法が必要です(質問のタイトルが明確に述べているように:))

これは私がこれまでに得たものです:

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

4

1 に答える 1

4

私はそれを解決したと思います。パネルにオペレーターを追加するときは、次のようなことができます。

def draw (self, context):
    layout = self.layout
    row = layout.row()
    row.operator("foo.bar", text="Whatever you want")

「Whatever you want」がボタンのラベルになります。しかし、私がしたことは別のことでした。オペレータのラベルは変更しませんでしたが、代わりに、それがメッシュであるか、現在選択されている/アクティブな空のものであるかに応じて、異なるアイコンを付けました。

def draw (self, context):
    # (...) we're skipping some code here, obviously
    act = context.active_object
    if act.type == 'MESH':
        op_icon = 'ZOOMIN'
    else:
        op_icon = 'EMPTY_DATA'

    row = layout.column(align=True)
    row.operator('rbm.set_bullet_point', icon=op_icon)
    row.operator('rbm.set_rocket_point', icon=op_icon)
    # (...) rest of the code
于 2012-08-02T10:54:13.627 に答える