Adsense

2008年5月19日月曜日

セカンドライフのアニメーションを操る (番外編)

512 日記念(?) ということで Sine Wave Island で女性用、男性用のダンス・アニメーションがフリーで配られていて、大変な混雑になっています。

0

SIM に入るのも大変なのですが、SIM に入った後でアニメーションを受け取るのも大変です。
単純に SIM が重い、ラグだからなのかな、、、と思ったのですが、、、どうもスクリプトに問題ありそうな気がします。

インベントリの中をちょっと見てみました。
1 

配るダンス・アニメーション・ファイルが2つと、1つのスクリプトが入っています。プリムはリンクしていないようですから、このスクリプトのみだと思います。
たまたま運よく weloveyou-girl の(というか、girl しか手に入らなかった・・・)ダンスを貰うことができましたが、そのダイアログの流れは以下、、、、
1) タッチしても反応しないときが多く、根気強くがんばると以下のダイアログが表示されます。
2
Male (男性)用、Femal(女性)用のどちらがよい?と聞いています。
2) 好きなほうのボタンを押すと、しばらくして以下のダイアログが表示されます。
3
もちろん、[維持] を押します。これでしばらくするとインベントリにアニメーションファイルが追加されます。

プリムのコンテンツフォルダには1つのスクリプト、そして上記の流れ、、、多くのアバターが一斉にクリック(Touch)、、、場合によっては誤動作を発生させる、処理がたまる可能性があるスクリプトではないかと思います。

事実、Female をもらったあとで何度 [Male] を押しても [Female] しかもらえなかったり、、、(おかげで、、、weloveyou-girl が8個も、、、)

たぶん、llDialog を使わず、単純に男性用のアニメーションを配るベンダーと女性用のアニメーションを配るベンダーにしてしまったほうがよかったのだと思います。上記 2) だけであれば、スクリプトいらずで、料金を 0L$ にするだけでいいわけですからね。
SIM に 40 の avatar がやってきて、一斉にあるパネルをクリックしている状況なんてなかなかないですから、、、ただ、こういう状況が想定される場合の touch_start と llDialog はちょっと注意しなくてはいけません。

touch_start イベントではタッチしたアバターの数をうけとることができます。 integer total_number がそれにあたります。

touch_start(integer total_number)
{
    llSay(0, "Touched.");
}

だれがタッチしたかを知るためにおおよそ llDetectedKey(0) とやりますが、これって最初に触った人、、、最初???と思われるでしょうし、ほとんど llDetectedKey(0) で問題ないのですが、こんなに一斉にタッチされるとなると、、、タッチを無視されるアバターも相当発生してしまいますね。つまり llDetectedKey(1) や llDetectedKey(2) は存在するのです。

touch_start(integer total_number)
{
     llDialog(llDetectedKey(0), "Hi, let us know what", ["Male", "Female"], 12345);
     llSetTimerEvent(10.0); //タイマーでのキャンセルもやってないような・・・
}

こんな感じなのかなぁ、、、
やるなら

touch_start(integer total_number)
{
    integer i = 0;
    for (;i<total_number;i++)
    {
       llDialog(llDetectedKey(i), "Hi, let us know what", ["Male", "Female"], 12345);
    }
}

これでその瞬間にタッチしたアバター全員にダイアログを投げる処理になります。
そして、Dialog の返信をうけとって処理する Listen のイベントは、上記のサンプルより チャンネル 12345 しか聞いていないとすれば、

listen(integer channel, string name, key id, string message)
{
    if (message == "Male")
    {
        llGiveInventory(id, "weloveyou-boy");
    } else if (message == "Female")
    {
        llGiveInventory(id, "weloveyou-girl");
    }
}

とにかく、message の Male/Female を判断して、無条件に llGiveInventory を使ってダイアログの返信をくれた id に対してファイルを投げる、、、
うわぁ、、、なんかキューにたまりそう・・・・

チャットの遅延って混んでいる SIM ではよく見かけるし、、、この場合遅延があっても大丈夫でしょうが、、、

で最終的には、、、boy もゲットしましたが、、、、その場である Avatar が「Someone has the dance girl? I have the boy.」(だれか girl 持ってる?私は boy を持っているんです)といっていたので、girl と boy を交換しました。(笑
配付されているアニメはコピー可なんです。
ですから、、、、今は持っている人からもらうのが一番かも。もうしばらくすると落ち着くとは思いますが。。。
それにしても Sine Wave 、、、すごい人気ですね~。