VR模拟枪支打靶,消灭鬼怪,换弹以及上弦等等硬核枪支操作。 使用HTCVive设备,开启SteamVR进行游玩。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
4.1 KiB

3 years ago
//========= Copyright 2016-2018, HTC Corporation. All rights reserved. ===========
using HTC.UnityPlugin.Utility;
using UnityEngine;
using UnityEngine.EventSystems;
namespace HTC.UnityPlugin.ColliderEvent
{
public static class ColliderEventDataExtension
{
public static TEventCaster GetEventCaster<TEventCaster>(this ColliderEventData eventData) where TEventCaster : MonoBehaviour, IColliderEventCaster
{
if (!(eventData.eventCaster is TEventCaster)) { return null; }
return eventData.eventCaster as TEventCaster;
}
public static bool TryGetEventCaster<TEventCaster>(this ColliderEventData eventData, out TEventCaster eventCaster) where TEventCaster : MonoBehaviour, IColliderEventCaster
{
eventCaster = null;
if (!(eventData.eventCaster is TEventCaster)) { return false; }
eventCaster = eventData.eventCaster as TEventCaster;
return true;
}
}
public class ColliderEventData : BaseEventData
{
public readonly IColliderEventCaster eventCaster;
public ColliderEventData(IColliderEventCaster eventCaster) : base(null)
{
this.eventCaster = eventCaster;
}
}
public class ColliderHoverEventData : ColliderEventData
{
public ColliderHoverEventData(IColliderEventCaster eventCaster) : base(eventCaster) { }
}
public abstract class ColliderButtonEventData : ColliderEventData
{
public enum InputButton
{
Trigger,
PadOrStick,
GripOrHandTrigger,
FunctionKey,
}
public IndexedSet<GameObject> pressEnteredObjects = new IndexedSet<GameObject>();
public IndexedSet<GameObject> draggingHandlers = new IndexedSet<GameObject>();
public IndexedSet<GameObject> clickingHandlers = new IndexedSet<GameObject>();
public InputButton button { get; private set; }
public Vector3 pressPosition { get; set; }
public Quaternion pressRotation { get; set; }
public bool isDragging { get { return draggingHandlers.Count > 0; } }
public bool isPressed { get; set; }
public ColliderButtonEventData(IColliderEventCaster eventCaster, InputButton button = 0) : base(eventCaster)
{
this.button = button;
}
public abstract bool GetPress();
public abstract bool GetPressDown();
public abstract bool GetPressUp();
}
public abstract class ColliderAxisEventData : ColliderEventData
{
public enum InputAxis
{
Scroll2D,
Trigger1D,
}
public enum Dim
{
D1,
D2,
D3,
D4,
}
// raw delta values
private float m_x;
private float m_y;
private float m_z;
private float m_w;
public InputAxis axis { get; private set; }
public Dim dimention { get; private set; }
// delta values
public float x { get { return dimention >= Dim.D1 ? m_x : 0f; } set { if (dimention >= Dim.D1) m_x = value; } }
public float y { get { return dimention >= Dim.D2 ? m_y : 0f; } set { if (dimention >= Dim.D2) m_y = value; } }
public float z { get { return dimention >= Dim.D3 ? m_z : 0f; } set { if (dimention >= Dim.D3) m_z = value; } }
public float w { get { return dimention >= Dim.D4 ? m_w : 0f; } set { if (dimention >= Dim.D4) m_w = value; } }
public Vector2 v2 { get { return new Vector2(x, y); } set { x = value.x; y = value.y; } }
public Vector3 v3 { get { return new Vector3(x, y, z); } set { x = value.x; y = value.y; z = value.z; } }
public Vector4 v4 { get { return new Vector4(x, y, z, w); } set { x = value.x; y = value.y; z = value.z; w = value.w; } }
public ColliderAxisEventData(IColliderEventCaster eventCaster, Dim dimention, InputAxis axis = 0) : base(eventCaster)
{
this.axis = axis;
this.dimention = dimention;
}
public abstract Vector4 GetDelta();
}
}