void Update() { // 何も掴んでいない場合 if (!IsGrabbing) { // 掴み操作が有効だったオブジェクトを取得 List <GrabbableObject> grabbingObjList = new List <GrabbableObject>(); foreach (var grabObj in grabObjList) { if (grabObj.CheckGrabInput(Controller)) { grabbingObjList.Add(grabObj); } } // 掴み操作が有効なオブジェクトが存在すれば if (grabbingObjList.Count > 0) { // 最も位置の近いオブジェクトを掴む対象として取得 GrabbableObject grabTargetObj = null; float nearDis = float.MaxValue; foreach (var grabbingObj in grabbingObjList) { if (!grabbingObj) { continue; } float dis = Vector3.Distance(transform.position, grabbingObj.transform.position); if (nearDis > dis) { nearDis = dis; grabTargetObj = grabbingObj; } } // 掴むオブジェクトの掴めるコライダーを取得 List <GrabbableCollider> grabbingColList = new List <GrabbableCollider>(); foreach (var grabCol in grabColList) { if (grabCol.Obj == grabTargetObj) { grabbingColList.Add(grabCol); } } // 最も向きの近いTransformに付いているコライダーを掴むコライダーとして取得 GrabbableCollider grabTargetCol = null; float nearAngle = float.MaxValue; foreach (var grabbingCol in grabbingColList) { if (!grabbingCol) { continue; } float angle = Vector3.Dot(transform.forward, grabbingCol.transform.forward); if (nearAngle > angle) { nearAngle = angle; grabTargetCol = grabbingCol; } } // 掴む GrabObject(grabTargetCol); } } // 既に何か掴んでいる場合 else { // 離し操作が有効であれば if (GrabObj.CheckReleaseInput(Controller)) { // 離す ReleaseObject(); } } }