ソラマメブログ
< 2025年05月 >
S M T W T F S
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Mail

2007年08月06日

好きな場所に座らせてみる

sit2avator links
好きな場所に座らせてみる

#5にあるように…
scriptでアバタを任意のプリムに座らせることはできません。
これは仕様のようです。
アバタは、ユーザの操作で"座る"を行った対象のプリムだけに座ります。

これをなんとか任意のプリムに座らせる事に挑戦しました。

好きな場所に座らせてみる
このイスに座ると

好きな場所に座らせてみる
1人目がここに

好きな場所に座らせてみる
2人目がここに座ります。(3人目はさらに上に座ります。)

かなり力ずくですが…scriptでアバタが座る場所を切り替えることに成功しています。
この仕掛けのタネは…
見かけ上のイスと同じ箇所に透明のプリムをたくさん重ねて置いておき
(それぞれ違う座標にアバタが座るようにllSitTarget指定されている)
scriptでどの透明プリムに座れるかを切り替えている

です。


ためしに赤・青・緑の色を3つの透明イスプリムにつけてみると

座るたびにこのように変化します。
好きな場所に座らせてみる
座る前:赤プリムが見かけイスを包んでいる

好きな場所に座らせてみる
1人座った状態:青プリムが見かけイスを包んでいる

好きな場所に座らせてみる
2人座った状態:緑プリムが見かけイスを包んでいる

イスプリムが座れない状態の時はサイズが極小(一辺1cm)になって
見かけ上のイスの中にめり込んでいます。

ところで、座れないプリムというのはどう作ればいいのでしょう…
プリムをphantomにすると座れなくなると言うのは見つけているのですが
#2に書いたとおり、すわれてしまう事があるので、
今回は苦し紛れにプリムサイズを小さくして事実上座れなくするという手段をとりました。

イマイチですね…。
なんとかならないだろうか。


今回のサンプルソース
integer debug = FALSE;
Trace(string s){
if(debug) llOwnerSay(s);
}
integer initialized = FALSE;
key owner;
integer stateNum = -1;
integer STATE_SIT_NONE = 0;
integer STATE_SIT_OBJ_A = 1;
integer STATE_SIT_OBJ_B = 2;
integer STATE_SIT_OBJ_C = 3;
integer test = TRUE;
Init(){
if(initialized) return;
debug = TRUE;
Trace("Init");
initialized = TRUE;
owner = llGetOwner();
llSitTarget(<0,0,0.1>,ZERO_ROTATION);
UnSitAll();
ResetEnableds();
SetTest(test);
}
SetStateNum(integer num){
Trace("SetStateNum "+(string)num);
stateNum = num;
}
ResetEnableds(){
llMessageLinked(2,(stateNum == STATE_SIT_NONE),"harayoki.setSitEnabled",NULL_KEY);
llMessageLinked(3,(stateNum == STATE_SIT_OBJ_A),"harayoki.setSitEnabled",NULL_KEY);
llMessageLinked(4,(stateNum == STATE_SIT_OBJ_B),"harayoki.setSitEnabled",NULL_KEY);
}
UnSitAll(){
Trace("UnSitAll");
llMessageLinked(LINK_SET ,0,"harayoki.avatarUnSit",NULL_KEY);
SetStateNum(STATE_SIT_NONE);
}
SetTest(integer num){
llSetLinkAlpha(LINK_ALL_OTHERS,0.0+0.5*(float)num,ALL_SIDES);
}
default{
state_entry(){
Init();
}
on_rez(integer num){
llResetScript();
}
touch_start(integer num){
test = ! test;
SetTest(test);
}
changed(integer che){
if(che & CHANGED_LINK){
key av= llAvatarOnSitTarget();
if(av!=NULL_KEY){
llUnSit(av);
}
}
}
link_message(integer sender,integer num,string mes,key id){
if(mes=="harayoki.event.avatarSit"){
Trace("ev:avatarSit sender : "+(string)sender);
SetStateNum(stateNum+1);
ResetEnableds();
}else if(mes=="harayoki.event.avatarUnSit"){
UnSitAll();
ResetEnableds();
}
}
}


※上記ソースでは、イスに座る立つを制御するモジュールにsetEnabled命令を実装したものを使っています。
まだテスト段階で公開してません。
setEnabledの実装はサイズの変更でなくもっと確実な別の実装にしたいので…。

itAvManagerModule追加実装部分、一部抜粋
SetSitEnabled(integer b){
if(bEnabled==b) return;
bEnabled = b;
if(b){
SetScale(orgScale);
}else{
SetScale(disableScale);
}
}


同じカテゴリー(椅子(sit)の挙動)の記事画像
多人数制御ポーズボール
くるくるイス3
くるくるイス2
くるくるイス
子プリムといっしょにアバタを動かせない
phantomイスの変な挙動
同じカテゴリー(椅子(sit)の挙動)の記事
 多人数制御ポーズボール (2007-12-29 02:43)
 くるくるイス3 (2007-10-30 06:27)
 くるくるイス2 (2007-10-30 04:17)
 くるくるイス (2007-10-29 13:43)
 子プリムといっしょにアバタを動かせない (2007-08-07 10:45)
 椅子に複数人で座ってみると(3) (2007-07-30 04:40)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。