初級スクリプトということでしばらくスクリプトについての記事を書いてきましたが、多くの方から感想や質問をいただきまして、予想以上の反響に驚いています。
そして感じたことは、やはりまだまだ「初めての人でもスクリプトに親しめるように」という点では十分ではないということです。
自分では意識して詳細に書いたつもりでも、どうしても専門的な用語をひょいひょいと使ってしまったり、基本的な概念についての説明が不十分だったりしているところがあるように思います。
ですので、具体的なスクリプトのコードからは少々離れた視点から、lslの基礎知識・基礎概念について改めて説明をしてみたいと思います。
本当に基礎的な話になりますので、実用的なコードを紹介するのは難しいと思いますが、読み物としてご参考になれば幸いです。
「初級スクリプト」と内容的に重複する部分もありますが、どうぞご容赦下さい。
で、スクリプトって何なのさ
スクリプトとは「仕組み」だと、初級スクリプトでは書きました。
オブジェクトにはそれ自体では動く力はなく、スクリプトを使うことで初めて動いたり、音が鳴ったりするのだと説明しましたが、もう少し正確かつ深く考えて見ます。
セカンドライフの世界は、あくまでもコンピュータによって作られている世界です。
スクリプトとは、このコンピュータに対して、「どういうふうにオブジェクトを動かすか」という指示を出すためのものです。
そう言う意味では、子供に対して、
「知らないおじさんに声かけられても、付いて行ってはいけません!」
本質的にはこれと一緒です。
これは「知らないおじさんが声をかけてきたとき」というキッカケに対して、「付いていかない」という動作をせよ、ということです。
「寝る前に歯を磨きなさい!」
これもそうです。
「寝るときに」というキッカケに対し、「歯を磨く」という動作をしろ、という指令です。
コンピュータというのは、子供以上に頭が悪いです(ぇ
頭が悪い・・・というのは御幣があるかもしれませんが、「自分では何も考えられない」ということです。
全てにおいて、
「○○のときには」「××しなさい」
のような指示を与えて置かないと、何一つできないのがコンピュータです。
指示さえ与えておけば、コンピュータは非常に優秀かつ効率的に動きます。
「あとで磨く~」
などと子供のように逆らったりしませんw
言われたことは正確にこなし、言われてないことは一切やらないのがコンピュータです。
相手が人間であれば、普通に言葉で指示が出せますが、コンピュータの場合はそうはいきません。
指示するための言葉が、スクリプトの言語です。
的確に指示を出すためには、当然この言語を正しく使う必要があります。
うっかり言い間違えたりすると、コンピュータは、
「何を言ってるのかわかりませーん」
とエラーを返したり、あるいは、こちらが思っても見なかった行動に出ることがあります。
この点は子供に指示を出すのと似ているかもしれません。
「どういう言い方をしたらあの子は素直に従うだろう?」
と頭を悩ませるように、
「どういう書き方をしたら思い通りの動作をするだろう?」
スクリプトを組み立てるときには、常にここに頭を悩ますことになります。
基本的な要素
初級スクリプトでも触れましたが、lslの基本的な構成要素について再度見直してみましょう。
lslには、大きく分けると「状態(ステート)」と「きっかけ(イベント)」と「動作・処理」の3つの要素があります。
また子供の喩えを持ち出しますが・・・。
「普段、知らないおじさんに会ったら、付いて行ってはいけません」
「お母さんと一緒のとき、知らないおじさんと会ったら、きちんと挨拶しなさい」
「お母さんと一緒のとき、かっこいいお兄さんと会ったら、お父さんには内緒にしなさい」
妙な指示もありますが、説明のためということでご勘弁を。
この3つの指示は、「状態(ステート)」と「きっかけ(イベント)」と「動作・処理」にそれぞれ分けることができます。
状態(ステート)きっかけ(イベント)動作・処理普段(デフォルト)おじさんと会う付いていかないお母さんと一緒おじさんと会う挨拶するお兄さんと会う内緒にする
lslによるコンピュータへの指示は、この3要素の組み合わせです。
スクリプトを使って何か作る際には、まずこの3要素への分解を考えるべきです。
特に複雑なスクリプトになる場合には必須でしょう。
以下は初級スクリプトの中で「デモ商品スクリプト」を作った際の要素分解です。
ステートイベント処理デモ期間中
(default)タイマー使用可能時間を減らす
使用可能時間がゼロになったら「使用不能」ステートへrezrez回数をカウントする
rez可能回数を超えたら「使用不能」ステートへ使用不能ステートエントリーアタッチを解除アタッチアタッチを解除rezオブジェクトを消去
これはなかなか難しい作業ではあるのですが、慣れが大きいので、とにかくやってみるのが一番です。
コツとしては「イベント」に着目することでしょうか。
lslのイベントは数が少ないので、どのイベントを使うべきかは見極めが付けやすいと思います。
と、話が難しくなりそうです。
この話については、また改めて記事にしたほうがいいかもしれませんね(^^;
文法の話
人間の言葉に文法があるように、コンピュータに指示を与えるスクリプトにも文法があります。
厳密さという意味ではスクリプトのほうが文法にはうるさいです。
コンピュータは自分で予測することができないので、あいまいな表現が許されないからです。
先ほど登場した「ステート」「イベント」「動作・処理」の表現の仕方も、きっちりと決められています。
子供の例で文法のサンプルを示します。
状態(ステート)きっかけ(イベント)動作・処理普段(デフォルト)おじさんと会う付いていかないお母さんと一緒おじさんと会う挨拶するお兄さんと会う内緒にする
default {
おじさんに会う(引数) {
付いていかない;
}
}
state お母さんと一緒 {
おじさんに会う(引数) {
挨拶する;
おじさんに会う(引数) {
お父さんに内緒にする;
}
}
ますステートの書き方ですが、
state ステート名 {
}
こうなります。
先頭に"state"と書き、そのあと空白をあけて「ステート名」を書きます。
ステート名には英数字で好きな名前を付けられます。例では「お母さんと一緒」などと日本語の名前を使っていますが、実際には日本語はアウトですので注意して下さい(^^;
ステート名の後ろには{}があり、この{}の中にこのステートで処理されるイベントを書きます。
例外的な書き方をするステートとして、デフォルトのステートがあります。
default {
}
このステートはスクリプトの「初期状態」です。先頭の"state"が無く、ステート名は"default"で固定です。
どんなスクリプトでもこのステートが必ず必要になります。
次にイベントですが、イベントは必ずステートの{}の中に書きます。
イベント名(引数) {
}
イベントはlslに用意されているもののうち、使いたいものを使います。
「引数」というのはイベントのパラメータのことです。
引数が無いイベントもあります。
例えば、「ステートが開始されたとき」のイベントはstate_entryイベントと言いますが、引数がないので、
state_entry() {
}
このように書きます。
一方、「アタッチされたとき」のイベントはattachイベントといい、引数があります。
attach(key id) {
}
「引数」についてはまた別途説明します。
ここではイベントの書き方のみ理解して下さい。
イベントの{}の中に「動作・処理」を書きます。
処理1;
処理2;
処理3;
「動作・処理」の行末には「;」を付けます。
「;」が無いと、コンピュータは次の行も一続きだと解釈してしまいます。
日本語でいうところの「。」みたいなものです。
文章の区切りを明確にするためのものだと思ってください。
例えば、「僕の父は偉人です」と自慢したいとして、
ぼくのちちは
いじんです;
我々が読むと、改行を区切りとして認識しますが、lslは「;」が無ければこの二行をつなげて解釈します。
ぼくのちち はいじんです;
大きな誤解のもととなりますので、行末の「;」はお忘れなく(前に私も初級スクリプトでこのミスやらかしましたw)。