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