2008年10月30日木曜日

[MLDU] ノートカードの編集

(ありがとうございます。LSLCON ではすでに 60名以上の方に MLDU4RC お試し版をお持ちいただけました。11月2日まで LSLCON 会場で MLDU4RC お試し版を 0L$ プライスレスで配布中です。)

MLDU4 と MLDU3 でのコンセプトの違いは NOTECARD 編集にそれほど時間をかけなくてもダンスを楽しめることかもしれません。
もともとクラブ雷神の LINZOO さんの依頼で作成し始めたとき、MLDU の特徴のひとつである「スムーズなダンスのつなぎ」を実現するために、NOTECARD によるそれぞれのダンス アニメーション再生時間は必須、、、と考えていました。

ですが、、、この NOTECARD 編集、結構手間なんです。(笑

MLDU3 でも NOTECARD に時間指定がないときはデフォルト24秒の再生時間を割り当てていましたが、MLDU4 では以下の機能でさらに時間指定がなくても楽しめるようにしました。

1) [次のダンス]、[前のダンス] ボタンでダンスを切り替えることができる
2) [間隔設定] からダンス アニメーション再生時間を随時変更できる(NOTECARD に再生時間の指定のないものだけが対象)

これにより、NOTECARD 編集の負担が減ったのではないかと思っています。

NOTECARD で指定されたダンス アニメーションはスクリプト リセット時にコンテンツ フォルダ内の存在チェックをします。
もし、NOTECARD に記述しているダンス アニメーションがフォルダ(MLDU)内になければエラー表示をして処理が止まる仕様になっています。

0

[10:28]  MLDU4(Snu): ノートカード 4.DANCES に記載されているアニメーションがありません。 タイプミス、大文字・小文字、半角空白などを確認してください。: weloveyou- boy
[10:28]  MLDU4(Snu): ノードカードに記述されているダンスアニメーションが存在しないので 4.DANCES は処理を中断しました。

というメッセージが表示され、処理が中断しています。
メッセージにあるように、大文字、小文字(Upper/Lower Case) や単純なタイプミスに注意してほしいのですが、なかなかどこが違うのか、何が悪いのかわからない典型的な例がいくつかあります。

1) 半角ブランクが2つあった、、、(SineWave)
SineWave の "4 and 2 the floor" というダンスがあります。そのままノートカードに打ち込むとなぜかエラー、、、
半角ブランクを □ に置き換えると、このダンス、なぜか 4□□and□2□the□floor という、4 と and の間に2つのスペースが入っていました。

2) 読み込めない、読み込めない、、、(SineWave)
これも SineWave なのですが、ダンス名にカンマ(,)が入っていると、、、今の MLDU ではノートカード読みこみの際にダンス名が途中で切られてしまうため、処理を続けることができません。ダンス名と再生秒をカンマで区切る方法をとっているためです。
おおよそ有料のダンス アニメーションは Mod 不可なので、名前を変更することができません。幸い、上記のケースは稀なので、とくに 2) は「ごめんなさい」なのですが、1) の場合などを回避するためになるべくキーボードで名前を打たないで、コピー&ペーストすることをお勧めします。
ダンス アニメーション上で右クリック(Win)でメニューを出して [プロパティ] を選択し、名前をマークして Ctrl+C(Win) でコピーして、ノートカードに貼り付ける方法をとれば、1) のようなトラップにかかりません。またタイプミスの心配もありません。
ノートカードの編集はプロパティから名前の Copy & Paste をしてくださいね。

2008年10月19日日曜日

LSLCON に出展・展示中~

実行委員関係のお友達からお願いされ、まったく気軽に展示してしまいました、、、MLDU4 RC。 (笑
多人数同期ダンスをしたくて作った MLDU3 をこの半年(!!!) くらいかけて、少しずつ改良、機能を追加していったものです。
なので、、、もともとあまり商売っ気がないダンサー/スクリプタですが、、、まだ売ってません(笑

LSLCON JAPAN 2008 の空中会場のテレポート近くのブースで展示中です。

LSLCON01

この数ヶ月、いろいろな方の助けをもらいながら試していたのが時間差ダンスやシャッフルダンス。以前の投稿にも書きましたが、時間差ダンスのアイディアはすぐに出たのですが、やっぱり、この手のものは半分は「エラー処理」になってしまいますね。基本的なところから例外的なところまでいろいろエラー処理をいれてきました。 Mono 化でメモリーに余裕がでたおかげです。

使い方や、MLDU4 の仕組みみたいなことはブースのパネルでも説明しています。(ええ、トリセツがなくて本当に迷惑をかけていた MLDU3 でした、、、)発売するときはこのパネルもいれようかと思っています。

で、、、展示2日目でエラー発見、、、、@@

ダンススロット管理は MLDU のもっとも重要なところです。たとえば、踊りながら落ちちゃった、他の SIM にいってしまった、、、などという場合は使用しているダンススロット(スクリプト)を解放して、次の人が使えるようにしないといけません。
相当このあたりは MLDU3 からテストしてきたつもりだったのですが、今日ブースにいくとだれも踊っていないのに1つのスロットが使用されている状態になっていました。
そこからいろいろと可能性を考えたのですが、どうやればこの状態になるかしばらくわかりませんでした。

llStartAnimation を Avatar に対して行って、もし Avatar がいなければそれによりスロットの解放をするので、llStartAnimation は動いていないと想定。とすると、、、以下の場合があてはまるのではないかと予想しました。
llRequestPermissions により「アバターに動きをつける?」ダイアログが表示されているときに落ちる。

試してみると、、、見事に(?)スロット利用状態のままでした。。。(追記 注2)
たしかに、、、llDialog は使っていませんが、llRequestPermissions によりダイアログは表示されているわけです。通常 listen イベントで受け取るダイアログとは違って、llRequestPermissionsrun_time_permissions イベントでうけとる特殊なダイアログですが、ダイアログはダイアログですよね。

ダンススロットが埋まって解放されないのは致命的なので、、、以下のようなエラー処理をいれました。

llRequestPermissions(id, PERMISSION_TRIGGER_ANIMATION);
llSetTimerEvent(60.0); // 60 秒タイマーをかける
run_time_permissions(integer perm) {
llSetTimerEvent(0.0); //なんらかの返信があったのでタイマーを止める
if (perm&PERMISSION_TRIGGER_ANIMATION) {
llStartAnimation("animation file name");
llInstantMessage(id, "ダンスを止めたい場合は、、、、");
} else reset(); // [ いいえ ] が押されたのでダンススロット解放
}
timer() {
llSetTimerEvent(0.0);
if (llKey2Name(id)!="") {
llInstantMessage(id, "タイムアウトです~");
}
reset(); //ダンススロットの解放サブルーチン
}

ダンスを踊るかどうか聞く前にスロットを一時的に予約して先にタッチした人を優先させるMLDU の管理・アニメ処理方法が、上記のエラー処理を必要としているかもしれません。その部分のロジックを変更するのはつらいので上記の方法をとりましたが、もう1年近くも使ってきて、llRequestPermissions のあとで llSetTimerEvent って、、、ぜんぜん気が付きませんでした。

llRequestPermissions をタイムアウトさせてしまう副作用は、、、、あるんです。
llRequestPermissions によるダイアログへの返答、はい、でも、いいえでも、タイムアウトした後で押すと、、、run_time_permissions イベントに記述されている関数が、、、動きます。@@

これを無効にする方法が、、、、、ないんです。

そんな、、、と思われるでしょうが、この状態でスクリプトをリセットしても、、、、表示されているタイムアウトにしたダイアログに返答すると run_time_permissions のスクリプトが動くのです。。。@@

つまり、、、あくまで想像ですがこの状態になったときの返答への処理は、スクリプトをよんで処理するのではなく、そのブロックがメモリというかスタック上にあって、それを使うような気がします。(注1)

ですが、、、この例外対応、この状態になったら「落ちている」のがほとんどのはず。故意に60秒間放置して、、、という状態の対応は優先順位が低いと考えました。たしかに「はい」を押すと、run_time_permissions イベントのブロックに書かれている初期のダンスアニメーションは始まりますが、それ以上はなにも起こらないので、タイムアウトの際のメッセージに「いいえ、を押して再度ダンスボールを押してください」という運用の対応にしてみました。
スクリプトって楽しいけど、難しいですねぇ、、、

[追記] 注1
基本的に LSL もそのときそのときにスクリプトファイルからスクリプトを読むようなことはしていないはず。なので、該当のスクリプトをリセットしても、そのスクリプトから出された llRequestPermissions に対する処理である run_time_permissons の部分がスタック上クリアされていない、、、というのが正しいのかもしれません。(すみません、本当に想像です。。。) run_time_permissions イベントにある llSay や llStartAnimation は効きますが、上記の例だと reset() というユーザー関数は呼ばれません。さすがにそこはスクリプトのリセットによりクリアされているのでしょうね。

[追記] 注2
注、、、というほどのものではないのですが。(笑
通常のご利用だと、今回示した llSetTimerEvent を llRequetPermissions のあとに入れなくても、スロットが解放されないことはありません。というのも、他のだれかがダンスを開始して管理スクリプトから実行ダンススロットのスクリプトにアニメーション開始命令が出された時点でアバターがいないチェックが入るので、このスロットは解放されます。他の人が使える状態になります。
考えすぎかもしれませんが、、、展示品の状態で「アニメーション許可のダイアログに答えずに落ちる」をスロットの数ぶん10回繰り返されると、スロットが埋まってしまい、このときオーナー(私 ^^)以外はスクリプトのリセットをかけられないので、展示品のダンスだまでは誰も踊れなくなる、、、というのを回避したかったのです、、、。

[追記] 上記のように思っていたのですが、llRequestPermissions に対する返答をしていない状態なので llStartAnimation がダンススロット側で開始されていません。管理スクリプトからダンス開始命令をだしても、ダンススクリプトは保留中のまま、、、でした。なので、やはりこの処理はもしものために必要だと考えたほうがよさそうです、、、

2008年10月4日土曜日

Torley のビデオ チュートリアル

ひさしぶりに Torley のビデオ チュートリアルを見たら知らないことがたくさん!

いろいろな方が翻訳とか紹介とかしていると思うので既知のものもあると思いますが、近々の面白かったものをピックアップしてみました。

Lip Sync
恥ずかしながら知りませんでした。7月23日追加なので情報としては古いですが、いつのまにか Voice Chat とアバターの「口バク」を同期させる機能がついていました、、、


この仕組みからする新たに口バクのアニメーションが追加されているか、既存のものを転用しているのか、ちょっと気になりました。あとで wiki で調べてみようと思います。
[追記] よくよくみたら、、ビデオの中で紹介してますね、、スピーチジェスチャ(笑
[追記] でも、クチパクは別みたいですね (^^;

他のAvatarのFaceLightやパーティクルをオフにする
他の Avatar がアタッチ(装着)しているライトやパーティクルをオフにする方法があるんですね。
時々、横の Avatar の FaceLight がきつくて白浮きする時があるんですが、これでやると回避できますね。(あれ、、、自分の Facelight も、、、消えるのかな?これは後でチェックしてみないと、、)

Windlight プリセットパック
前に見たことがあるような気がしますが、Torley が作った Windlight のプリセットのダウンロードと設定の仕方を説明しています。 Windlight は細かい設定ができる反面、個々の調整のバランスが難しいと感じるときもあるので、このようなプリセット集はうれしいですね。

お月様を変える
ある意味、、、期待していたものと違った(笑 のですが、夜に出てくる月を変える方法を紹介しています。

やはり定期的にチェック必須ですね。