facebook twitter hatena line email

「Unity/UniRx/接触判定/距離測定」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(ページの作成:「*床としてPlaneを作成して、MeshColliderを追加 *キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。S...」)
 
行1: 行1:
 
*床としてPlaneを作成して、MeshColliderを追加
 
*床としてPlaneを作成して、MeshColliderを追加
*キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。SphereColliderを追加
+
*キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。
*接触判定用として、Sphereを作成して、"SphereTrigger"にリネームして、SphereColliderを追加。Radiusを3へ。AddComponentで、ObservableEventTriggerを追加
+
*接触判定用として、GameObjectを作成して、"SphereTrigger"にリネームして、SphereColliderを追加。Radiusを3へ。AddComponentで、ObservableEventTriggerを追加
 
*SerializeFieldのeventTriggerに"SphereTrigger"をドラッグ
 
*SerializeFieldのeventTriggerに"SphereTrigger"をドラッグ
  

2022年8月18日 (木) 09:57時点における版

  • 床としてPlaneを作成して、MeshColliderを追加
  • キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。
  • 接触判定用として、GameObjectを作成して、"SphereTrigger"にリネームして、SphereColliderを追加。Radiusを3へ。AddComponentで、ObservableEventTriggerを追加
  • SerializeFieldのeventTriggerに"SphereTrigger"をドラッグ
using UnityEngine;
using UniRx;
using UniRx.Triggers;
using System;

public class DistanceScene : MonoBehaviour
{
    [SerializeField]
    ObservableEventTrigger eventTrigger;
    void Start()
    {
        IObservable<Collider> distanceOnTriggerEnterAsObservable = eventTrigger.OnTriggerEnterAsObservable();
        IObservable<Collider> distanceOnTriggerStayAsObservable = eventTrigger.OnTriggerStayAsObservable();
        IObservable<Collider> distanceOnTriggerExitAsObservable = eventTrigger.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(eventTrigger.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名
        });
    }
}