相关组件下载
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函数,对相应的事件进行赋值,以实现功能。
个人认为,该方式灵活性更高。