ブログ

LSLのプログラミングスタイル

2008年04月08日(火)17:52|天方

LSLのプログラミングスタイル

前回は、LSLの特徴をざっくりと説明しました。 ちょっと見ればわかりますが、LSLの特徴について網羅的には説明していません。 LSLの網羅的な情報については、いろいろな場所で扱われているので、このシリーズでは、扱わないつもりです。 このシリーズでは、16KBのメモリ制限のあるなかで、どのようにLSLのプログラムをするべきか?について話したいと思います。

LSLでは、1スクリプト当たりに16KBのメモリ空間を割り当てます。 16KBを超える場合には、スクリプトファイルを分割する必要があります。 複数のスクリプトファイルをどのようにまとめるかというと、プリム(Second Lifeの中で作れる物体)のコンテンツ欄に複数のスクリプトを持たせることで実現できます。

ただ、あるスクリプトファイルから他のスクリプトファイルの呼び出すを行うためには、他の言語では考えられないくらいのオーバーヘッドがあります。例として、同じオブジェクトに含まれている二つのスクリプト senderとreceiverを書いて見ましょう。

※日本語のコメントは補足情報として書いていますが、いまのところSecond Life上では日本語を記述することはできないです。

このスクリプトを設定したプリムをクリックすると、「Second Life is Wonder World」というメッセージが、チャット欄にでます。

  • sender
    integer SCRIPT_SENDER = 1;   // 送信側スクリプトのID
    integer SCRIPT_RECEIVER = 2;  // 受信側スクリプトのID
    string CR = "n";            // 改行
    // デフォルトのステータスについての定義
    default
    {
            // プリムにタッチされた場合のイベント
            touch_start(integer total_number)
            {
                    // メッセージの送信
                    // 第一引数 メッセージの送信先。
                    // LINK_THIS : 自分のプリムのスクリプトにのみメッセージを送信する
                    // 第二引数 メッセージで送りたいinteger型の値 送信側スクリプトID。
                    // 第三引数 メッセージで送りたいstring型の値
                    //             受信側スクリプトIDとメッセージを改行区切りでセット。
                    // 第四引数 メッセージで送りたいkey型の値 使わないので、NULL_KEYをセット。
                    llMessagedLinked(LINK_THIS,
                                      SCRIPT_SENDER,
                                      (string) SCRIPT_RECEIVER + CR
                                      + "Second Life is Wonder World",
                                      NULL_KEY);
            }
    }
    
    
  • receiver
    integer SCRIPT_SENDER = 1;   // 送信側スクリプトのID
    integer SCRIPT_RECEIVER = 2;  // 受信側スクリプトのID
    string CR = "n";            // 改行
    
    // デフォルトのステータスについての定義
    default
    {
    
            // llMessagedLinkedのメッセージを受信した場合のイベント
            // 第一引数 送信側プリムの番号
            // 第二引数 メッセージで送られてきたinteger型の値
            // 第三引数 メッセージで送られてきたstring型の値
            // 第四引数 メッセージで送られてきたkey型の値
    
            link_message(integer senderNum, integer senderScriptNum, string message, key id)
            {
    
                    // messageを改行を区切りとして分割して、linesにリスト型で格納
                     list lines = llParseString2List(message, [CR], []);
    
                    // messageの第一要素をinteger型に変換
                    integer receiverScriptNum = llList2Integer(lines, 0);
    
                    // このスクリプト宛のメッセージか?
                    if (receiverScriptNum == SCRIPT_RECEIVER) {
    
                            // どのスクリプトからのメッセージか?
                            if (senderScriptNum == SCRIPT_SENDER) {
    
                                    // 自分にのみメッセージを表示
                                    llOwnerSay(llLIst2String(lines, 1));
                            }
                    }
             }
    }
    
    

どうでしょうか。メッセージを出すだけでもそれなりのコードを記述しなければなりません。 この見本は、本来は、スクリプトが複数(数十個)あって、協調して動作するような場合を前提に組まれています。 ですので、メッセージを表示するだけにしては、おおげさなコードになってしまっています。ただ、こういった仕組みを最初につくっておくことが、16KBを超えるスクリプトを作る上でどうしても必要になってきます。

このとき、1スクリプト1機能として、メッセージにより連携するような仕組みをつくることが大きいLSLのプログラムを作るコツになります。

また、SCRIPTSENDERなどのIDを自分でつくっていますが、linkmessageのsenderNumを使えば同じようにスクリプトを識別できるのではと考えた人もいるのではないでしょうか。残念ながら、この番号はプリムの番号になるので、同じプリム同士であれば、同じ番号になってしまいます。また、プリムの番号はSecond Lifeによって決められてしまうので、ちょっとしたこと(プリムを結合する順番)で変わってしまい、使いずらい値となっています。ここでは自分で定数をつくって利用することをお勧めします。

以上が16KBを超えたLSLを作るためのプログラミングスタイルの基本になります。

次回は、メッセージの形式について深く取り上げたいと思います。

この記事に関するお問い合わせはこちら

ページの先頭へ