dskjal
広告
広告

Blender の RNA プロパティと ID プロパティとの違い

カテゴリ:blender

RNA プロパティの特徴

RNA は既存のデータ構造を拡張するため,使用前に宣言が必要だ.

bpy.types.Object.myRnaInt = bpy.props.IntProperty(
  name = "RNA int",
  min = -100,
  max = 100,
  default = 33)

アドオンで RNA プロパティを使う場合は、アンロード時に削除する必要がある。

def unregister():
  del bpy.types.Object.myRnaInt

一度定義してしまえばドットを使ってそれにアクセスできる.

  cube.myRnaInt = -99

RNA を宣言すると,すべてのオブジェクトにプロパティが追加される.

Driver からプロパティの値を読むこともできる.

Driver からアクセス
Driver からプロパティの値を読む

ポーズボーンにもプロパティを作成できる.これはIK/FK スイッチのようなプロパティを作るのに便利だ.

import bpy

bpy.types.PoseBone.ボーン名 = bpy.props.FloatProperty(name='test')

作成したプロパティはリスト表記でアクセスできる.

import bpy

bpy.types.PoseBone.Bone = bpy.props.FloatProperty(name='test')
bpy.data.objects['Armature'].pose.bones['Bone']['test'] = 0

スクリプトから RNA を作成する際の注意点

スクリプトから作成した RNA(ID)プロパティは値が代入されない限り表示されない.以下のスクリプトを実行しても Custom Properties には何も表示されない.

import bpy
bpy.types.Object.my_rna_bool = bpy.props.BoolProperty(name='RNA bool')

適当な値を代入してやれば表示される.

import bpy
bpy.types.Object.my_rna_bool = bpy.props.BoolProperty(name='RNA bool')
bpy.context.active_object.my_rna_bool = False
bpy.context.scene.update()

最後の update() は変更を反映させるために呼び出している.これがないと一度選択を解除してからもう一度選択してやらないとプロパティが表示されない.

RNA プロパティを保存する際の注意点

RNA プロパティの宣言は保存されない.スクリプトから宣言した RNA プロパティを保存して再度開くと,それらはすべて ID プロパティになる.再宣言すれば,それらを RNA プロパティとして扱える.

ID プロパティの特徴

ID プロパティは単体のデータブロックに追加されるため,他の同じ型のデータに影響はない.事前に宣言する必要はなく,値が代入されたときに自動的に作成される.

  cube.data["MyIdInt"] = 111

ID プロパティは integer か float か string になる.それ以外の型が代入されると自動的にそれらの型のどれかに変換される.以下のコードは integer の ID プロパティを作成し,1 が代入される.

  cube.data["MyIdBool"] = True

リンク時の動作

リンクしたオブジェクトの RNA プロパティも ID プロパティも変更できない.プロキシを作成すれば RNA プロパティは変更できるが,ID プロパティは変更できない.

外部リンク

RNA properties versus ID properties

関連記事

Blender 記事の目次


広告
広告

カテゴリ