Difference between revisions of "Category:LSL Notecard/ja"

From Second Life Wiki
Jump to: navigation, search
(Redirected page to Category:LSL ノートカード)
 
m
Line 1: Line 1:
#Redirect [[:Category:LSL ノートカード]]
+
{{Multi-lang}}
 +
{{LSL Header/ja|ml=*}}
 +
{{LSLC/ja|}}{{LSLC/ja|Inventory}}{{LSLC/ja|Communications}}
 +
 
 +
== ノートカードとパラメータ ==
 +
 
 +
編集可能にしてあるパブリックドメインのスクリプトでは、オプションのパラメータ (例えば、たんすを開ける音など) はたいていスクリプトを編集することですぐに設定変更されるようになっています。
 +
 
 +
販売されているスクリプト商品は、しかしながら、しばしばノートカードを導入し、購入者がそれぞれの事情に応じてパラメタを変更することができるようにしてあります。こうすることで、所有権のあるスクリプトを編集可能で配る必要がなくなり、また購入者がスクリプトを修正する必要 (もしあるとしたら、ぞっとするでしょう) もなくなります。
 +
 
 +
ノートカードから情報を取得するために、{{LSLG/ja|llGetNotecardLine}} 関数を使用します。スクリプトがそこを通ると、 {{LSLG/ja|dataserver}} イベントがそれをキャッチします。そのイベントの中で、情報を解析して変数に割り当てます。この手順を解説したものがここにあります。[[Notecard_reading]]
 +
 
 +
== 制限 ==
 +
 
 +
ノートカードにはいくつかの制限事項があります。
 +
* 64KB
 +
* スクリプトによって読まれる際は、
 +
** 各行で最初の 255 バイトまでが返却されます。
 +
** アセットが埋め込まれていてはいけません。
 +
* 不変です。 (不変なように見えないかもしれませんが、そうなのです)
 +
 
 +
== ノートカードの不変性 ==
 +
 
 +
ノートカードを作成すると、簡単にノートカードを編集したり保存できたりします。しかし Second Life のアセットサーバの内部では、オブジェクトとしてのノートカードは不変です。つまり、ノートカードを編集すると、実際には元のノートカードと異なるキーをもつ新しいノートカードを作成することになります。(アバターまたはオブジェクトのインベントリは、元のノートカードの参照をもたなくなります。 -- 新しいノートカードのキーを参照するように更新されます。) ユーザはおそらく同じノートカードオブジェクトだと思い込むでしょうが、実際は全く新しいオブジェクトです。
 +
 
 +
この性質をスクリプトの中でうまく利用して、ノートカードの変更を検出し、インベントリの他のオブジェクトの変更を無視することができます。以下のスクリプトはそのテクニックを例示しています。スクリプトが開始するか、ノートカード自体が変更されると、設定ノートカードが読み込まれます。(新しいキーをもち、それがきっかけとなって変更が読み込まれるようになります。) オブジェクトのインベントリの中で他のものが変更されると、その変更は無視され、設定ノートカードは再読込されません。これで多くのオーバーヘッドを防いでいます。 このスクリプトはオブジェクトのインベントリの中に「Configuration」という名前のノートカードがあり、1 行以上のテキストがノートカードに載っていることを前提としています。
 +
 +
<source lang="lsl2">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)
 +
    {
 +
        // Some other inventory item changed, not the configuration notecard.
 +
        return; // Skip reading the notecard in this case.
 +
    }
 +
    // Remember the new notecard key from now on.
 +
    notecard_key = nc_key;
 +
    iLine = 0;
 +
    kQuery = llGetNotecardLine(notecard_name, iLine);
 +
}
 +
 
 +
default
 +
{
 +
    state_entry()
 +
    {
 +
        // Read the notecard once at startup.
 +
        config_init();
 +
    }
 +
 
 +
    changed(integer change)
 +
    {
 +
        if (change & CHANGED_INVENTORY)       
 +
        {
 +
            // Read the notecard when the inventory has changed.
 +
            config_init();
 +
        }
 +
    }
 +
   
 +
    dataserver(key query_id, string data)
 +
    {
 +
        if (query_id == kQuery)
 +
        {
 +
            // this is a line of our notecard
 +
            if (data == EOF)
 +
            {
 +
                llOwnerSay("Finished reading configuration.");
 +
            }
 +
            else
 +
            {
 +
                // TODO: handle notecard line here.  For not just inform the owner.
 +
                llOwnerSay("Read notecard line: " + data);
 +
                // increment line count
 +
                ++iLine;
 +
                //request next line of notecard.
 +
                kQuery = llGetNotecardLine(notecard_name, iLine);
 +
            }
 +
        }
 +
    }
 +
}
 +
</source>
 +
 
 +
== 共有しているノートカードへのアクセス ==
 +
 
 +
共有しているプロジェクトの過程で、しばしば自分の所有しているオブジェクトの中のノートカードにチームメンバーがアクセスできるようにする必要があるかもしれません。もしくは、他人の持っているオブジェクトの中のノートカードにアクセスする必要があるかもしれません。
 +
 
 +
これを可能にするには、[[Editing someone else's scripts and notecards]] を参照してください。
 +
 
 +
== ノートカードに埋め込まれているアセット ==
 +
ノートカードにはテクスチャやランドマークのような埋め込みアセットが含まれていることがあります。
 +
 
 +
これらはスクリプトからはアクセスできません。
 +
 
 +
ヒント!あるノートカードの中身、テキストと埋め込みオブジェクトは、手作業で別のノートカードにコピーすることができるように思えますが、実際にはコピー先のノートカードは保存できなくなります。インベントリの中にドラッグして、そこから別のノートカードにドラッグしなければなりません。
 +
 
 +
[[Category:Assets/ja]]

Revision as of 04:50, 18 December 2015

ノートカードとパラメータ

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

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

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

制限

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

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

ノートカードの不変性

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

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

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)
    {
        // Some other inventory item changed, not the configuration notecard.
        return; // Skip reading the notecard in this case.
    }
    // Remember the new notecard key from now on.
    notecard_key = nc_key;
    iLine = 0;
    kQuery = llGetNotecardLine(notecard_name, iLine);
}
 
default
{
    state_entry()
    {
        // Read the notecard once at startup.
        config_init();
    }
 
    changed(integer change)
    {
        if (change & CHANGED_INVENTORY)         
        {
            // Read the notecard when the inventory has changed.
            config_init();
        }
    }
 
    dataserver(key query_id, string data) 
    {
        if (query_id == kQuery) 
        {
            // this is a line of our notecard
            if (data == EOF) 
            {
                llOwnerSay("Finished reading configuration.");
            } 
            else 
            {
                // TODO: handle notecard line here.  For not just inform the owner.
                llOwnerSay("Read notecard line: " + data);
                // increment line count
                ++iLine;
                //request next line of notecard.
                kQuery = llGetNotecardLine(notecard_name, iLine);
            }
        }
    }
}

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

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

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

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

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

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

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

Pages in category "LSL Notecard/ja"

The following 4 pages are in this category, out of 4 total.