forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			165 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/************************************************************************************
 | 
						|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
 | 
						|
 | 
						|
Licensed under the Oculus Master SDK License Version 1.0 (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/oculusmastersdk-1.0/
 | 
						|
 | 
						|
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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |