Files
dungeons/Assets/ThirdParty/UltimateXR/Runtime/Scripts/Manipulation/IUxrGrabbable.cs

178 lines
9.4 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="IUxrGrabbable.cs" company="VRMADA">
// Copyright (c) VRMADA, All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using System;
using UnityEngine;
namespace UltimateXR.Manipulation
{
/// <summary>
/// Interface for all objects that can be grabbed/manipulated using the <see cref="UxrGrabManager" />.
/// </summary>
public interface IUxrGrabbable
{
#region Public Types & Data
/// <summary>
/// Event called when the object is about to be grabbed.
/// The following properties from <see cref="UxrManipulationEventArgs" /> will contain meaningful data:
/// <list type="bullet">
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabbableObject" />: Object that is about to be grabbed.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabbableAnchor" />: Target where the object is currently placed. Null
/// if it isn't on an anchor.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.Grabber" />: Grabber that is about to grab the object.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabPointIndex" />: Grab point index of the object that is about to be
/// grabbed.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.IsMultiHands" />: true if it is already being grabbed with one hand and
/// it will be grabbed with both hands after. False if no hand is currently grabbing it.
/// </item>
/// </list>
/// </summary>
public event EventHandler<UxrManipulationEventArgs> Grabbing;
/// <summary>
/// Event called right after the object was grabbed. The grab event parameters use the same values as
/// <see cref="Grabbing" />.
/// </summary>
public event EventHandler<UxrManipulationEventArgs> Grabbed;
/// <summary>
/// Event called when the object is about to be released. An object is released when the last grip is released and
/// there is no compatible <see cref="UxrGrabbableObjectAnchor" /> near enough to place it on.
/// The following properties from <see cref="UxrManipulationEventArgs" /> will contain meaningful data:
/// <list type="bullet">
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabbableObject" />: Object that is about to be released.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabbableAnchor" />: Anchor where the object was originally grabbed
/// from. Null if it wasn't on a target.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.Grabber" />: Grabber that is about to release the object.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabPointIndex" />: Grab point index of the object that is being
/// grabbed by the <see cref="UxrGrabber" />.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.IsMultiHands" />: true if it is already being grabbed with another hand
/// that will keep it holding. False if no other hand is currently grabbing it.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.IsSwitchHands" />: True if it was released because another
/// <see cref="UxrGrabber" /> grabbed it, false otherwise. if
/// <see cref="UxrManipulationEventArgs.IsMultiHands" /> is
/// true then <see cref="UxrManipulationEventArgs.IsSwitchHands" /> will tell if it was released by both hands
/// (false) or if it was just released by one hand and the other one still keeps it grabbed (true).
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.ReleaseVelocity" />: Velocity the object is being released with.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.ReleaseAngularVelocity" />: Angular velocity the object is being
/// released with.
/// </item>
/// </list>
/// </summary>
public event EventHandler<UxrManipulationEventArgs> Releasing;
/// <summary>
/// Event called right after the object was released. An object is released when the last grip is released and there is
/// no compatible <see cref="UxrGrabbableObjectAnchor" /> near enough to place it on.
/// The grab event parameters use the same values as <see cref="Releasing" />.
/// </summary>
public event EventHandler<UxrManipulationEventArgs> Released;
/// <summary>
/// Event called when the object is about to be placed. An object is placed when the last grip is released and there is
/// a compatible <see cref="UxrGrabbableObjectAnchor" /> near enough to place it on.
/// The following properties from <see cref="UxrManipulationEventArgs" /> will contain meaningful data:
/// <list type="bullet">
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabbableObject" />: Object that is about to be removed.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabbableAnchor" />: Anchor where the object is currently placed.
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.Grabber" />: Grabber that is about to remove the object by grabbing it.
/// This can be null if the object is removed through code using
/// <see cref="UxrGrabManager.RemoveObjectFromAnchor" />,
/// <see cref="UxrGrabbableObject.RemoveFromAnchor" /> or <see cref="UxrGrabbableObjectAnchor.RemoveObject" />>
/// </item>
/// <item>
/// <see cref="UxrManipulationEventArgs.GrabPointIndex" />: Only if the object is being removed by grabbing it:
/// Grab point index of the object that is about to be grabbed by the <see cref="UxrGrabber" />.
/// </item>
/// </list>
/// </summary>
public event EventHandler<UxrManipulationEventArgs> Placing;
/// <summary>
/// Event called right after the object was placed. An object is placed when the last grip is released and there is a
/// compatible <see cref="UxrGrabbableObjectAnchor" /> near enough to place it on.
/// The grab event parameters use the same values as <see cref="Placed" />.
/// </summary>
public event EventHandler<UxrManipulationEventArgs> Placed;
/// <summary>
/// Gets the associated <see cref="GameObject" />. Since all components that implement the interface will be assigned
/// to GameObjects, this allows to access them using the interface.
/// It doesn't follow the property PascalCase naming to make it compatible with Unity.
/// </summary>
public GameObject gameObject { get; }
/// <summary>
/// Gets the associated <see cref="Transform" /> component. Since all components that implement the interface will be
/// assigned to GameObjects, this allows to access their transform using the interface.
/// It doesn't follow the property PascalCase naming to make it compatible with Unity.
/// </summary>
public Transform transform { get; }
/// <summary>
/// Gets whether the object is being grabbed.
/// </summary>
public bool IsBeingGrabbed { get; }
/// <summary>
/// Gets or sets whether the object can be grabbed.
/// </summary>
public bool IsGrabbable { get; set; }
/// <summary>
/// Gets or sets whether the rigidbody that drives the object (if any) is kinematic.
/// </summary>
public bool IsKinematic { get; set; }
#endregion
#region Public Methods
/// <summary>
/// Resets the object to its initial position/rotation and state. If the object is currently being grabbed, it will be
/// released.
/// </summary>
/// <param name="propagateEvents">Should <see cref="UxrManipulationEventArgs" /> events be generated?</param>
public void ResetPositionAndState(bool propagateEvents);
/// <summary>
/// Releases the object from all its grabs if there are any.
/// </summary>
/// <param name="propagateEvents">Should <see cref="UxrManipulationEventArgs" /> events be generated?</param>
public void ReleaseGrabs(bool propagateEvents);
#endregion
}
}