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
}
}