Assignment for RMIT Mixed Reality in 2020
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.
 
 
 

213 lines
8.3 KiB

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;
}
}
}
}