2020年1月2日木曜日

[ゲーム:セカンドライフ]この冬に暇なスクリプター向けの問題のてきとー解答。の話。

はいどうもー、それでは前回書いた問題の解答、解説をてきとーにですが行おうと思います。

特にレス等もなく、誰も試したりはしてないだろうなとは思うわけですが、ちょっとは読んでみた人がその段階でこんなかな?とは解答を考えてみてくれていたら幸いです。

こっちでは問題を考えた段階、およびその後に幾つか解答を考えてみてます。実際に作ってはみていないのですが、ま、頭の体操的にな?
やれば出来るだろうなって事で。


問題は、

問1
任意の床からz+2mの位置に、tempと物理の入った、中身の無い「object」という名前のオブジェクトをrezせよ。


問2
問1でrezしたオブジェを、指定座標「rezした座標+<20.0,60.0,10.0>」に移動させよ。近ければ近いほどいい。

また手段は問わない。

でした。


まず問1ですが、特に問題はないと思います。
なんでもいいのでtempと物理の入ったobjectを用意し、rezobjectすればいいので。

任意の床からz+2mに問題でなっているのは、物理入れているので落下するぞ?って事と、問2で移動させる場合にobjectと床との間に隙間があった方が解答しやすいと思ったためです。



問2ですが、これが本命です。
まともなスクリプターなら幾つかこうすれば出来るかなってのが浮かぶことだと思います。

結局自分では実際に作っていないわけですが(オイ)、3系統の解答、それぞれの系統で様々な処理の仕方になると思います。

ということで3つの系統を。


1、外部による移動
これはrezしたobujectの対し、他のオブジェ等で移動させるという方法です。

例えばcagerタイプ。
objectをrezした際に、入るように籠もrezします。
そしてこの籠を指定座標まで移動させる事で中に入ってるobjectも移動するわけです。
昔流行ったアバターを上空に強制的に移動させるグリーフ装備ですね。

objectがどこにrezされるのか、それに伴い姿勢座標はどこなのかは自分でrezzerを組むので幾らでも取得出来ると思います。あとは直打ちでも良いですし、通信で渡してもいいですね。

またcageの移動方法ですが物理的に移動、例えばllMoveToTargetなどでも良いですし、llSetPosを繰り替えす非物理でもいいと思いますが、移動量が多すぎると中のobjectが貫通して落ちてしまう可能性があるので、ゆっくり運ぶ必要があります。
おすすめはKeyFrameMotionを使う事。これによる移動は非物理かの様に周囲のオブジェを無視して移動出来る上に、自身及び上に乗ったオブジェを物理的に移動させれるので。


2、自身による移動
これはrezしたobject自体が指定座標に移動する方法です。
スクリプトを扱う人でも、この方法を思いついた人はそこまでいないのか?と思っています。
問題であえて中身の際オブジェクトと書いたので。

ただ一通りスクリプトを弄った事がある人なら思いつくと思ってて、方法はRemoteLoadです。
objectに事前にPIN設定をしておき、指定に使ったスクリプトは消します。PINはプリム属性としてスクリプトがなくても保持されています。
これでrezされたobjectのUUIDを取得し、remoteloadでPIN指定でスクリプトを入れ込めば、スクリプトで制御可能になります。あとは中に入っているスクリプトがstate_entryで動くはずなので、そこにllSetRegionPos();で一発で指定座標に動かしちゃいます。もちろん事前に物理はオフにする必要はあります。また物理のままで、オブジェ自体がMoveto等で指定座標に動いてもいいですね。


3、手動(?ェ?)

まずrezしたobjectを編集し、物理をオフにします。
それから座標のところに指定座標を入れます。
これで優勝。

なんでもかんでもスクリプトでやる必要はありません。結果が重要なので、手でやってしまうのも方法です。問題に「手段は問わない」と書いたのはこの為です。



という事で大雑把ですが、いかかでしたでしょうか。

スクリプターといえど扱いなれない命令はあるだろうし、それによって自身がやれる事やれない事が出てきます。少しはやらない事に手を出す、考えるきっかけになればなと思います。



#sljp