Set/GetGlobal。
ちょっとスクリプトの調べものしていたら・・・・・
っていうか、XPOP3 に付いてきたサンプルコードを読んでいたら・・・・・
ソースの中に、SetGlobal とか GetGlobal とか出てきたんですよ。
なんだろうこれ?
ソースを見てもそんな名前の function とかはない。
コマンドっぽい。
ってことは XSI のネイティブなコマンドなのか?
と思って調べてみたら、SDK ガイドに載ってました。
シーンの中にカスタムプロパティなどを作らずに、値を保存したり取り出したりできるらしい。
その XSI のセッションが終了するまで、つまり XSI を起動し直すまで有効ならしい。
ということは、シーンと一緒にその値をセーブしておくことはできないが、その場限りのちょっとした値の保持場所として使えるということらしい。
知らなかったよっ。
すんげえ便利じゃないですかこれ。
マニュアルを見ると ver5 からの機能のようだ。ってことはもう遥か昔から存在してたんだなあ。いやあ知らなかった。
例えばこんな風に書いてみます。
SetGlobal( "Hoge", 25 );
HogeValue = GetGlobal( "Hoge" );
Logmessage( "Hoge = " + HogeValue );
1行目。 Hoge という入れ物に、25 という数値を、SetGlobal を使って格納する。
2行目。 HogeValue とう変数に、さっきの Hoge の中身を格納する。
3行目。 その中身をスクリプトエディタの中に表示させる。
実行すると、
こうなりました。
んで、今度は1行目をコメントアウトします。 1行目は実行されなくしたということです。
// SetGlobal( "Hoge", 25 );
HogeValue = GetGlobal( "Hoge" );
Logmessage( "Hoge = " + HogeValue );
すると、
ちゃんとまた 25 がゲットできてます。
1行目は実行されないので、25 という値はこのスクリプトの中で格納されたわけではありません。 1回目のスクリプトで格納された値が生き残っているということになります。
上の画像にあるように NewScene を実行した(新しいシーンを開いた)後も、ちゃんと 25 が生きてます。 XSI を終了させるまで生きているようです。
今までこういうことをやろうと思ったら、カスタムプロパティを作ってました。 でもめんどくさいし、特にシーンに実体が残るカスタムプロパティの場合は、例えばシーンルートがカスタムプロパティだらけになって、汚かったりしたわけですよ。 このやり方なら、シーンと一緒に保存されなくてもいいちょっとしたこと、その場限りで値を保持しておきたい場合なんかにとても便利です。
パッと思いつくのが、超 Isolate ですね。 全部のビューポートでイッキに Isolate Selection を実行するという古い自作ツールなんですが、実は未だによく使ってます。 で、この超 Isolate の状態をトグルするために、カスタムプロパティに値を保持していたんですね。 Isolate 状態かどうかをカスタムプロパティに保持しておき、次に超 Isolate が実行されたとき、オンならばオフに切り替え、オフならばオンに切り替え、というトグルをやっていたわけです。 でもこんなちょっとしたことでシーンにカスタムプロパティ作るのもどうかなあ、と思っていたんですよ。 でもこの Set/GetGlobal を使えばカスタムプロパティは必要ありません。
ってことで書き直してみると、
if ( GetGlobal( "ChoIsolate" ) )
{
bChoIsolate = false;
}
else
{
bChoIsolate = true;
}
SetGlobal( "ChoIsolate", bChoIsolate );
IsolateSelected( bChoIsolate, 0 );
IsolateSelected( bChoIsolate, 1 );
IsolateSelected( bChoIsolate, 2 );
IsolateSelected( bChoIsolate, 3 );
こんだけ。 カスタムプロパティも必要なく、超スッキリ。新バージョン完成。
いやあ、こんないいもの、早く教えてくださいよ Softimage さん。
ってことで超 Isolate はそのうちバージョンアップさせとくことにしよう。 ま、バージョンアップって言っても上のコードをそのまんまセルフインストール形式の雛形にぶち込むだけですがね。
SetGlobalObject というものもありますね。 こちらは値ではなく、オブジェクトや配列を格納しておけるみたいですね。ほうほう。これも便利そう。
挙動を確かめるために、こう書いてみました。
var oNull = ActiveSceneRoot.AddNull( "null" );
SetGlobalObject( "NullObj", oNull )
var oObj = GetGlobal( "NullObj" );
Logmessage( oObj.size.value );
1行目。シーンルートにヌルをひとつ出し、oNull に格納
2行目。SetGlobalObject コマンドを使って、oNull をオブジェクトとして NullObj に格納
3行目。GetGlobal コマンドを使ってさっき格納した NullObj を oObj の中にオブジェクトとして取得
4行目。oObj にはオブジェクトとしてヌルが取得できているため、ヌルに対する操作は全部自由。 ヌルの持つ size パラメータの値を表示。
1 や 25 や "hoge" などという「値」を格納するのではなく、何かを「オブジェクト」として格納する、というのがこの SetGlobalObject のポイントですね。 オブジェクトとして格納できていれば、オブジェクトに対するメソッド・プロパティなど全て自由ですからね。
で、ためしにこのスクリプトを実行させ、ちゃんとヌルのサイズがログされたことを確認できたら、ヌルのサイズを適当に変えてみて下さい。
次に、このスクリプトの最初の2行をコメントアウトしてから、再び実行させて見てください。
ちゃんと変更後のヌルのサイズがログされましたよね?
2行目までをコメントアウトしたんだから、この2回目のスクリプト実行では SetGlobalObject は実行されていないわけです。 しかし、1回目の実行によって格納された NullObj が生きているために、以降 XSI を終了するまで NullObj を GetGlobal で呼び出せば、中に格納されているヌルにスクリプトからアクセスできるということですね。 オブジェクトとしてアクセスしているんだから、そのオブジェクトが持つ様々なメソッドやプロパティが使用可能です。 今回の場合は、「ヌルオブジェクトにぶら下がるプリミティブオブジェクトの中にあるパラメータのひとつ size にアクセスした」ということになります。
お、なんだか取得じみた話になってきた。
まあいいや、スクリプティングは全て取得なんだから。
ってことで、Set/GetGlobal は今後どんどん活用しましょう。
.
| 固定リンク
コメント