ソラマメブログ

2008年07月15日

ステート、複雑なスクリプトを構成するときの注意、LSL

失敗しやすいポイントについて振り返ってみました。

だんだんスクリプトも長く書けるようになった、 作業をいくつかのステートに分けて書くと便利だ^^ わかりやすいと
思っていると、そこには、私の知らない落とし穴が ありました^^;


動作をON-OFFさせる、 切り替えるためのに必要なもの 参考

タッチをしたら、ダイアログを表示し選択できると考えた場合、ステートは1つで作成できるものです。

ステートで、作業や処理を区別することのメリットは、プログラムを細かい単位にできる、
スクリプトが長くなりすぎたり、メモリ不足になったり、する時に分割するとき、など

ユーザー関数なども同じように、同じような機能・作業・商品を作成したり、修正やカスタマイズする時に役立つ点が多いと思います。 汎用的な、 いろいろ使いまわしができそうな機能として作成すると、より便利です。



☆☆☆★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
では、
1つのステートで作業できることを、わざわざ複数に分割する必要は、ありませんが、 どのように作業・動作しているのか?理解できるか? 実験しておきましょう。
ここでもいくつかの失敗・注意するポイントがあります、 複雑なスクリプトを構成するときに、前もって実験してみては?いかがでしょう



☆☆☆★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
1)1つのスクリプト・ファイルでは、ステートは、1つだけが、アクティブになっていること、 
そのほかのステートは停止・休眠中といったイメージですね、



2)スクリプトが保持できるもの・パラメータ ユーザー定義したものでないものについて

スクリプトの中で変数を使用すれば、数値などを記憶できます、 ユーザーはグローバル変数・ローカル変数を利用できます。
それら以外に、たとえばパーミッションなどのような、システムが固有に保持して管理いているものがあります。 アニメを再生したい場合は 、アニメ再生しても良いか?パーミッション取得したら、システムが固有に保持してくれます、  ステートには関係なく、いつでも参照したり利用できます。

もしどこかのステートで変更したら上書きされるもので、スクリプト・ファイルで1つしかシステムが固有に保持してくれないものです。



3-1)スクリプトで保持されるものでは、タイマー、時間に関する数値は ステートに影響されないものです。
たとえば、 実験☆
タイマーを起動したままで ステートが移行したらどんな動作結果になるでしょう?

ステートA:タイマーを10秒に設定したら 10秒置きにイベントが発生します。「時間だよ」とコメントをしつこく出すことができます。
タッチしたら ステートBに移行しましょう。

ステートB:タイマーの設定は何もしませんが、 「とまらないよ^^ もう一度 タッチ」とコメントをしつこく出すことができます。
タッチしたら ステートCに移行しましょう。

ステートC:タイマーを停止しましょう 0秒に設定、 タイマーイベントは発生しませんね
タッチしたら ステートAに移行しましょう。
 

ステートには影響されない、スクリプト・ファイルで1つ保持されているものの例です。
したがって止めるまで、 タイマーは動作しています。


3-2)逆に ステート移行に影響するもの、もあります LISTEN SENSOR MONEYなど移行したら、イベントは発生しなくなります、 初期化されてしまうという感じでイメージですね、
ステートを越えてもイベントが発生することでエラーが起きそうなものは、 安全のためにできないという感じですね。

ステートA:LISTENの開始、 聞き取りをしています ちゃんねる:0
タッチしたら ステートBに移行しましょう。

ステートB:LISTENの開始、 聞き取りをしています ちゃんねる:1
タッチしたら ステートCに移行しましょう。

ステートC:LISTENの開始、 聞き取りをしています ちゃんねる:0・1・2
タッチしたら ステートAに移行しましょう。

ステートが変わるときに、聞き取りを中止していないが、基本的なきまりとして終了しています。 
ステートBでは、ちゃんねる:0を停止していないのですが 聞き取りできません、
ステートCでは、ちゃんねる:0・1・2 を聞く準備をきちんと全部・書いておけば、聞くことができます。

ダイアログで聞き取りをするチャンネルや パブリックチャンネルのオーナーの直接のコマンドとして聞き取りをするなど、
複数のチャンネルを聞き取ることは、たびたび必要になります、 ステートで作業を区別するときには、注意が必要なポイントです。


☆☆☆★★
いつのまにか 日本語訳も増えていますね^^ 機械翻訳のようですが、読みやすいと思います。
llListenRemove(
llListenControl(
http://wiki.secondlife.com/wiki/LlListenRemove/ja
http://wiki.secondlife.com/wiki/LlListenControl/j
ステート変更もしくはスクリプトリセット時、全てのlistenは自動で閉じられます。
ステート変更あるいはスクリプトリセットで、すべてのlistenは自動で除去されます。
ステート変更は全listenの開放のショートカットのように使えます。
numberがすでに開放されているか無効の場合は、エラーは発生しません。




4)プリムが保持できるもの・パラメータ、パーティクルシステムなど フロート文字、 座る位置、 かめら位置など、
1つのぷりむで 2つの数値を設定できないことです、 あとで設定したものが有効になります、上書きされます。
プリムの色・形・透明度が 1つしか記憶・保持できないことと同じです。
パーテイクルは1つのプリムから 2SYSTEMを動作できません、

古いものが停止されたわけではなく、 有効でないということです。
アニメの再生などでも、 後で再生したものが動作しますが、 古いほうも動作しているままであることに 似ています。

スクリプトで、透明にする作業と、 表示する作業が別に処理されて うまく再現できないエラーや
透明にしたいのに、表示する作業が常時動作していたりして 一瞬しか透明にならないエラーになりやすいです


5)オブジェクトが保持できるもの・パラメータ、 名前、オーナー所有者、編集許可パーミッション、



☆☆☆★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
ステートや、作業を分割したり、スクリプト・ファイルを複数動作させるときに、 なにか? イメージと違う エラー 動作がおかしいときに、

これらの項目について、注意してみてください
どこのスクリプト・ステートからも変更すること作業することが、できてしまうことですが、
逆に、そのほかのスクリプト・ステートでは、変更させていないのに変化して違うものになっていることになります。

うまく共有し使用しなければいけないことと覚えておきましょう。

☆☆☆★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
☆実験タイマー と タッチ
default
{
    state_entry()
    {
        llSay(0, "タイマー起動");
        llSetTimerEvent(1.0);
    }
    touch_start(integer total_number)
    {
        llSay(0, "ステート Bへ");
        state testB;
    }
    timer()
    {
        llSay(0, "時間だよ");
    }
}
state testB{
    state_entry()
    {
        //タイマーについて設定・変更をしないと? どうなるでしょう?
        //llSetTimerEvent(10.0);
    }
    touch_start(integer total_number)
    {
        llSay(0, "ステート Cへ");
        state testC;
    }
    timer()
    {
        llSay(0, "とまらないよ^^ もう一度 タッチ");
    }
}
state testC{
    state_entry()
    {
        //タイマーについて設定・変更をしないと? どうなるでしょう?
        llSetTimerEvent(0.0);//停止しておきます。
    }
    touch_start(integer total_number)
    {
        llSay(0, "ステート Aへ");
        state default;
    }
    timer()
    {
        llSay(0, "とまりましたか?");
    }
}


☆☆☆★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
☆実験LISTEN タッチと 会話ちゃんねる 0 1 2
default
{
    state_entry()
    {
        llSay(0, "0:チャンネル");
        llListen(0,"","","");
    }
    touch_start(integer total_number)
    {
        llSay(0, "ステート Bへ");
        state testB;
    }
    listen(integer ch, string name, key id, string message)
    {
        llSay(0, (string)ch+"ch:LISTEN=="+message);
    }
}
state testB
{
    state_entry()
    {
        llSay(0, "1:チャンネル");
        llListen(1,"","","");
    }
    touch_start(integer total_number)
    {
        llSay(0, "ステート Cへ");
        state testC;
    }
    listen(integer ch, string name, key id, string message)
    {
        llSay(0, (string)ch+"ch:LISTEN=="+message);
    }
}
state testC
{
    state_entry()
    {
        llSay(0, "0:1:2:チャンネル");
        llListen(0,"","","");
        llListen(1,"","","");
        llListen(2,"","","");
    }
    touch_start(integer total_number)
    {
        llSay(0, "ステート Aへ");
        state default;
    }
    listen(integer ch, string name, key id, string message)
    {
        llSay(0, (string)ch+"ch:LISTEN=="+message);
    }
}

参考
★★★☆☆★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
照明を作ろう(初級スクリプト第六回)
http://miz.slmame.com/e1752.html

★★★☆☆★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
ステートのこと(スクリプト初級第十九回)
http://miz.slmame.com/e3528.html



タグ :LSL

 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。