衝突によるドア開閉に関するメモ

家をつくる際に、

  • 全オブジェクトをリンクしている
  • ドアが複数ある
  • 各ドア1) に、開閉用のスクリを1枚ずつ組み込む

という条件で

  • クリック以外にも、衝突でドアが開くように

すると、collision の仕様2) により、一斉にドアが開閉してしまう場合がある。

衝突時に1回だけセンサーを発動、すぐ近くに衝突したアバターを感知した場合のみドアを開くようにする。

    integer Running; // 平時は FALSE, ドア開閉中は TRUE を保持
    integer Close; // ドアが閉じている(この状態がデフォルト)場合は TRUE を保持 / 閉 → 開 の動作中も TRUE を保持
    uuDoor(){} // ドア開閉用のユーザ関数
 
    collision_start(integer num_detected){
        key av = llDetectedKey(0);
        if (!Running && Close){
            llSensor("", av, AGENT, 1.0, PI);
        }
    }
 
    sensor(integer num_detected){
        uuDoor();
    }

衝突時に「どの子プリムに衝突したか」をチェックし、自分自身である場合のみドアを開くようにする。

    collision_start(integer num_detected){
        if (llDetectedLinkNumber(0) == llGetLinkNumber()){
            if (!Running && Close){
                uuDoor();
            }
        }
    }

不思議なことに、衝突が発生していないドアにおいても llDetectedLinkNumber(0) == llGetLinkNumber() が成立している模様。全ドアが一斉に開くのが観察された。

1) ルートプリムではない
2) バグなのか?