2022/01/15

小さくすると頭がつかえる?

ベネチアSIMで遊覧飛行船の準備をしてるとき 売ってる飛行船がそのままでは大きすぎて建物内で圧迫感があるので少し小さくしました。(もともとリサイズ機能つきです)
なかなかかわいくなりましたが ここで問題発生 !
降りるときにどうかすると頭が風船部分につかえて船から出れなくなったりします(TT);;;
風船部分だけファントムにする方法を試しましたが(昔の記事参照: 通り抜けできるプリム)さらに大きな問題が…いきなりランドインパクトが何百もあがってこれだけで SIM に負担がかかりそうなんです !!! 

…そこでどうしたかというと 人が乗ったら飛行船全体をファントムにすることにしました。
ファントムでも人が乗るぶんには何も問題ありません。
降りるときは船体を素通りするので空中にいたら下に落ちますがまあいいことにしましょう。
あとは飛んでるとき建物にぶつかっても船体部分が素通りしてしまいますが 今までちょっとさわっただけで船がひっくり返って大騒ぎ ! だったのがわりと平気になったのでこれもよしとしましょう。(人はファントムにならないのでもちろん素通りしません)

スクリプトはこんな感じ:

default {
  state_entry() {
    llSetPrimitiveParams([PRIM_PHANTOM,FALSE]); // ファントムじゃない
  }
  changed(integer change) {
    if (change & CHANGED_LINK) { // 人の乗り降りでリンクが変わる
      if (llGetNumberOfPrims() != llGetObjectPrimCount(llGetKey())) // 誰か乗ってる
        llSetPrimitiveParams([PRIM_PHANTOM,TRUE]); // ファントムにする
      else llSetTimerEvent(Wait); // 誰も乗ってない しばらく待つ
    }
  }
  timer() {
    llResetScript(); // リセットしてファントムでなくす
  }
}

ここで llGetNumberOfPrims() は座ってるアバターを含めたリンク数 llGetObjectPrimCount() は含まないプリムだけの数 なので比較すれば誰か座ってるかどうかがわかるしかけです。