ソラマメブログ

  

Posted by at

2007年06月30日

第7回 超初心者用スクリプト講座 出したら実行する

こんにちは。ペンです。

ここ数日、ほしいスキンへの道のりがやたらと遠く
キャンプへ行く気もどんどんと薄れていっています。
1日がんばっても150とかだし。友人には電気代のほうが
高くつくんちゃうとか言われるしw(実際そうかも)
まだ、2500もためないといかんし。

というわけで、商品を発売して
少しでもこの道のりを短くしてやろうと
画策しました。売れるかどうかわからんけど…
商品情報は次回のブログにでも書きま~すw


####################################################

さて、第7回セカンドライフスクリプト講座と参りましょうかw

まずは前回のスクリプト講座の終いにした疑問について思い出して
もらいましょう。

どうすればオブジェクトを在庫目録から出すたびに
実行されるようなスクリプトを作ることができるのでしょう?



これが今回のスクリプト講座の目玉です。

それではまず以下のスクリプトをみてください。

default{
  state_entry(){
    llSay(0, "Hello, Avatar!");
  }

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

  on_rez(integer i){
    llResetScript();
  }
}



内容は前回にやったNew Scriptの内容とほぼ同じです。違いは

on_rez(integer i){
llResetScript();
}

の部分がたされたことです。これこそが今回の要点になります。
on_rezはこのスクリプトを含むオブジェクトを在庫目録から出した際に
{}内のコマンドを実行するというもの
です。

この場合だとオブジェクトを出した際にllResetScriptが実行されます。
では、llResetScriptとはなんでしょう?

llResetScriptとは字のとおりスクリプトをリセットするコマンドです。

ここで思い出してください。state_entryの{}内はどういったときに
実行されましたか?そうです、スクリプトが生成されたとき、または
リセットされたときです。ここではこのリセットが引き金になって
state_entryの{}内が実行されます。

要約すると上記のスクリプトは
- オブジェクトが在庫目録から出されたときに
- スクリプトをリセットすることによって
- state_entry内を実行
- Hello, Avator!と叫ぶ

と、まぁこんな感じです。

ここまで読んで、オブジェクトを出したときにon_rezの{}内が
実行されるならリセットせずにそこにllSay(0,"Hello,Avator!")を
書けばいいのでは?と考えたひとノ
あなたはいいセンスしてますw

以下のスクリプトを見てください。
実行すると結果は上記のものと全く同じになります。

default{
  state_entry(){
    llSay(0, "Hello, Avatar!");
  }

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

  on_rez(integer i){
    llSay(0, "Hello, Avatar!");
  }
}



では、何がちがうのでしょう?
実行の流れです。

この場合リセットは行われないのでstate_entryの{}内は
オブジェクトを出しても実行されません。しかしながら、on_rezの{}内は
実行されるためオブジェクトはHello,Avator!と叫ぶことになります。

要約すると
- オブジェクトが在庫目録から出されたときに
- Hello, Avator!と叫ぶ
となります。

こちらの方が簡単でしたね。今は実行結果が同じなので
どちらを使ってもかまいません。好きなほうを選んでくださいw

しかしながら、この2つのスクリプトには
大きな違いがあります。なんでしょう?
そうです、リセットするかしないかです。
これは将来的に大きな違いとなってきます。
しかしながら、詳しく話すにはまだ少し早いかと思うので
もう少し回を重ねてからお話しできたらと思います。
振りだけでごめんなさいw

ここ2回ほど形式ばってしまって面白いものを作ろうという
目標から外れてしまいました。写真もないし・・・
読んでて楽しくないよねぇ。たぶん。

というわけで、次回は何か面白い(いらんもの)を作りたいと思いますw
それでは。  


2007年06月28日

第6回 超初心者用スクリプト講座 ステートエントリー?

こんばんは。ペンです。
昨晩は友人のTさんとQooというSIMにある海賊カフェに行ってきました。
ここは前に観光ブログ担当のジャスミンさんと偶然発見した場所。
いいとこだったので、Tさんを連れて行った次第ですw
(ちなみにこのSIMは居住地区で、観光SIMではありません。)

海賊カフェも仕掛けがいっぱいあって楽しいのですが
それ以上に私たちの心を掴んで離さなかったのがここ!!



下水道w
もうリアルすぎですwたまりませんw
二人して、
「すごい落ち着くわ~」
って感心しきってましたw

######################################

それではスクリプト講座に移っていきましょう~
今回は前回の復習もかねてスクリプトを
新規で生成したときにできるNew Scriptを使って講座をすすめたい
と思います。

まず、今回のメインは何かと言うと
お題のとおりstate_entryについてです。

state_entry(){

}



これですね。

この講座を読んでいる人なら、毎回目にしてきたこの単語。
おまじないとか言って全く説明してきませんでしたw
面倒だったわけじゃないですよw
簡単のためですw

しかしながら、前回にtouch_startっていうのがでてきました。
内容は、オブジェクトがタッチされたかどうかを判断して
touch_start内のスクリプトを実行するというものでした。

では、このstate_entryっていつ実行されるのでしょうか?

はい、答えは簡単。スクリプトが生成、またはリセットされたときです。

じゃあここで、おなじみのスクリプトに登場してもらいましょう。

default{
  state_entry(){
    llSay(0, "Hello, Avatar!");
  }

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



今、state_entryには
llSay(0, "Hello, Avator!")

っていうコマンドが含まれています。このコマンドは
チャンネル0番でオブジェクトが
Hello, Avator!
って叫ぶというものです。

チャンネル0番は通常のチャットを表しています。普段会話で
使っているのはチャンネルの0番ということになりますね。
今は0のままでいいです。
また、叫ぶ内容はHello, Avataor!の部分を何かに変えればいいです。

いつstate_entryが実行されるかという話にもどりますが、
この場合だと、上記のとおりスクリプトが生成、またはリセットされたときにだけHello, Avator!って叫ぶよってことになります。

補足ですが Touched. はオブジェクトが触れられたときに
チャットをとおして叫びます。
(タッチイベントに関しては第5回講座を参照のこと)

ここで大事なのはstate_entry内が実行されるのはあくまでも
スクリプトが生成、またはリセットされたときだけということ
です。(ちなみにセーブした場合は自動的にリセットされます)

さて、ここで問題です。
オブジェクトを作って新しいボタンを押し、
上記のスクリプトを組み込みました。
次に、作ったオブジェクトをtakeし、さらにtakeしたオブジェクトを
もういちど出します。
この出したときにstate_entry内のコマンドは実行されるでしょうか?

答えはされません。この場合だと、Hello,Avator!!とは
言わないということです。
これはtakeしてもスクリプトはリセットされないためです。

では、どうすればオブジェクトを在庫目録から出すたびに
実行されるようなスクリプトを作ることができるのでしょう?

というのが次回のテーマですw
それでは御機嫌よう  


2007年06月24日

第5回 超初心者用スクリプト講座 タッチイベントを使おう

こんばんは。ペンです。
前回にキャンピングにはまってますって言ってましたが、
たどりついてしまいましたよ。カジノにw
もともとキャンピングでレートのいいとこ
どこかな~って検索かけててただけでいこうっていう気は
まったくなかったのですよw
またまいいとこがカジノやったというだけで。
最初は普通にキャンピングしてたんですけど、
ときどき流れてくるピロリロリ~ンっておとにやられましたねw
ま、ちょっとくらいやってもいいか~って感じでやり始めました。
10払って、負け。
また10払って、負け。
次こそは、、、負け。

...

まぁ、こんな感じでやってたら100L$が海の藻屑に。。。
む~ん、キャンピング5時間分が~
もうやらん、絶対やらんぞ~


さて、雑談はこれくらいにして、スクリプト講座です。
今回ご紹介するアイテムはこれ。



あれ?前と同じ?
ええ、そうですイスです。前に作ったイスは単にちゃんと座れると
いうだけで、面白味も何もありませんでした。いけませんねw
それでです。
今回はイスに触れることによってひっくり返る
いたずらイスを作ることにしました。

さて、出来上がりはどんな感じになるかというと…
まずはビフォー。



そしてアフター。



しっかりとひっくり返ってキャラクターの頭が地面に突き刺さって
いるのがわかりますね~。

用意するものは第4回スクリプト講座で作ったイス。
これを元に新たなスクリプトを足していきます。

まず、スクリプトを出す前に今回のスクリプトにおいて
何が必要なのか考えてみましょう。

・変数 ひっくり返った状態にあるのか、どうかの判断基準
・タッチ イスが触られたかどうかを感知する仕組み
・回転 ひっくり返る動作、元に戻す動作
・分岐 そのままw

これだけあれば目的の物が作れそうです。
流れとしては、以下のようになります。

誰かがイスに触りました(タッチ)。
もし(分岐)、イスが普通の状態(変数)なら
ひっくり返す(回転)
そうでないなら
普通の状態にもどす(回転)

これをスクリプトで表現したものが以下のスクリプトです。
ではこれを踏まえて、スクリプト自身の解説をしていきます。

integer normal;

default
{
  state_entry(){
    normal = TRUE;
    llSitTarget(<0.29,0.0,0.31>, llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));
  }

  touch_start(integer i){
    if(normal == TRUE){
      llSetRot(llEuler2Rot(<0.0, 180.0, 0.0> * DEG_TO_RAD));
      normal = FALSE;
    }else{
      llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));
      normal = TRUE;
    }
  }
}



まずはこれ

integer normal;




変数です。変数といっても何だそれは??となるかと思いますw
簡単に言うと値を保存しておくような箱だとおもってください。
今回はnormalという名前の箱を用意しました。この箱の値がTRUEであるならイスは普通の状態、この箱の値がFALSEであればひっくり返っている
状態です。

次に

touch_start(integer i){

}




これが誰かがイスに触ったかどうかを感知するおまじないです。
もし、だれかがイスに触ったなら、このtouch_startの{}内にある
スクリプトが実行されます。

次にこれです。

llSetRot(llEuler2Rot(<0.0, 180.0, 0.0> * DEG_TO_RAD));




これがイスを回転させます。ただし、第3回の講座でやったような
永続的に回転し続けるようなものではなくて、オブジェクトを一定の
回転角度分ずらすようなものだと思ってください。上記の場合であれば
通常角度からy軸を中心に180度回転させたものになります。
表記方法ですが、第4回と同様に<0.0, 180.0, 0.0>の部分にだけ注目して値を変更してください。前から、x軸,y軸,z軸になります。

そして最後に

if(normal == TRUE){

}else{

}



の部分です。これが分岐を表します。
もし、変数normalの中身がTRUEであるなら最初の{}内を、
そうでなければ後ろの{}内を実行します。
また==は同じという状態を表します。

この4つの点を踏まえて、スクリプトをやりたいことの流れと
比較しながら眺めてください。なんとなくわかると思います。

integer normal;

default
{
  state_entry(){
    normal = TRUE;   // normalにイスが普通の状態であることを記入
    llSitTarget(<0.29,0.0,0.31>, llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));   // 着席位置の調整(第4回参照のこと)
  }

  touch_start(integer i){
    if(normal == TRUE){   // イスが普通の状態であるならば
      llSetRot(llEuler2Rot(<0.0, 180.0, 0.0> * DEG_TO_RAD));   // ひっくり返す
      normal = FALSE;   // 変数にnormalにひっくり返った状態であることを記す     }else{   // イスが普通の状態でないなら
      llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));   // 元へ戻す
      normal = TRUE;    // 変数normalに通常の状態であることを記す
    }
  }
}



と、まぁこんな感じです。
第4回までに比べるとボリュームたっぷりで消化不良を起こしてしまう
かもしれません。しかし、そこは気合で乗り切ってくださいw

それでは今回はこの辺で終いです。
ではでは~  


2007年06月23日

第4回 超初心者用スクリプト講座 イスの着席位置を調整しよう

こんにちは最近キャンピングにはまってるペンです。
セカンドライフをはじめたときはキャンピングなんてって
思ってましたが、寝てる間放置すると意外とたまることが
わかってまいりました。ばかになりません。
これでちょこちょこためて1ヵ月後くらいに
DEMOじゃないスキンをかうぞ!!

さて突然ですが、今回のスクリプト講座はこれ。



そうイスです。なんとタイニーもちゃんと座れてしまいますw



って普通かな?
でも、今回使うイスはスクリプトを使うことによって
キャラクターが着席する位置を正確にしていすることができます。
もちろん、方向もです。
もし、このスクリプトを使わずに座ると若干ずれていたり、
イスに埋まってしまったりしてしまいます。

さて、それでは作っていきましょうかw
まずどんな形のものでもいいので、背もたれつきのイスを
作ってください。ここでは簡単のために上記のような立方体だけを
つかってイスを利用します。



作ったイスは、上記のように座る部分が親プリムになるようにリンクさせます。
(親プリムに関しては前回のスクリプト講座を参考にしてください。)
また、この座る部分はオブジェクトとして生成してから、リンクするまで
回転させないことをお勧めします。回転させてしまうと
スクリプトから位置や回転させるための軸(x軸,y軸,z軸)がずれてしまいます。

それでは、出来上がったら以下のスクリプトを組み込んでください。
ただし、このスクリプトを組み込んだからといって
着席位置が正しくなるわけではありません。というのも、これは
あくまで私が作ったいす用のスクリプトだからです。

default{
  state_entry(){
    llSitTarget(<0.29,0.0,0.31>, llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));
  }
}



スクリプトの外側は前回に利用したものと同じですねw
違うのは中身。

llSitTarget(<0.29,0.0,0.31>, llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));



これが今回の肝です。着席位置を指定するコマンドです。
<0.29,0.0,0.31>の部分はリンクしたオブジェクトの中心からの位置を表します。もし、うまく作れているのであれば、前からx方向,y方向,z方向に
なります。

次に

llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD)

 

の部分ですが、これもコマンドの一種です。ただ今は気にせずに
<0.0, 0.0, 0.0>の部分に回転させたい角度を指定するだけでいいです。
これも、うまくイスが作れているのであれば、前からx軸,y軸,z軸に
なります。

これらの値を調整することによって、イスの着席位置を調整していきます。
もし、軸がずれていたとしてもどれがx軸で、どれがy軸で、どれがz軸
なのかを見極めれば、調整はできます。
ちょっと大変ですけどねw

さて、蛇足ですが
位置の指定でz方向を300くらいにしてみてください。
ちょっとした悪戯イスができあがりますw

それでは、また次回w  


2007年06月13日

第3回 超初心者用スクリプト講座 回転させてみよう

こんばんは~。ペンです。
今日はMagSL内を案内してくれる観光バスに乗ってきました。



最後はこんな感じで、スカイダイビングです。
途中で視点がマウスルックになってしまって
自分がはいってないのが残念。


さてさて、スクリプト講座に移っていきましょうか~。
今回、ご紹介する商品(?)はこれ!!



装着するとこんな感じ。



なんだこれ?名前はありません。
あえて言うなら、背中に装備すれば空中浮遊をより楽しいものに
変えてくれる装置wプロペラ部分が回転して気分を盛り上げてくれます。
(注)特別な機能はまったくありませんw

では、早速作っていきましょう。
必要なものは
プロペラ1枚(上記画像では2枚になっていますが簡単のため1枚でやります)
留め金1つ
シャフト部1本
タンク1つ
これらをつなぎ合わせて上記のような物を作ってください。
(この段階ではリンクさせないでください)

できたら、以下のスクリプトをプロペラに組み込みます。

default
{
  state_entry()
  {
    llTargetOmega(<0,0,1>,5*PI,1.0);
  }
}


あくまでもプロペラ部分のみです。もし、他の部分にこのスクリプトを
組み込むと、たとえばタンクに入れたのならタンクが回転したりします。
今、回転させたい対象はあくまでプロペラになるのでプロペラのみに
スクリプトを入れます。

次にリンクさせます。ここで若干新しい概念が登場します。
親プリムと子プリムです。何か物づくりをして、リンクさせたことがある人ならわかるとおもいますが、リンク後は作ったものが青くなります。しかしながら、よく見ると一つのプリム(パーツ)だけが黄色くなって
いるとおもいます。これが親プリムです。それに対して青くなっているものが子プリムです。ちなみにどうすればこれを決定できるかというと
リンクする直前に選択されたものが親プリムになります。

さて、今回の装置で大事なことは以下の点です。
プロペラを親プリムにしない。
もししてしまったなら、プロペラだけが回転するのではなく
リンクしたすべてのものが回転してしまいます。
なので、プロペラ以外のパーツを親プリムにしてください。
とりあえず、今回はタンクの部分を親プリムにしました。

ちゃんとできていれば以下の画像のようになるとおもいます。



これで完成です。

ではスクリプトの中身に関して説明していきましょう。

default
{
  state_entry()
  {
    llTargetOmega(<0,0,1>,5*PI,1.0);
  }
}


外側は以前と同じで違うのは中身のみです。
この部分ですね。

llTargetOmega(<0,0,1>,5*PI,1.0);

これが今回のスクリプト講座の肝。オブジェクトを回転させるスクリプトです。()の中身によって回転の挙動が変わります。

まず始めの<>内にどの軸を中心に回転させるのかを書き込みます。
前からx軸、y軸、z軸になります。中心軸を1で指定してください。
上記のコマンドではz軸を中心に回転します。

次に回転の速度です。現時点では5*PIになっています。5の部分を
大きくしたり小さくすることで速度が変化します。

最後の1.0の部分ですが、ここは気にせず1.0にしておいてください。
今回の講座では関係ないです。

値を変える事で回転の挙動も大きく変わります。

さて、今回は回転それ自身だけではなく親プリム、子プリム
といった概念も説明しました。
ちょっと難しかったかもしれません。でも、後々知っていると便利なので
しっかり理解してくださいね。

それではまた次回あいましょう~