「Unity/UniRx/接触判定/距離測定」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「*床としてPlaneを作成して、MeshColliderを追加 *キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。S...」) |
細 (Admin がページ「Unity/UniRx/接触判定距離測定」を「Unity/UniRx/接触判定/距離測定」に、リダイレクトを残さずに移動しました) |
||
(同じ利用者による、間の4版が非表示) | |||
行1: | 行1: | ||
*床としてPlaneを作成して、MeshColliderを追加 | *床としてPlaneを作成して、MeshColliderを追加 | ||
− | *キャラクタとして、Sphereを作成して、"CharacterSphere" | + | *キャラクタとして、Sphereを作成して、"CharacterSphere"にリネームで、Rigidbodyを追加。 |
− | * | + | *接触判定用として、GameObjectを作成して、"SphereTrigger"にリネームして、SphereColliderを追加。Radiusを3へ。AddComponentで、ObservableTriggerTriggerを追加 |
− | * | + | *SerializeFieldのdistanceTriggerに"SphereTrigger"をドラッグ |
<pre> | <pre> | ||
行13: | 行13: | ||
{ | { | ||
[SerializeField] | [SerializeField] | ||
− | + | ObservableTriggerTrigger distanceTrigger; | |
void Start() | void Start() | ||
{ | { | ||
− | IObservable<Collider> distanceOnTriggerEnterAsObservable = | + | IObservable<Collider> distanceOnTriggerEnterAsObservable = distanceTrigger.OnTriggerEnterAsObservable(); |
− | IObservable<Collider> distanceOnTriggerStayAsObservable = | + | IObservable<Collider> distanceOnTriggerStayAsObservable = distanceTrigger.OnTriggerStayAsObservable(); |
− | IObservable<Collider> distanceOnTriggerExitAsObservable = | + | 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( | + | 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) | ||
行36: | 行36: | ||
Debug.Log("distance=" + distance); | Debug.Log("distance=" + distance); | ||
} | } | ||
− | |||
}); | }); | ||
distanceOnTriggerExitAsObservable.Subscribe(collider => | distanceOnTriggerExitAsObservable.Subscribe(collider => |
2023年3月6日 (月) 19:16時点における最新版
- 床として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名 }); } }