ドアの開閉と破壊ができるようにする

投稿者: | 2019-03-28

左クリックで開く

前のページで作ったドアは、プレイヤーが体を当てると開いてしまうので、左クリックをしないと開かないようにしました。
これは、Door につけたスクリプトで、Hinge Joint の Lmits の設定を変更しています。


HingeJoint hj;
JointLimits limits;

// Start is called before the first frame update
void Start()
{
   hj = GetComponent<HingeJoint>();
   limits = hj.limits;
}

// Update is called once per frame
void Update()
{

   // ドアがデフォルトの位置付近にあるとき
   if (this.transform.rotation.eulerAngles.y < 8)
   {
      // 左クリックが押されたら
      if (Input.GetMouseButton(0))
      {
         // 向こう側へ -130 まで回転できるようにする(初めは 0 になっています)
         limits.min = -130;
      }
      else {
         // デフォルトの位置で、左クリックが押されていないときは回転しない
         limits.min = 0;
      }
      // デフォルトの位置ではドアが反発しない。
      limits.bounciness = 0f;
      hj.limits = limits;
   }
   else {       
      // 向こう側ではドアが反動で戻れるようにする。
      limits.bounciness = 0.5f;
      hj.limits = limits;
   }  
}

注意するのは、JointLimits を変数にしないといけないのと、毎回書いている 「hj.limits = limits;」 です。
Limits の設定を何か変数にいったん入れて、その変数の内容を変更したあと、それをまた戻してあげないといけません。
上では、limits という変数に設定を入れて変更し、hj.limits(= GetComponent().limits)に入れていますね。

ドアを破壊する

Joint の破壊は、コンポーネントの 「Break Force」 に、破壊に必要な力を適当に入れれば良いだけなので簡単ですが、上記のように Hinge Joint をスクリプトで操作したままだと、Hinge Joint を破壊したときにエラーがでます。

Hinge Joint が 「Break Force」で破壊されると、コンポーネントからも削除されてしまうようで、スクリプトで Hinge Joint を操作すると、Hinge Jointが無いと言われてエラーになるわけですね。

なので、Hinge Joint が無い場合は Hinge Joint の操作をしないようにしました。
例えば上記のコードでは、Update() の最初に return 分を入れればいいですね。


void Update()
{
   // Hinge Joint が無い時 true
   if (!GetComponent<HingeJoint>())
   {
      return;
   }

...

問題ないので、次は破壊も開閉もできるようにしましょう。

開閉も破壊もできる

これは「Break Force」を丁度良い値にすればいいだけです。

コメントを残す

メールアドレスが公開されることはありません。