namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using GrabAttachMechanics;
|
|
using SecondaryControllerGrabActions;
|
|
|
|
public class VRTK_ObjectSetup : EditorWindow
|
|
{
|
|
private enum PrimaryGrab
|
|
{
|
|
ChildOfController,
|
|
FixedJoint,
|
|
Climbable,
|
|
CustomJoint,
|
|
RotatorTrack,
|
|
SpringJoint,
|
|
TrackObject
|
|
}
|
|
private enum SecondaryGrab
|
|
{
|
|
SwapControllers,
|
|
ControlDirection,
|
|
AxisScale
|
|
}
|
|
private bool useGrab = true;
|
|
private bool holdGrab = false;
|
|
private bool useUse = false;
|
|
private bool useIfGrabbed = false;
|
|
private bool holdUse = false;
|
|
private PrimaryGrab primGrab;
|
|
private SecondaryGrab secGrab;
|
|
private bool disableIdle = true;
|
|
private bool addrb = true;
|
|
private bool addHaptics = true;
|
|
private Color touchColor = Color.clear;
|
|
|
|
[MenuItem("Window/VRTK/Setup Interactable Object")]
|
|
private static void Init()
|
|
{
|
|
VRTK_ObjectSetup window = (VRTK_ObjectSetup)EditorWindow.GetWindow(typeof(VRTK_ObjectSetup));
|
|
|
|
window.minSize = new Vector2(300f, 370f);
|
|
window.maxSize = new Vector2(400f, 400f);
|
|
|
|
window.autoRepaintOnSceneChange = true;
|
|
window.titleContent.text = "Setup Object";
|
|
window.Show();
|
|
}
|
|
|
|
private void OnGUI()
|
|
{
|
|
EditorGUILayout.Space();
|
|
EditorGUILayout.LabelField("Touch Options", EditorStyles.boldLabel);
|
|
touchColor = EditorGUILayout.ColorField("Touch Highlight Color", touchColor);
|
|
EditorGUILayout.Space();
|
|
|
|
EditorGUILayout.LabelField("Grab Options", EditorStyles.boldLabel);
|
|
useGrab = EditorGUILayout.Toggle("Is Grabbable", useGrab);
|
|
holdGrab = EditorGUILayout.Toggle("Hold Button To Grab", holdGrab);
|
|
EditorGUILayout.Space();
|
|
primGrab = (PrimaryGrab)EditorGUILayout.EnumPopup("Grab Attach Mechanic", primGrab);
|
|
secGrab = (SecondaryGrab)EditorGUILayout.EnumPopup("Secondary Grab Attach", secGrab);
|
|
EditorGUILayout.Space();
|
|
|
|
EditorGUILayout.LabelField("Use Options", EditorStyles.boldLabel);
|
|
useUse = EditorGUILayout.Toggle("Is Usable", useUse);
|
|
holdUse = EditorGUILayout.Toggle("Hold Button To Use", holdUse);
|
|
useIfGrabbed = EditorGUILayout.Toggle("Use Only If Grabbed", useIfGrabbed);
|
|
EditorGUILayout.Space();
|
|
|
|
EditorGUILayout.LabelField("Misc Options", EditorStyles.boldLabel);
|
|
disableIdle = EditorGUILayout.Toggle("Disable On Idle", disableIdle);
|
|
addrb = EditorGUILayout.Toggle("Add RigidBody", addrb);
|
|
addHaptics = EditorGUILayout.Toggle("Add Haptics", addHaptics);
|
|
EditorGUILayout.Space();
|
|
|
|
if (GUILayout.Button("Setup selected object(s)", GUILayout.Height(40)))
|
|
{
|
|
SetupObject();
|
|
}
|
|
}
|
|
|
|
private void SetupObject()
|
|
{
|
|
Transform[] transforms = Selection.transforms;
|
|
foreach (Transform currentTransform in transforms)
|
|
{
|
|
VRTK_InteractableObject interactableObject = SetupInteractableObject(currentTransform);
|
|
SetupPrimaryGrab(interactableObject);
|
|
SetupSecondaryGrab(interactableObject);
|
|
SetupRigidbody(interactableObject);
|
|
SetupHaptics(interactableObject);
|
|
SetupHighlighter(interactableObject);
|
|
}
|
|
}
|
|
|
|
private VRTK_InteractableObject SetupInteractableObject(Transform givenTransform)
|
|
{
|
|
VRTK_InteractableObject intObj = givenTransform.GetComponent<VRTK_InteractableObject>();
|
|
if (intObj == null)
|
|
{
|
|
intObj = givenTransform.gameObject.AddComponent<VRTK_InteractableObject>();
|
|
}
|
|
intObj.isGrabbable = useGrab;
|
|
intObj.holdButtonToGrab = holdGrab;
|
|
intObj.isUsable = useUse;
|
|
intObj.disableWhenIdle = disableIdle;
|
|
intObj.grabOverrideButton = VRTK_ControllerEvents.ButtonAlias.Undefined;
|
|
intObj.useOverrideButton = VRTK_ControllerEvents.ButtonAlias.Undefined;
|
|
return intObj;
|
|
}
|
|
|
|
private void SetupPrimaryGrab(VRTK_InteractableObject givenObject)
|
|
{
|
|
VRTK_BaseGrabAttach grab = givenObject.GetComponentInChildren<VRTK_BaseGrabAttach>();
|
|
if (grab != null)
|
|
{
|
|
DestroyImmediate(grab);
|
|
}
|
|
switch (primGrab)
|
|
{
|
|
case PrimaryGrab.ChildOfController:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_ChildOfControllerGrabAttach>();
|
|
break;
|
|
case PrimaryGrab.FixedJoint:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_FixedJointGrabAttach>();
|
|
break;
|
|
case PrimaryGrab.Climbable:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_ClimbableGrabAttach>();
|
|
break;
|
|
case PrimaryGrab.CustomJoint:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_CustomJointGrabAttach>();
|
|
break;
|
|
case PrimaryGrab.RotatorTrack:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_RotatorTrackGrabAttach>();
|
|
break;
|
|
case PrimaryGrab.SpringJoint:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_SpringJointGrabAttach>();
|
|
break;
|
|
case PrimaryGrab.TrackObject:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_TrackObjectGrabAttach>();
|
|
break;
|
|
default:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_ChildOfControllerGrabAttach>();
|
|
break;
|
|
}
|
|
givenObject.grabAttachMechanicScript = grab;
|
|
}
|
|
|
|
private void SetupSecondaryGrab(VRTK_InteractableObject givenObject)
|
|
{
|
|
VRTK_BaseGrabAction grab = givenObject.GetComponentInChildren<VRTK_BaseGrabAction>();
|
|
if (grab != null)
|
|
{
|
|
DestroyImmediate(grab);
|
|
}
|
|
switch (secGrab)
|
|
{
|
|
case SecondaryGrab.SwapControllers:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_SwapControllerGrabAction>();
|
|
break;
|
|
case SecondaryGrab.ControlDirection:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_ControlDirectionGrabAction>();
|
|
break;
|
|
case SecondaryGrab.AxisScale:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_AxisScaleGrabAction>();
|
|
break;
|
|
default:
|
|
grab = givenObject.gameObject.AddComponent<VRTK_SwapControllerGrabAction>();
|
|
break;
|
|
}
|
|
givenObject.secondaryGrabActionScript = grab;
|
|
}
|
|
|
|
private void SetupRigidbody(VRTK_InteractableObject givenObject)
|
|
{
|
|
if (addrb)
|
|
{
|
|
Rigidbody rb = givenObject.GetComponent<Rigidbody>();
|
|
if (rb == null)
|
|
{
|
|
givenObject.gameObject.AddComponent<Rigidbody>();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetupHaptics(VRTK_InteractableObject givenObject)
|
|
{
|
|
if (addHaptics)
|
|
{
|
|
VRTK_InteractHaptics haptics = givenObject.GetComponentInChildren<VRTK_InteractHaptics>();
|
|
if (haptics == null)
|
|
{
|
|
givenObject.gameObject.AddComponent<VRTK_InteractHaptics>();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetupHighlighter(VRTK_InteractableObject givenObject)
|
|
{
|
|
if (touchColor != Color.clear)
|
|
{
|
|
VRTK_InteractObjectHighlighter highlighter = givenObject.GetComponentInChildren<VRTK_InteractObjectHighlighter>();
|
|
if (highlighter == null)
|
|
{
|
|
highlighter = givenObject.gameObject.AddComponent<VRTK_InteractObjectHighlighter>();
|
|
}
|
|
highlighter.touchHighlight = touchColor;
|
|
}
|
|
}
|
|
}
|
|
}
|