Unity/UniRx/接触判定/距離測定
提供: 初心者エンジニアの簡易メモ
2023年3月6日 (月) 19:16時点におけるAdmin (トーク | 投稿記録)による版 (Admin がページ「Unity/UniRx/接触判定距離測定」を「Unity/UniRx/接触判定/距離測定」に、リダイレクトを残さずに移動しました)
- 床としてPlaneを作成して、MeshColliderを追加
- キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。
- 接触判定用として、GameObjectを作成して、"SphereTrigger"にリネームして、SphereColliderを追加。Radiusを3へ。AddComponentで、ObservableTriggerTriggerを追加
- SerializeFieldのdistanceTriggerに"SphereTrigger"をドラッグ
using UnityEngine; using UniRx; using UniRx.Triggers; using System; public class DistanceScene : MonoBehaviour { [SerializeField] ObservableTriggerTrigger distanceTrigger; void Start() { IObservable<Collider> distanceOnTriggerEnterAsObservable = distanceTrigger.OnTriggerEnterAsObservable(); IObservable<Collider> distanceOnTriggerStayAsObservable = distanceTrigger.OnTriggerStayAsObservable(); IObservable<Collider> distanceOnTriggerExitAsObservable = distanceTrigger.OnTriggerExitAsObservable(); distanceOnTriggerEnterAsObservable.Subscribe(collider => { Debug.Log("OnTriggerEnter collider.gameObject.name=" + collider.gameObject.name); // 接触object名 }); distanceOnTriggerStayAsObservable.Subscribe(collider => { Debug.Log("OnTriggerStay collider.gameObject.name=" + collider.gameObject.name); // 接触object名 if (collider.gameObject.name == "CharacterSphere") { float distance = Vector3.Distance(distanceTrigger.gameObject.transform.position, collider.gameObject.transform.position); distance -= collider.gameObject.GetComponent<SphereCollider>().radius; if (distance < 0) { distance = 0; } Debug.Log("distance=" + distance); } }); distanceOnTriggerExitAsObservable.Subscribe(collider => { Debug.Log("OnTriggerExit collider.gameObject.name=" + collider.gameObject.name); // 接触object名 }); } }