2007年08月06日
好きな場所に座らせてみる
sit2avator links

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

このイスに座ると

1人目がここに

2人目がここに座ります。(3人目はさらに上に座ります。)
かなり力ずくですが…scriptでアバタが座る場所を切り替えることに成功しています。

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

このイスに座ると

1人目がここに

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

座る前:赤プリムが見かけイスを包んでいる

1人座った状態:青プリムが見かけイスを包んでいる

2人座った状態:緑プリムが見かけイスを包んでいる
イスプリムが座れない状態の時はサイズが極小(一辺1cm)になって
見かけ上のイスの中にめり込んでいます。
ところで、座れないプリムというのはどう作ればいいのでしょう…
プリムをphantomにすると座れなくなると言うのは見つけているのですが
#2に書いたとおり、すわれてしまう事があるので、
今回は苦し紛れにプリムサイズを小さくして事実上座れなくするという手段をとりました。
イマイチですね…。
なんとかならないだろうか。
今回のサンプルソース
※上記ソースでは、イスに座る立つを制御するモジュールにsetEnabled命令を実装したものを使っています。
まだテスト段階で公開してません。
setEnabledの実装はサイズの変更でなくもっと確実な別の実装にしたいので…。
itAvManagerModule追加実装部分、一部抜粋
見かけ上のイスと同じ箇所に透明のプリムをたくさん重ねて置いておき
(それぞれ違う座標にアバタが座るように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);
}
}
Posted by harayoki at 07:41│Comments(0)
│椅子(sit)の挙動