2008年11月4日火曜日

スクリプトの話(15)〜変数の初期化

前回は変数の値が有効に使える範囲
「スコープ」について説明しました。
これと関連して知っておかなければならないのが
変数の初期化のことですね。

例えばグローバル変数を使う時、
いくつかの処理で値を変えて使いたい場合は
その都度、その処理に都合のよい値に変えてあげる、
代入し直してあげなければなりません。

例えば、タッチした時だけ "I love you!" と言わせたいのであれば、

string strMessage = "Hello, Avatar!";

default {
  state_entry(){
    llSay(0, strMessage);
  }

  touch_start(total_number){
    strMessage = "I love you!";
    llSay(0, strMessage);
  }
}

のように、定義し直してあげる必要がありますね。
特にグローバル変数を使う時は、
現在その変数の値(中身)がどうなっているか、
これからやろうとする処理で変更しておく必要がないか
確認しておくことが必要です。

ところで、上の例では一番最初に
敢えて「=」で具体的な値を代入していますが、
これがなかったらどうなるでしょう?
例えば次の例で、

string strText;
vector vecTextColor;
float fltAlpha;

default {
  state_entry() {
    llSetText(strMessage, vecTextColor, fltAlpha);
  }
]

よくあるフローティング・テキストのスクリプトですが、
果たしてこのテキストは表示されるでしょうか?
されるとしたら何色で、どんなメッセージでしょうか?

そう。
メッセージは何も見えません。
何故なら、定義された3つの変数は
何れも初期値が指定されていないので、
文字列は何もない文字列 ""、
ヴェクトル型の色は <0.0, 0.0, 0.0>、つまり「白」、
フロート型の不透明度は 0.0、つまり「完全に透明」、
となっているからです。

こんなこと、わかり切ったことのようですが、
何故敢えて書いているかというと自分でも失敗したからです。w
普通のオブジェクトならいいのですが、HUDの場合、
ログインするごとに default / state_entry() が走ります。
ということは!
以前、世界時計HUDを作った時に、そのプロトタイプでは、
折角文字色を好みの色に変更できるのに、
ログインし直すとまた白に戻ってしまう、という現象が起きたのです。
何も手を打たなければ、上のフローティング・テキストと
同じようなことになってしまい、
必ず色は白になりますね。^^;

これを回避するには、最後に変更した色を覚えさせておいて、
その色を state_entry() の時に読ませるようにする工夫がいりますが、
まぁ、これは別の機会にお話することに致しましょう。
今日は、変数を使う場合には初期化する必要がないか、
逆に初期化されていないか、
スクリプトの結果が違ったり動かない場合は、
そこをチェックする必要があることだけ覚えておいて下さい。

     *   *   *

今回までのところで、
スクリプトが動かないという状況を避ける為の方法、
また、動かない場合のチェックの仕方についての話は終わりにします。
当初は6回くらいで終わらせるつもりでしたが、
書き出したら結構長くなっちゃいましたね。^^;

次回からは、これまでの話を元に、
複雑な処理をする場合などの Tips を
いくつかご紹介していきたいと思います。
それでは、また!

     *   *   *

P.S. llSetText() について補足説明しておきます。

一度フローティング・テキストを設定したけれども
やっぱり消したい、という場合、
llSetText() そのものをスクリプトから削除しても
フローティング・テキストは消えません。
これ、すごい不思議なんだけど。w

と、ここまで書けば、上の記事を読んだ方はおわかりですね?
一度セットしたフローティング・テキストを消すには
llSetText() を生かして次のようにします。

  llSetText("Hello, Avatar!", <0.0, 0.0, 0.0>, 1.0);
       ↓ 下のように変更!
  llSetText("", <0.0, 0.0, 0.0>, 1.0);

そう! 表示していた文字列だけを消せばいいのです!
ご存知の方には何でもないことでしょうけど、
これもまた僕が失敗したことなので、
敢えて説明しておきますね。。。^^;

No response to “スクリプトの話(15)〜変数の初期化”

Leave a Reply