衝突によるドア開閉に関するメモ
家をつくる際に、
- 全オブジェクトをリンクしている
- ドアが複数ある
- 各ドア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()
が成立している模様。全ドアが一斉に開くのが観察された。