ライブ用照明作りのお手伝い

チャマ

2009年04月23日 18:51


このまえ、ある方のところでちょっと照明の設定をお手伝いしたときに、意外にスクリプトなどに苦手意識を持ってる人が簡単なことを分からないこともあるのだな(ごめんなさい)、と思って、実はすごく単純で分かりやすいことなので、この際ここで書いてみようと思いました。
わたしも、職業はプログラマをやっていますが、もともと学校などはまったく理系でもなく、コンピュータとは縁の遠い存在でして、最初会社に入ったときはまるで分からない中から少しずつ手さぐりでやっていたので、「分からない」と思っている人の感じはよく分かります。大体、このテの話には小難しそうな用語がたくさん出てきて、それだけでうんざりさせられるものなのです。
そういうので、私も何度もいやになりましたからね。
これから話そうとする内容も、セカンドライフでは「プリム間通信」と呼ばれているもの(注*1)で、なんだ?通信だ?いやだ、そんなの分からない、となってしまいそうな言葉が使われています。だいたい私は「プリム」というものも、最初は拒絶反応しましたもんね。

 注*1 厳密にはプリム間通信というとllMessageLinked()というのを使ったものなのだと思いますが、結果的にここではそれほど大きな差は無いのと、llMessageLinkedだとリンクしたプリム間でしか通信できないし、結果、今回のやり方でやりたいことができているので(笑)これを無視して話を進めます。

「通信」と言っても、実はセカンドライフで誰もがやってるチャットとおんなじものです。と、いうか(別の方法もありますが)、ここでいう内容は、チャットそのものです。アバター同士がチャットするのではなく、ボックスとか、照明とか、スイッチとか、なんでもいいですけどアバター以外のもの(ま、プリムですかね)同士がしゃべったり、それを聞いたりするのです。
ただ、プリムとかオブジェクトは人間が裏にいるアバターと違っておバカさんなので、「こうやって、こうなったら、こうしゃべるんだぞ」ということをスクリプトに書いて教えておいてあげないといかんというわけです。

今回、お手伝いしたのは非常に簡単なもので、ある方が手に入れた照明が、その色を変更したりOffにしたりするのを、アバターがチャットで「/7 red」とか、しゃべらなくちゃならなかったのを、赤のスイッチを押すと赤に、緑のスイッチを押すと緑に、というようにボックスで作ったスイッチにタッチすればいいようにしただけです。
照明側(光源)のプリム(オブジェクト)のコンテンツの中には、mizさんのブログから持ってきたスクリプトが入っていたと思います。光源側のモトスクリプトは以下でごらんください。
mizさんのブログ (注*2)

 注*2 このmizさんのブログは、すんごくやさしく、詳しく、いろんなスクリプトに関する知識と知恵が詰まっているので、スクリプトのことをもっとちゃんと知りたい方は、私のブログなんか見てないで(笑)こちらをごらんになるといいと思います。私もすごくたくさん参考にさせていただきました。

このスクリプトはおおよその内容としては、まずユーザーがプリムにタッチすると、30秒間だけプリムがチャットを聞いていてくれるので、その間に「/7 red」とか「/7 off」とチャットで打つと、オブジェクトの色が変わったり消えたりするというものでした。
これはこれで、使い方が自分にあっていれば充分に使えるものなのですが、キーを打つよりのが得意中の得意ではないので、スイッチみたいなもので押したい、とかそのスイッチも赤とか緑とかの色がついてたほうが分かりやすいのになぁ、とか、あとは設置した場所が天井の高ーいとこだったのと透明のプリムなので見失うと、最初のタッチがつらい、とか、30秒間だけしか聞いていてくれないと、キー入力が間に合わない、とかいったことがあって、じゃ、直してみようとなったわけです。

まずは、「タッチすると30秒間だけ聞いてくれる」というのを、「いつでもおk、聞いてますよ」に変えたい。
これは、スクリプトの中のllSetTimerEventと書いてある行とllListenRemoveと書いてある行をすべて消しました。
また、ついでにtimer(){の後の4行分も消しちゃいます。このllSetTimer関係の話は、非常にプログラム的なので、今度別の機会に話すことにします。
これで、「30秒間だけ」の部分は無くなったのですが、「タッチすると聞いてくれる」の部分がまだ残っているので、llListenと書いてある行をコピーして、state_entry(){の行のすぐ下に移します。これで、「いつでも聞いてる」状態になります。
また、ついでにtouch_start(integer detected){から、listen(integer...の前の行までを消します。これで、タッチしたらうんぬん、が無くなります。

さて、ここからが本題なのですが、いままで、手でキーボードから打ち込んでいた「/7 red」とか、「/7 off」というのを、スイッチかなんかに変えたい、という部分です。

ためしに、なんでもいいのでボックスかなんかのプリムを「制作」で作って、編集のコンテンツのところで「新しいスクリプト」ボタンをクリックします。すると「New Script」というのができるので、それをダブルクリックして開きます。
default
{
  state_entry()
  {
    llSay(0, "Hello, Avatar!");
  }
  touch_start(integer total_number)
  {
    llSay(0, "Touched.");
  }
}
こんな感じになってると思います。
state_entry()と書いてある行の2行下にあるllSayの行は消しましょう。これは、最初に制作したときや、Rezしたときにチャットでプリムがしゃべる、というもので、まぁ、いらないでしょう。
あとは、touch_startと書いてある行の2行下にある
llSay(0, "Touched.");
のところをいじります。まず、0を7に変えます。そして、"と"でくくられたTouched.のところに、例えばredと書きます。
llSay(7, "red");
これで、このプリムをタッチすると、光源の色が赤に変わるというわけです。
これは、チャネル7番を使ってredとしゃべる、という意味です。つまり、アバターが「/7 red」とキーを打つのとまったく同じ意味です。
これで赤色スイッチができたので、あとはこのredのところをgreenとかoffとかに変えたプリムを作ってやって、例えばボード(ボックス)に貼り付けてリンクすれば、スイッチボックス風になるし、それを装着すればHUD、ということになります。
ただ、llSayは半径20mまでしか届きませんので、もっと遠いところにあるものに指示を出したい場合はllShoutを使います。これなら半径100mまで届きます。
あと、チャネル、というものですが、普段アバター同士でチャットしているのは0チャネルなんですが、実はチャネルは何千、何万、何百万とあって、2147483647なんてのもあるくらいです。ただ0チャネル以外はログでは普通表示されません。なので、プリム間でやりとりするときなどは0以外のチャネルを使うわけですが、いろんなツールやオブジェクトでこのチャネルが使われている可能性はあるので、なんとなくガチってなさそうな(^^;)値を使うほうがいいでしょう。私はマイナスの値、例えば-1013(私の誕生日)とか、適当に使ってます。
このチャネルを変える場合は、llSay(あるいはllShout)のところの7と、llListenのところの7を一緒に変えてください。

LSL(Linden Script Language)自体は、膨大な機能があって、それを複合的に使いながら自由にいろいろ組んでいくのは非常に複雑でたいへんなことではあるのですが、例えばモトがあってそれをちょこっとこうしたい、なんてことは割とスクリプトが苦手だと思っている人にもできることだと思います。

ほんの少し、やり方が分かれば、もっと楽しくいろんなモノ作りができると思います。
まず始めは、人様が作ったものを(ただしモディファイ可能が条件になっちゃいますが)イジりたおすことからはじめましょう!
楽器とかその周辺作り