facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
行2: 行2:
 
*キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。
 
*キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。
 
*接触判定用として、GameObjectを作成して、"SphereTrigger"にリネームして、SphereColliderを追加。Radiusを3へ。AddComponentで、ObservableTriggerTriggerを追加
 
*接触判定用として、GameObjectを作成して、"SphereTrigger"にリネームして、SphereColliderを追加。Radiusを3へ。AddComponentで、ObservableTriggerTriggerを追加
*SerializeFieldのeventTriggerに"SphereTrigger"をドラッグ
+
*SerializeFieldのdistanceTriggerに"SphereTrigger"をドラッグ
  
 
<pre>
 
<pre>
行13: 行13:
 
{
 
{
 
     [SerializeField]
 
     [SerializeField]
     ObservableEventTrigger eventTrigger;
+
     ObservableTriggerTrigger distanceTrigger;
 
     void Start()
 
     void Start()
 
     {
 
     {
         IObservable<Collider> distanceOnTriggerEnterAsObservable = eventTrigger.OnTriggerEnterAsObservable();
+
         IObservable<Collider> distanceOnTriggerEnterAsObservable = distanceTrigger.OnTriggerEnterAsObservable();
         IObservable<Collider> distanceOnTriggerStayAsObservable = eventTrigger.OnTriggerStayAsObservable();
+
         IObservable<Collider> distanceOnTriggerStayAsObservable = distanceTrigger.OnTriggerStayAsObservable();
         IObservable<Collider> distanceOnTriggerExitAsObservable = eventTrigger.OnTriggerExitAsObservable();
+
         IObservable<Collider> distanceOnTriggerExitAsObservable = distanceTrigger.OnTriggerExitAsObservable();
 
         distanceOnTriggerEnterAsObservable.Subscribe(collider =>
 
         distanceOnTriggerEnterAsObservable.Subscribe(collider =>
 
         {
 
         {
行28: 行28:
 
             if (collider.gameObject.name == "CharacterSphere")
 
             if (collider.gameObject.name == "CharacterSphere")
 
             {
 
             {
                 float distance = Vector3.Distance(eventTrigger.gameObject.transform.position, collider.gameObject.transform.position);
+
                 float distance = Vector3.Distance(distanceTrigger.gameObject.transform.position, collider.gameObject.transform.position);
 
                 distance -= collider.gameObject.GetComponent<SphereCollider>().radius;
 
                 distance -= collider.gameObject.GetComponent<SphereCollider>().radius;
 
                 if (distance < 0)
 
                 if (distance < 0)

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

  • 床として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名
        });
    }
}