colliderが付いたオブジェクトが衝突した際に一方を動かないようにしたい.(freezeを使わず)

実現したいこと

3D空間にあるオブジェクトAと自身が操作するオブジェクトBが衝突した際にオブジェクトAは壁のように動かないが当たり判定はあるようにしたい.Bは壁にぶつかってそれ以上進めないようになるイメージです.
この際オブジェクトAは rigid bodyは使用するがfreeze pozition ・locationを使わず実現したいです.

前提

通常ならオブジェクトAに対してfreeze pozitionを使う,rigid bodyをつけないなどで壁のように動かず当たり判定だけが存在するオブジェクトを作成できますが、今回操作しているオブジェクトBが,それらを使用するとcolliderが無効になって貫通してしまいます。そのためスクリプト側からの制御や他の方法を使用して当たり判定は存在するが動かないオブジェクトが作りたいです.

試したこと

オブジェクトが当たった際,スクリプトで位置のずれを検出して修正するようにして実現できないかと考えました.
しかし位置は修正できるものの,当然ながらオブジェクトAはブルブルと震えてしまうので根本的な解決策とはなりませんでした.

c#

1using UnityEngine;2 3[RequireComponent(typeof(Rigidbody), typeof(Collider))] 4 5public class Fixed : MonoBehaviour 6{7 private Rigidbody rb;8 private Vector3 originalPosition;9 private Quaternion originalRotation;10 11 void Start()12 {13 rb = GetComponent<Rigidbody>();14 rb.isKinematic = false; // isKinematicをfalseに設定15 16 // Colliderの設定17 Collider col = GetComponent<Collider>();18 col.isTrigger = false; 19 20 // 初期の位置と姿勢を保存21 originalPosition = transform.position;22 originalRotation = transform.rotation;23 }24 25 void FixedUpdate()26 {27 // Rigidbodyの速度をリセットし、位置と姿勢を元の値に保つ28 rb.velocity = Vector3.zero;29 rb.angularVelocity = Vector3.zero;30 transform.position = originalPosition;31 transform.rotation = originalRotation;32 }33}

どなたかお力を貸していただけると幸いです.

コメントを投稿

0 コメント