左クリックで開く
前のページで作ったドアは、プレイヤーが体を当てると開いてしまうので、左クリックをしないと開かないようにしました。
これは、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
ドアを破壊する
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」を丁度良い値にすればいいだけです。