走っている時に引き戸を素早く開けられるようにします。
if (CrossPlatformInputManager.GetButtonDown("Fire1") && hit.collider.tag == "SlidingDoor" && !sc_camera.GetWalking())
{
RaycastHit slideDoorHit_R;
RaycastHit slideDoorHit_L;
// 引き戸の左右にレイを飛ばす
if (Physics.Raycast(hit.transform.position, hit.transform.right, out slideDoorHit_R, Mathf.Infinity) &&
Physics.Raycast(hit.transform.position, -hit.transform.right, out slideDoorHit_L, Mathf.Infinity))
{
item = hit.collider.gameObject;
itemRb = item.GetComponent();
// 遠い方の壁に向かって力を加える
if (slideDoorHit_R.distance > slideDoorHit_L.distance)
{
itemRb.AddForce(hit.transform.right * 10f, ForceMode.Impulse);
}
else {
itemRb.AddForce(hit.transform.right * -10f, ForceMode.Impulse);
}
}
}
public bool GetWalking()
{
return m_IsWalking;
}
引き戸にレイが当たっている時に、走りながら左クリックすると、引き戸から両側の柱に向かってレイを飛ばします。そして、遠い柱の方へ引き戸に力を加えます。
同じスクリプトで反対側の引き戸も開きます。
引き戸が斜めに配置されていても問題ないです。
しかし、引き戸が半開きの時には逆に勢いよく閉じてしまうことがあります。
十分に開いていないとプレイヤーが引っかかって通れないので不便です。そこで、走っている時は半開きの引き戸を強引に通れるようにしてみます。
まずプレイヤーの頭にコライダーを付けてIs Triggerにチェックを入れます。
Radiusはトリガーが引き戸に反応するのに十分な大きさにします。
そしてコライダーに引き戸が侵入したとき走っていれば、プレイヤーから引き戸に向かって力を加えます。
private void OnTriggerEnter(Collider other)
{
if (other.tag == "SlidingDoor" && !sc_camera.GetWalking() && !CrossPlatformInputManager.GetButton("Fire1"))
{
Vector3 dir = other.transform.position - transform.position;
Rigidbody rb = other.gameObject.GetComponent();
rb.AddForce(dir * 10f, ForceMode.Impulse);
}
}
これで歩くと引っかかる隙間も、走りながらだと引き戸を開けて強引に通れるようになりました。