using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Stary.Evo.RKTools { public static class RKAddInteractionExtension { #region 触摸 /// /// 添加触摸事件 /// /// 被触碰物体 /// 触碰后事件 public static void ObjectAddTouchEvent(this GameObject Touchedobject, System.Action TouchEvent, float TouchScale = 1.2f) { Collider ObjectCollider = Touchedobject.GetComponent(); // 原有的组件设置优先级最高 if (ObjectCollider == null) { ObjectCollider = Touchedobject.AddComponent(); ObjectCollider.isTrigger = true; } #if Evo_Rokid var GrabInteractable = Touchedobject.GetComponent(); if (GrabInteractable == null) { GrabInteractable = Touchedobject.AddComponent(); GrabInteractable.rate = TouchScale; } GrabInteractable.OnHoverBegin.AddListener(() => TouchEvent?.Invoke(Touchedobject)); #elif Evo_Xreal var GrabInteractable = Touchedobject.GetComponent(); if (GrabInteractable == null) { GrabInteractable = Touchedobject.AddComponent(); GrabInteractable.smoothScale = true; GrabInteractable.smoothScaleAmount = TouchScale; // 低数值 = 高惯性 GrabInteractable.tightenScale = 0.1f; // 强平滑效果 } GrabInteractable.throwOnDetach = false; GrabInteractable.GetComponent().useGravity = false; GrabInteractable.hoverEntered.AddListener((a) => TouchEvent?.Invoke(Touchedobject)); ObjectCollider.enabled = true; #endif } /// /// 暂停触摸事件 /// /// 被触碰物体 public static void ObjectPauseTouchEvent(this GameObject Touchedobject) { Collider ObjectCollider = Touchedobject.GetComponent(); if (ObjectCollider != null) { ObjectCollider.enabled = false; } } /// /// 恢复触摸事件 /// /// 被触碰物体 public static void ObjectResumeTouchEvent(this GameObject Touchedobject) { Collider ObjectCollider = Touchedobject.GetComponent(); if (ObjectCollider != null) { ObjectCollider.enabled = true; } } /// /// 移除触摸事件 /// /// 被触碰物体 public static void ObjectRemoveTouchEvent(this GameObject Touchedobject) { #if Evo_Rokid Rokid.UXR.Interaction.GrabInteractable GrabInteractable = Touchedobject.GetComponent(); if (GrabInteractable != null) { GrabInteractable.OnHoverBegin.RemoveAllListeners(); Object.Destroy(GrabInteractable); } #elif Evo_Xreal var GrabInteractable = Touchedobject.GetComponent(); if (GrabInteractable != null) { GrabInteractable.hoverEntered.RemoveAllListeners(); Object.Destroy(GrabInteractable); } #endif } #endregion #region 拖动 /// /// 添加拖动事件 /// /// 被拖动物体 /// 拖动时执行的方法 public static void objectAddDrag(this GameObject Dragedobject, System.Action DragingEvent = null, float DragScale = 1.2f) { #if Evo_Rokid Collider ObjectCollider = Dragedobject.GetComponent(); Rokid.UXR.Interaction.GrabInteractable GrabInteractable = Dragedobject.GetComponent(); Rigidbody Rigidbody = Dragedobject.GetComponent(); Rokid.UXR.Interaction.Throwable Throwable = Dragedobject.GetComponent(); // 原有的组件设置优先级最高 if (ObjectCollider == null) { ObjectCollider = Dragedobject.AddComponent(); ObjectCollider.isTrigger = true; } if (GrabInteractable == null) { GrabInteractable = Dragedobject.AddComponent(); GrabInteractable.rate = DragScale; } if (Rigidbody == null) { Rigidbody = Dragedobject.AddComponent(); Rigidbody.useGravity = false; } if (Throwable == null) { Throwable = Dragedobject.AddComponent(); } GrabInteractable.OnHeldUpdate.AddListener(() => DragingEvent?.Invoke(Dragedobject)); #elif Evo_Xreal var Throwable = Dragedobject.GetComponent(); if (Throwable == null) { Throwable = Dragedobject.AddComponent(); Throwable.throwOnDetach = true; Throwable.throwVelocityScale = DragScale; // 低数值 = 高惯性 } Throwable.GetComponent().useGravity = false; Throwable.selectEntered.AddListener((a) => DragingEvent?.Invoke(Dragedobject)); Throwable.enabled = true; #endif } /// /// 暂停拖动 /// /// public static void objectPauseDrag(this GameObject Dragedobject) { Collider ObjectCollider = Dragedobject.GetComponent(); if (ObjectCollider != null) ObjectCollider.enabled = false; } /// /// 恢复拖动 /// /// public static void objectResumeDrag(this GameObject Dragedobject) { Collider ObjectCollider = Dragedobject.GetComponent(); if (ObjectCollider != null) ObjectCollider.enabled = true; } public static void objectRemoveDrag(this GameObject Dragedobject) { #if Evo_Rokid Rokid.UXR.Interaction.Throwable Throwable = Dragedobject.GetComponent(); Rokid.UXR.Interaction.GrabInteractable GrabInteractable = Dragedobject.GetComponent(); if (Throwable != null) Object.Destroy(Throwable); if (GrabInteractable != null) { GrabInteractable.OnHeldUpdate.RemoveAllListeners(); Object.Destroy(GrabInteractable); } #elif Evo_Xreal var Throwable = Dragedobject.GetComponent(); if (Throwable != null) { Throwable.selectEntered.RemoveAllListeners(); Object.Destroy(Throwable); } #endif } #endregion } }