基于VIVE Input Utility(HTC的VR官方物理组件)的应用整理

基于VIVE Input Utility(HTC的VR官方物理组件)的应用整理

相关组件下载

VIVE Input Utility:HTC的VR官方物理组件,官方下载链接
以下脚本只有在相应脚本库(HTC.UnityPlugin.ColliderEvent)的环境下,才能使用。

整理的脚本

using HTC.UnityPlugin.ColliderEvent;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 碰撞事件类型
/// </summary>
public enum EventColliderType
{
    HoverEnter, HoverExit,
    PressDown, PressUp,
    PressEnter, PressExit, Click,
    DragStart, DragFixedUpdate, DragUpdate, DragEnd,
    Drop, AxisChanged
}

/// <summary>
/// 碰撞事件触发集合
/// </summary>
public class EventCollider : MonoBehaviour
    , IColliderEventHoverEnterHandler, IColliderEventHoverExitHandler
    , IColliderEventPressDownHandler, IColliderEventPressUpHandler
    , IColliderEventPressEnterHandler, IColliderEventPressExitHandler, IColliderEventClickHandler
    , IColliderEventDragStartHandler, IColliderEventDragFixedUpdateHandler, IColliderEventDragUpdateHandler, IColliderEventDragEndHandler
    , IColliderEventDropHandler, IColliderEventAxisChangedHandler
{
    public class ColliderEvent : UnityEvent<ColliderEventData>
    {
        public ColliderEvent() { }
    }

    private Dictionary<EventColliderType, ColliderEvent> colliders = new Dictionary<EventColliderType, ColliderEvent>();
    /// <summary>
    /// 添加碰撞事件
    /// </summary>
    /// <param name="type">事件类型</param>
    /// <param name="colliderevent">事件数组</param>
    public void AddColliderEvents(EventColliderType type, params UnityAction<ColliderEventData>[] colliderevent)
    {
        ColliderEvent Event = new ColliderEvent();
        for (int i = 0; i < colliderevent.Length; i++)
        {
            Event.AddListener(colliderevent[i]);
        }
        colliders[type] = Event;
    }
    /// <summary>
    /// 清空碰撞事件
    /// </summary>
    /// <param name="type">事件类型</param>
    public void ClearColliderEvents(EventColliderType type)
    {
        colliders.Remove(type);
    }

    public void OnColliderEventHoverEnter(ColliderHoverEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.HoverEnter))
            colliders[EventColliderType.HoverEnter].Invoke(eventData);
        //Debug.Log("手柄碰触进入");
    }
    public void OnColliderEventHoverExit(ColliderHoverEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.HoverExit))
            colliders[EventColliderType.HoverExit].Invoke(eventData);
        //Debug.Log("手柄碰触离开");
    }
    public void OnColliderEventPressDown(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.PressDown))
            colliders[EventColliderType.PressDown].Invoke(eventData);
        //Debug.Log("在触碰中Trigger键彻底按下");
    }
    public void OnColliderEventPressUp(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.PressUp))
            colliders[EventColliderType.PressUp].Invoke(eventData);
        //Debug.Log("在触碰中Trigger键彻底抬起");
    }
    public void OnColliderEventPressEnter(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.PressEnter))
            colliders[EventColliderType.PressEnter].Invoke(eventData);
        //Debug.Log("在彻底按下时触碰进入");
    }
    public void OnColliderEventPressExit(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.PressExit))
            colliders[EventColliderType.PressExit].Invoke(eventData);
        //Debug.Log("在彻底抬起时触碰离开");
    }
    public void OnColliderEventClick(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.Click))
            colliders[EventColliderType.Click].Invoke(eventData);
        //Debug.Log("碰撞事件触发(可:Trigger键在碰撞时按下,并在不离开碰撞的前提下抬起时触发)");
    }
    public void OnColliderEventDragStart(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.DragStart))
            colliders[EventColliderType.DragStart].Invoke(eventData);
        //Debug.Log("拖拽开始(必须在触碰中)");
    }
    public void OnColliderEventDragFixedUpdate(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.DragFixedUpdate))
            colliders[EventColliderType.DragFixedUpdate].Invoke(eventData);
        //Debug.Log("拖拽固定更新(后)(开始后可以离开碰触,也不会结束)");
    }
    public void OnColliderEventDragUpdate(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.DragUpdate))
            colliders[EventColliderType.DragUpdate].Invoke(eventData);
        //Debug.Log("拖拽更新(先)(开始后可以离开碰触,也不会结束)");
    }
    public void OnColliderEventDragEnd(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.DragEnd))
            colliders[EventColliderType.DragEnd].Invoke(eventData);
        //Debug.Log("拖拽结束(必须在触碰中)");
    }
    public void OnColliderEventDrop(ColliderButtonEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.Drop))
            colliders[EventColliderType.Drop].Invoke(eventData);
        //Debug.Log("碰撞事件终止(可:Trigger键在碰撞时按下,在离开碰撞并又回到碰撞后抬起时触发)");
    }
    public void OnColliderEventAxisChanged(ColliderAxisEventData eventData)
    {
        if (colliders.ContainsKey(EventColliderType.AxisChanged))
            colliders[EventColliderType.AxisChanged].Invoke(eventData);
        //Debug.Log("手柄在触碰中按下Trigger键的过程。即Trigger键的数值在0到1之间时,重复调用");
    }
}

该脚本包含组建中所有的物理事件,每个接口的作用,在脚本中都有简单的介绍,各位可以自行测试。其中所有的物理事件接口都来自组件中的脚本库:HTC.UnityPlugin.ColliderEvent

使用

自建MONO脚本

在找到需要的物理接口之后,自建一个MONO脚本,继承相应的接口,调用事件,实现功能。

调用事件

可将上面的脚本挂到相应的物体上,再使用代码,调用我已经建好的AddColliderEvents函数,对相应的事件进行赋值,以实现功能。
个人认为,该方式灵活性更高。

发布了20 篇原创文章 · 获赞 1 · 访问量 940

猜你喜欢

转载自blog.csdn.net/f_957995490/article/details/103618434