Category:LSL ノートカード

From Second Life Wiki
Jump to navigation Jump to search

ノートカードとパラメタ

編集可能にしてあるパブリックドメインのスクリプトでは、オプションのパラメタ (例えば、たんすを開ける音など) はたいていスクリプトを編集することですぐに設定変更されるようになっています。

販売されているスクリプト商品は、しかしながら、しばしばノートカードを導入し、購入者がそれぞれの事情に応じてパラメタを変更することができるようにしてあります。こうすることで、所有権のあるスクリプトを編集可能で配る必要がなくなり、また購入者がスクリプトを修正する必要 (もしあるとしたら、ぞっとするでしょう) もなくなります。

ノートカードから情報を取得するために、llGetNotecardLine 関数を使用します。スクリプトがそこを通ると、 dataserver イベントがそれをキャッチします。そのイベントの中で、情報を解析して変数に割り当てます。この手順を解説したものがここにあります。Notecard_reading

制限

ノートカードにはいくつかの制限事項があります。

  • 64KB
  • スクリプトによって読まれる際は、
    • 各行で最初の 255 バイトまでが返却されます。
    • アセットが埋め込まれていてはいけません。
  • 不変です。 (不変なように見えないかもしれませんが、そうなのです)

ノートカードの不変性

ノートカードを作成すると、簡単にノートカードを編集したり保存できたりします。しかし Second Life のアセットサーバの内部では、オブジェクトとしてのノートカードは不変です。つまり、ノートカードを編集すると、実際には元のノートカードと異なるキーをもつ新しいノートカードを作成することになります。(アバターまたはオブジェクトのインベントリは、元のノートカードの参照をもたなくなります。 -- 新しいノートカードのキーを参照するように更新されます。) ユーザはおそらく同じノートカードオブジェクトだと思い込むでしょうが、実際は全く新しいオブジェクトです。

この性質をスクリプトの中でうまく利用して、ノートカードの変更を検出し、インベントリの他のオブジェクトの変更を無視することができます。以下のスクリプトはそのテクニックを例示しています。スクリプトが開始するか、ノートカード自体が変更されると、設定ノートカードが読み込まれます。(新しいキーをもち、それがきっかけとなって変更が読み込まれるようになります。) オブジェクトのインベントリの中で他のものが変更されると、その変更は無視され、設定ノートカードは再読込されません。これで多くのオーバーヘッドを防いでいます。 このスクリプトはオブジェクトのインベントリの中に「Configuration」という名前のノートカードがあり、1 行以上のテキストがノートカードに載っていることを前提としています。 <lsl>key kQuery; integer iLine = 0; string notecard_name = "Configuration"; key notecard_key = NULL_KEY;

config_init() {

   key nc_key = llGetInventoryKey(notecard_name);
   if (nc_key == notecard_key)
   {
       // 設定ノートカード以外の、他のアイテムが変更されました。
       return; // この場合、ノートカードの読み込みをスキップします。
   }
   // 新しいノートカードのキーを覚えます。
   notecard_key = nc_key;
   kQuery = llGetNotecardLine(notecard_name, iLine);

}

default {

   state_entry()
   {
       // 起動時にノートカードを一通り読み込みます。
       config_init();
   }
   changed(integer change)
   {
       if (change & CHANGED_INVENTORY)         
       {
           // インベントリが変更になったらノートカードを読み込みます。
           config_init();
       }
   }
   
   dataserver(key query_id, string data) 
   {
       if (query_id == kQuery) 
       {
           // ノートカードの 1 行です。
           if (data == EOF) 
           {
               llOwnerSay("Finished reading configuration.");
           } 
           else 
           {
               // TODO: ここでノートカードの行を処理します。今はオーナーに知らせるだけにしてあります。
               llOwnerSay("Read notecard line: " + data);
               // カウンタをインクリメントします。
               ++iLine;
               //ノートカードの次の行をリクエストします。
               kQuery = llGetNotecardLine(notecard_name, iLine);
           }
       }
   }

} </lsl>

共有しているノートカードへのアクセス

共有しているプロジェクトの過程で、しばしば自分の所有しているオブジェクトの中のノートカードにチームメンバーがアクセスできるようにする必要があるかもしれません。もしくは、他人の持っているオブジェクトの中のノートカードにアクセスする必要があるかもしれません。

これを可能にするには、Editing someone else's scripts and notecards を参照してください。


ノートカードに埋め込まれているアセット

ノートカードにはテクスチャやランドマークのような埋め込みアセットが含まれていることがあります。

これらはスクリプトからはアクセスできません。

ヒント!あるノートカードの中身、テキストと埋め込みオブジェクトは、手作業で別のノートカードにコピーすることができるように思えますが、実際にはコピー先のノートカードは保存できなくなります。インベントリの中にドラッグして、そこから別のノートカードにドラッグしなければなりません。

This category currently contains no pages or media.