/************************************************************************************
|
|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use
|
|
the Utilities SDK except in compliance with the License, which is provided at the time of installation
|
|
or download, or which otherwise accompanies this software in either electronic or hard copy form.
|
|
|
|
You may obtain a copy of the License at
|
|
https://developer.oculus.com/licenses/utilities-1.31
|
|
|
|
Unless required by applicable law or agreed to in writing, the Utilities SDK distributed
|
|
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
ANY KIND, either express or implied. See the License for the specific language governing
|
|
permissions and limitations under the License.
|
|
************************************************************************************/
|
|
|
|
using System;
|
|
using UnityEngine;
|
|
|
|
/// <summary>
|
|
/// An object that can be grabbed and thrown by OVRGrabber.
|
|
/// </summary>
|
|
public class OVRGrabbable : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
protected bool m_allowOffhandGrab = true;
|
|
[SerializeField]
|
|
protected bool m_snapPosition = false;
|
|
[SerializeField]
|
|
protected bool m_snapOrientation = false;
|
|
[SerializeField]
|
|
protected Transform m_snapOffset;
|
|
[SerializeField]
|
|
protected Collider[] m_grabPoints = null;
|
|
|
|
protected bool m_grabbedKinematic = false;
|
|
protected Collider m_grabbedCollider = null;
|
|
protected OVRGrabber m_grabbedBy = null;
|
|
|
|
/// <summary>
|
|
/// If true, the object can currently be grabbed.
|
|
/// </summary>
|
|
public bool allowOffhandGrab
|
|
{
|
|
get { return m_allowOffhandGrab; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// If true, the object is currently grabbed.
|
|
/// </summary>
|
|
public bool isGrabbed
|
|
{
|
|
get { return m_grabbedBy != null; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// If true, the object's position will snap to match snapOffset when grabbed.
|
|
/// </summary>
|
|
public bool snapPosition
|
|
{
|
|
get { return m_snapPosition; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// If true, the object's orientation will snap to match snapOffset when grabbed.
|
|
/// </summary>
|
|
public bool snapOrientation
|
|
{
|
|
get { return m_snapOrientation; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// An offset relative to the OVRGrabber where this object can snap when grabbed.
|
|
/// </summary>
|
|
public Transform snapOffset
|
|
{
|
|
get { return m_snapOffset; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the OVRGrabber currently grabbing this object.
|
|
/// </summary>
|
|
public OVRGrabber grabbedBy
|
|
{
|
|
get { return m_grabbedBy; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// The transform at which this object was grabbed.
|
|
/// </summary>
|
|
public Transform grabbedTransform
|
|
{
|
|
get { return m_grabbedCollider.transform; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// The Rigidbody of the collider that was used to grab this object.
|
|
/// </summary>
|
|
public Rigidbody grabbedRigidbody
|
|
{
|
|
get { return m_grabbedCollider.attachedRigidbody; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// The contact point(s) where the object was grabbed.
|
|
/// </summary>
|
|
public Collider[] grabPoints
|
|
{
|
|
get { return m_grabPoints; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Notifies the object that it has been grabbed.
|
|
/// </summary>
|
|
virtual public void GrabBegin(OVRGrabber hand, Collider grabPoint)
|
|
{
|
|
m_grabbedBy = hand;
|
|
m_grabbedCollider = grabPoint;
|
|
gameObject.GetComponent<Rigidbody>().isKinematic = true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Notifies the object that it has been released.
|
|
/// </summary>
|
|
virtual public void GrabEnd(Vector3 linearVelocity, Vector3 angularVelocity)
|
|
{
|
|
Rigidbody rb = gameObject.GetComponent<Rigidbody>();
|
|
rb.isKinematic = m_grabbedKinematic;
|
|
rb.velocity = linearVelocity;
|
|
rb.angularVelocity = angularVelocity;
|
|
m_grabbedBy = null;
|
|
m_grabbedCollider = null;
|
|
}
|
|
|
|
void Awake()
|
|
{
|
|
if (m_grabPoints.Length == 0)
|
|
{
|
|
// Get the collider from the grabbable
|
|
Collider collider = this.GetComponent<Collider>();
|
|
if (collider == null)
|
|
{
|
|
throw new ArgumentException("Grabbables cannot have zero grab points and no collider -- please add a grab point or collider.");
|
|
}
|
|
|
|
// Create a default grab point
|
|
m_grabPoints = new Collider[1] { collider };
|
|
}
|
|
}
|
|
|
|
protected virtual void Start()
|
|
{
|
|
m_grabbedKinematic = GetComponent<Rigidbody>().isKinematic;
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
if (m_grabbedBy != null)
|
|
{
|
|
// Notify the hand to release destroyed grabbables
|
|
m_grabbedBy.ForceRelease(this);
|
|
}
|
|
}
|
|
}
|