123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- namespace ChivaXR.VR
- {
- using System.Collections.Generic;
- using UnityEngine;
- public struct CVR_InteractableTriggerEventArgs
- {
- public IVR_Interactable interactable;
- public CVR_TriggerTool triggerTool;
- public CVR_ToolType toolType;
- public Collider[] triggerObjects;
- }
- /// <summary>
- /// 工具的触发检测参数
- /// </summary>
- public struct ToolTriggerInfos
- {
- public float trigger_DetectionRange; //触发检测范围
- public CVR_TriggerList.CheckTypes toolCheckTypes;
- public string[] toolCheckInfos;
- public CVR_ButtonPressTypes buttonPressType;
- public CVR_ButtonTypes buttonType;
- }
- /// <summary>
- /// Trigger
- /// </summary>
- /// <param name="sender">this object</param>
- /// <param name="e"><see cref="InteractableObjectEventArgs"/></param>
- public delegate void CVRInteractableTriggerEventHandler(object sender, CVR_InteractableTriggerEventArgs e);
- /// <summary>
- /// 交互工具触发器
- /// </summary>
- [RequireComponent(typeof(IVR_Interactable))]
- public class CVR_TriggerTool : MonoBehaviour
- {
- private IVR_Interactable interactable;
- private GameObject currentHand;
- private List<Collider> _colliders = new List<Collider>();
- private CVR_TriggerList triggerList;
- public CVR_TriggerList TriggerList
- {
- get
- {
- if (triggerList == null)
- {
- triggerList = this.gameObject.AddComponent<CVR_TriggerList>();
- }
- return triggerList;
- }
- }
- /// <summary>
- /// 触发点
- /// </summary>
- public Transform triggerPoint;
- /// <summary>
- /// 触发范围
- /// </summary>
- public float triggerRange = 0.1f;
- /// <summary>
- /// 按键触发类型
- /// </summary>
- public CVR_ButtonPressTypes buttonPressType = CVR_ButtonPressTypes.PressDown;
- /// <summary>
- /// 按键类型
- /// </summary>
- public CVR_ButtonTypes buttonType = CVR_ButtonTypes.Trigger;
-
- public event CVRInteractableTriggerEventHandler InteractableTrigger;
- private void Awake()
- {
- interactable = this.GetComponent<IVR_Interactable>();
- CVR_ToolManager.Instance.RegisterTriggerTool(interactable.GetToolType(), this);
- }
- private void Update()
- {
- if (interactable.CVR_IsGrabbed() && interactable.CVR_CheckButtonState(buttonType, buttonPressType))
- {
- if (triggerPoint == null)
- {
- Debug.LogError(this.transform.name + "未添加TriggerPoint");
- return;
- }
- //射线检测
- RayCheck(triggerPoint.position, triggerRange);
- }
- }
- /// <summary>
- /// 球形射线检测
- /// </summary>
- /// <param name="center"></param>
- /// <param name="radius"></param>
- /// <returns></returns>
- private void RayCheck(Vector3 center, float radius)
- {
- _colliders.Clear();
- Collider[] hitColliders = Physics.OverlapSphere(center, radius);
- for (int i = 0; i < hitColliders.Length; i++)
- {
- if (CVR_TriggerList.Check(hitColliders[i].gameObject, TriggerList))
- {
- _colliders.Add(hitColliders[i]);
- }
- }
- OnInteractableObjectTrigger(this,
- new CVR_InteractableTriggerEventArgs()
- {
- interactable = this.interactable,
- triggerTool = this,
- toolType = interactable.GetToolType(),
- triggerObjects = _colliders.ToArray()
- });
- }
- public virtual void OnInteractableObjectTrigger(object sender, CVR_InteractableTriggerEventArgs e)
- {
- if (InteractableTrigger != null)
- {
- InteractableTrigger(this, e);
- }
- }
- /// <summary>
- ///重置工具触发参数
- /// </summary>
- /// <param name="triggerToolInfo"></param>
- public void ResetTriggerInfo(ToolTriggerInfos triggerToolInfo)
- {
- triggerRange = triggerToolInfo.trigger_DetectionRange;
- TriggerList.checkType = triggerToolInfo.toolCheckTypes;
- TriggerList.identifiers.Clear();
- TriggerList.identifiers.AddRange(triggerToolInfo.toolCheckInfos);
- buttonPressType = triggerToolInfo.buttonPressType;
- buttonType = triggerToolInfo.buttonType;
- }
- }
- }
|