facebook twitter hatena line email

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名
        });
    }
}