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

カテゴリ:blender

RNA プロパティの特徴

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

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

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

  cube.myRnaInt = -99

RNA はすべてのオブジェクトが追加したプロパティを持つようになる.

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

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

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

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

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

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

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()

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 記事の目次