ソラマメブログ
QRコード
QRCODE
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 2人
オーナーへメッセージ

2007年12月17日

回転マンタ・スクリプトの総括(1)

今回初めて回転タイプの商品開発に取り組んだ訳ですが、その結果今まで使ったことの無いイベントや関数を色々と駆使する事になりました。
今回新たに使ったイベント、関数類は以下のようになります。
<イベント>
・run_time_permissions
・change
・on_rez
<関数>
・llRequestPermissions
・llRezObject
・llCreateLink
・llBreakAllLinks
・llGetLinkNumber
・llDie
随分と色々使ってます。^ ^
正直言って、こんなに面倒だとは思っていませんでした。でも、スクリプトの勉強にもなったし、それなりに面白かったとも思います。
これらをここで総括しておきたいと思います。けっこうなボリュームになるので、何回かに分けて記録しておきたいと思います。

その前に通常の回転タイプのお魚と言うのは、これから紹介するような複雑怪奇な処理をしている訳ではありません。
多くの商品は、単純にお魚テクスチャを貼った板に回転軸プリムをリンクさせたり、円筒系プリムの表面にテクスチャを貼って、llTargetOmegaと言う回転関数で回しているだけです。
それらはテクスチャさえ作れれば、初心者でも簡単に作れるレベルの物です。
今回のお話は、中級レベルのスクリプト知識が無いと作れない内容です。これと同等の機能を実現した商品は、現在もまだ少ないでしょう。
と前置きは終わりにして本題に入りましょう。

1.パーミッションの取得関数:llRequestPermissions
 これは何か特別な事(お金を扱う場合、アバターのアニメーション、オブジェクトのリンクの変更、カメラ(視点)の制御、キー入力の判定など)を実行する時に、その許可を得る行為です。
 許可無く実行されると、利用者に損害を与えかねないような場合、必ず同意を得てから実行させるために存在します。
 今回の場合は、オブジェクトのリンク生成と解除の為に、このパーミッションの取得が必要でした。
 実際に使ったのは、次のようなリンク関連のパーミッションです。

 llRequestPermissions(key_id, PERMISSION_CHANGE_LINKS);

 ここでKey_idには事前に取得しておいた、オブジェクトの所有者のUUIDがセットされています。つまり、該当オブジェクトのリンク変更に関する許可を得ていると言う事です。
 この関数を実行すると次のようなダイアログが表示されます。

回転マンタ・スクリプトの総括(1)

 このパーミッション取得関数は、run_time_permissionsイベントと連動します。run_time_permissionsイベントはダイアログの入力結果によって発生するイベントです。
run_time_permissions(integer perm) {
if (perm & PERMISSION_CHANGE_LINKS){
link_flg=ON;
}
}
 ここでは「はい」が押された場合に、パーミッションを取得していると言う意味で、取得済みフラグをONにして記憶させています。
 この辺の扱いに関しては、色々な仕様で考える事ができますが、今回はこの時点で許可が得られない場合でも、後続の処理を実行するようにしています。許可が得られないと後続処理をさせたく無い場合は、elseで「許可をして下さい」とメッセージを出して、再度パーミッション取得の状態へ戻して、許可ダイアログを出させる事もできるでしょう。
 また、パーミッションは1度取得すれば良く、取得済みの状態でTakeして、再度Rezしてもパーミッションの許可は有効でした。ただし、オーナーが変わった場合は、再度そのオーナーでのパーミッション取得が必要となります。
 今回はその辺も考慮して対応しています。

2.llRezObject
 これはコンテンツ内のオブジェクトを、スクリプトを使ってRezする関数です。回転マンタでは、マンタのサイズ、遊泳半径、回転方向をダイアログで設定できるようにしましたが、その都度設定内容に合わせてRezし直す方式を採用しています。

 llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos(), ZERO_VECTOR, llEuler2Rot(<x_axi, 0.0, z_axi>* DEG_TO_RAD), (integer)parm);

 今回はこのような使い方をしています。パラメータとしては次のような内容です。
 (1)コンテンツ内のオブジェクトName
   llGetInventoryNameでコンテンツ内のオブジェクト0番の名前を取得してセットしてます。
 (2)Rezする位置
   llGetPos()で自分自身と同じ位置にRezするようにしてます。
 (3)Rezオブジェクトに加える力
   今回は必要無いのでZERO_VECTORを指定してます。
 (4)Rezしたオブジェクトの回転角度
   ここはダイアログで設定した回転方向に合わせて、事前に角度を求めてRezした時のオブジェクトの向きをセットしてます。
   時計回りに回す場合と、反時計回りとでは、マンタの向きは反対になりますので。
 (5)Rezオブジェクトへの引数
   ここで設定した内容は、Rezされたオブジェクト側で参照して使う事ができます。マンタの場合はサイズとリンク距離を合成してセットしています。マンタ側は、この値に基づいて自分のサイズを変更し、リンク距離まで移動する事になります。

 海洋生物でのllRezObjectの利用例としては、TempオブジェクトのRezzerBoxで使われています。クラゲとかで使われている例が多いようです。
 TempRezzerとして使う場合は、コンテンツ内のオブジェクト側でTemp(臨時)オブジェクトになるような設定が必要です。
 TROPICAL FISHで販売している「Free Swimming Tropical Fish」の場合は、単独でRezして使用した場合は、Tempでは無く、普通の状態で使えますが、RezzerBox経由で使う場合は、同じオブジェクトがTempオブジェクトでRezされます。
 この辺はスクリプトでRezzerBoxからRezされた場合にTempオブジェクトに設定するようにしていると思われます。

 実はこの部分で、少々問題がありました。
 それはコンテンツ内に入っているオブジェクトは、コピー可能状態で無いと困ると言う事です。
 理由はコピー不可だと、一回実行してRezするとコンテンツ内からオブジェクトが消えてしまうからです。まあ、当然と言えば当然ですが・・・
 そのため、コンテンツ内のオブジェクトはコピー可能に設定して入れなければなりません。販売上は「再販可能」で「コピー不可」が望ましいのですけどね。。。
 更にこの辺の扱いに関しては、他でも色々と問題が出てきて・・・とそれは先の項目で詳しく説明したいと思います。

と言う事で、続きは後日。。。


同じカテゴリー(スクリプトのお勉強メモ)の記事画像
llDetectedTouchST
llAddToLandPassList
【注意】Bulk Permissions機能は使っては駄目!
HTTP-INを使ってみた。
オブジェクトへの指示
ペットを作るには(6)
同じカテゴリー(スクリプトのお勉強メモ)の記事
 llDetectedTouchST (2009-07-24 14:05)
 llAddToLandPassList (2009-07-24 10:23)
 【注意】Bulk Permissions機能は使っては駄目! (2009-07-21 12:15)
 HTTP-INを使ってみた。 (2009-07-19 14:51)
 オブジェクトへの指示 (2008-10-22 12:42)
 ペットを作るには(6) (2008-09-25 10:38)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。