2using System.Collections;
3using System.Collections.Generic;
4using System.Runtime.Serialization;
6using NaughtyAttributes;
11using System.Globalization;
13using static Valve.VR.InteractionSystem.Hand;
16using Valve.VR.InteractionSystem;
22 internal int toolIndex;
27 internal Vector3 targetPosition, targetRotation;
28 internal bool activated;
29 internal bool done, executed, hasSecondHighlight, destroyed;
30 private bool BrushGrabbed =
false;
32 internal Vector3 currpos, currrot, secondPos, secondRot, secondOriginalPos, secondOriginalRot, originalPosition, originalRotation;
33 internal GameObject highlightObject, highlightTool, highlightSecond;
35 [SerializeField]
private GameObject canvasSelector;
36 private GameObject canvasHierarchy;
41 private GameObject[] generatedTriggers;
42 internal GameObject finishBtn, inspector, canvas, stageManagerWindow, savedCustomTool;
43 internal int torqueNm;
44 private Coroutine mouseOver;
45 internal bool isRotated =
false;
46 internal Quaternion origRotation;
47 internal float time = 0.0f;
49 internal Transform originalSecondParent;
50 internal bool overload =
false;
51 internal bool stopped =
false;
52 internal bool following =
false;
53 internal GameObject installedGO;
86 canvasSelector = GameObject.Find(
"Canvas_selector");
87 stageManagerWindow = GameObject.Find(
"StageManager Window");
92 canvas = GameObject.Find(
"Canvas");
93 var trs = canvas.GetComponentsInChildren<Transform>(
true);
94 foreach (var t
in trs)
95 if (t.name ==
"Inspector")
96 inspector = t.gameObject;
98 trs = inspector.GetComponentsInChildren<Transform>(
true);
99 foreach (var t
in trs)
100 if (t.name ==
"FinishToolPos_Btn")
101 finishBtn = t.gameObject;
106 if (targetPosition ==
default && (Tool)
drop.value != Tool.GreaseBrush && (Tool)
drop.value != Tool.ClecoNutrunner)
return;
109 mouseOver = StartCoroutine(ShowHighLight());
115 if (mouseOver !=
null)
116 StopCoroutine(mouseOver);
117 Destroy(highlightObject);
118 Destroy(highlightTool);
127 if (originalPosition ==
null)
return;
128 GetToolObject().transform.position = originalPosition;
129 GetToolObject().transform.eulerAngles = originalRotation;
133 if (!inspector.activeSelf)
134 inspector.SetActive(
true);
136 var btnOffset = finishBtn.transform.parent.GetComponent<RectTransform>().rect.width;
138 finishBtn.GetComponent<RectTransform>().anchoredPosition =
new Vector2(-(btnOffset + spacing), 0);
140 finishBtn.SetActive(
true);
148 finishBtn.SetActive(
false);
152 internal void SetupIfDigitalTW()
171 secondPos = go.transform.position;
172 secondRot = go.transform.eulerAngles;
181 var to = GetToolObject();
182 if (to !=
null) toolname = to.name;
183 toolname = toolname.Replace(
"(Clone)",
"").Replace(
"_blue",
"");
190 switch ((Tool)
drop.value)
192 case Tool.Screwdriver:
201 case Tool.SmolWrench:
204 case Tool.SeegerPlier:
213 case Tool.DigitalTorqueWrench:
216 case Tool.LevegosPisztoly:
219 case Tool.GreaseBrush:
220 GetComponentInParent<Canvas>().enabled =
false;
221 canvasSelector.GetComponent<Canvas>().enabled =
true;
222 canvasSelector.GetComponentInChildren<
Button>().onClick.AddListener(OnGreaseTargetSelected);
224 canvasHierarchy = GameObject.Find(
"Hierarchy");
225 if (canvasHierarchy ==
null)
227 Debug.LogError(
"Hierarchy not found!");
231 canvasHierarchy.transform.SetParent(canvasSelector.transform,
false);
233 case Tool.ClecoNutrunner:
234 GetComponentInParent<Canvas>().enabled =
false;
235 canvasSelector.GetComponent<Canvas>().enabled =
true;
236 canvasSelector.GetComponentInChildren<
Button>().onClick.AddListener(OnClecoNutrunnerTargetSelected);
238 case Tool.CustomTool:
241 tool = savedCustomTool;
252 originalPosition = tool.transform.position;
253 originalRotation = tool.transform.eulerAngles;
254 if (targetPosition !=
default || targetRotation !=
default)
256 tool.transform.position = targetPosition;
257 tool.transform.eulerAngles = targetRotation;
263 currpos = tool.transform.position;
264 currrot = tool.transform.eulerAngles;
266 GameObject.Find(
"Btn_StageMgr").GetComponent<
Button>().onClick.Invoke();
269 finishBtn.GetComponent<
Button>().onClick.RemoveAllListeners();
270 finishBtn.GetComponent<
Button>().onClick.AddListener(OnFinishBtn);
280 savedCustomTool = tool;
282 currpos = tool.transform.position;
283 currrot = tool.transform.eulerAngles;
284 GameObject.Find(
"Btn_StageMgr").GetComponent<
Button>().onClick.Invoke();
287 finishBtn.GetComponent<
Button>().onClick.RemoveAllListeners();
288 finishBtn.GetComponent<
Button>().onClick.AddListener(OnFinishBtn);
292 void OnGreaseTargetSelected()
294 canvasSelector.GetComponentInChildren<
Button>().onClick.RemoveAllListeners();
296 GetComponentInParent<Canvas>().enabled =
true;
297 canvasSelector.GetComponent<Canvas>().enabled =
false;
298 canvasHierarchy.transform.SetParent(canvas.transform,
false);
300 StartCoroutine(TriggerCollGen());
303 void OnClecoNutrunnerTargetSelected()
305 canvasSelector.GetComponentInChildren<
Button>().onClick.RemoveAllListeners();
307 GetComponentInParent<Canvas>().enabled =
true;
308 canvasSelector.GetComponent<Canvas>().enabled =
false;
314 ResetTool(selection,
true);
317 void SaveTarget(Transform t)
319 targetPosition = t.position;
320 targetRotation = t.eulerAngles;
323 targetPosition =
selectedGO.transform.position;
324 targetRotation =
selectedGO.transform.eulerAngles;
328 void ResetTool(IEnumerable<GameObject> selection,
bool saveTarget =
false)
330 foreach (var o
in selection)
335 if (stageManagerWindow.GetComponent<CanvasGroup>().alpha == 0)
336 GameObject.Find(
"Btn_StageMgr").GetComponent<
Button>().onClick.Invoke();
339 if (saveTarget) SaveTarget(o.transform);
340 o.transform.eulerAngles = currrot;
341 o.transform.position = currpos;
346 case Tool.Screwdriver:
353 if (saveTarget) SaveTarget(
scanner.transform);
354 scanner.transform.eulerAngles = currrot;
355 scanner.transform.position = currpos;
359 if (saveTarget) SaveTarget(
wrench.transform);
360 wrench.transform.eulerAngles = currrot;
361 wrench.transform.position = currpos;
364 case Tool.SmolWrench:
365 if (saveTarget) SaveTarget(
smolwrench.transform);
370 case Tool.DigitalTorqueWrench:
376 case Tool.SeegerPlier:
383 if (saveTarget) SaveTarget(
filctoll.transform);
384 filctoll.transform.eulerAngles = currrot;
385 filctoll.transform.position = currpos;
389 if (saveTarget) SaveTarget(
hammer.transform);
390 hammer.transform.eulerAngles = currrot;
391 hammer.transform.position = currpos;
394 case Tool.LevegosPisztoly:
400 case Tool.CustomTool:
401 if (saveTarget) SaveTarget(o.transform);
402 o.transform.eulerAngles = currrot;
403 o.transform.position = currpos;
415 void OnRemovedFromSelection(IEnumerable<GameObject> selection)
417 ResetTool(selection);
423 if (
Math.Abs(t.position.x - ((
secondGO && t ==
secondGO.transform) ? secondPos.x : targetPosition.x) ) > 0.05f)
return false;
424 if (
Math.Abs(t.position.y - ((
secondGO && t ==
secondGO.transform) ? secondPos.y : targetPosition.y) ) > 0.05f)
return false;
425 if (
Math.Abs(t.position.z - ((
secondGO && t ==
secondGO.transform) ? secondPos.z : targetPosition.z) ) > 0.09f)
return false;
432 if (Quaternion.Angle(t.rotation, Quaternion.Euler(targetRotation)) < 25)
return true;
440 if (checker >= 2)
return true;
446 if (checker >= 2)
return true;
453 var result = eulerAngles - Mathf.CeilToInt(eulerAngles / 360f) * 360f;
454 if (result < 0) result += 360f;
463 if (base.isInFieldOfView(GetToolObject())) base.actionRecognized =
true;
466 if (!activated || done)
return;
471 var tool = GetToolObject();
483 StartCoroutine(ShowHighLight());
497 var t = tool.transform;
501 if (
secondGO.transform.parent != originalSecondParent)
503 Destroy(highlightSecond);
504 hasSecondHighlight =
true;
510 time += Time.deltaTime;
530 if (!highlightObject && !executed)
532 Destroy(highlightObject);
538 StartCoroutine(ShowSecondPreview(
secondGO));
545 StartCoroutine(ShowHighLight());
573 var dist =
Vector3.Distance(t.position, targetPosition);
579 origRotation = t.localRotation;
583 t.eulerAngles =
Macro.
LerpAngle((t.parent.rotation * origRotation).eulerAngles, targetRotation, Mathf.Max(0, 1f - Mathf.Max(0, dist - 0.05f) * 10));
598 TriggerOutput(
outPuts[0].name);
601 Destroy(highlightTool);
603 Destroy(highlightObject);
614 wrench.transform.eulerAngles = targetRotation;
615 wrench.transform.position = targetPosition;
629 smolwrench.transform.eulerAngles = targetRotation;
630 smolwrench.transform.position = targetPosition;
670 Destroy(highlightTool);
675 Destroy(highlightObject);
676 if (!
action.Contains(
"HoldTool") && nextActionIsTheSame() && (
Tool)
drop.value !=
Tool.DigitalTorqueWrench)
678 StartCoroutine(LateOnPutToolDown());
699 internal GameObject GetToolObject()
703 tool = savedCustomTool;
707 case Tool.Screwdriver:
716 case Tool.SmolWrench:
719 case Tool.DigitalTorqueWrench:
722 case Tool.SeegerPlier:
728 case Tool.GreaseBrush:
731 case Tool.ClecoNutrunner:
736 case Tool.LevegosPisztoly:
739 case Tool.CustomTool:
745 tool = savedCustomTool;
759 var ci = CultureInfo.CurrentCulture;
760 var nfi = ci.NumberFormat;
766 taktTime =
float.Parse(value, ci);
770 Debug.LogWarning(
"not parsable number(?) in holdTime inputfield!");
776 internal IEnumerator ShowHighLight()
778 if (highlightObject) Destroy(highlightObject);
788 yield
return new WaitForEndOfFrame();
795 cachedGO = savedCustomTool;
799 case Tool.Screwdriver:
808 case Tool.SmolWrench:
811 case Tool.DigitalTorqueWrench:
814 case Tool.SeegerPlier:
820 case Tool.CustomTool:
821 cachedGO = savedCustomTool;
826 case Tool.LevegosPisztoly:
829 case Tool.GreaseBrush:
834 case Tool.ClecoNutrunner:
845 highlightObject = Instantiate(cachedGO, targetPosition,
Quaternion.Euler(targetRotation), cachedGO.transform.parent);
846 highlightObject.transform.position = targetPosition;
847 highlightObject.transform.eulerAngles = targetRotation;
852 Destroy(highlightObject.GetComponent<Interactable>());
855 var allCollider = highlightObject.GetComponentsInChildren<Collider>();
856 var allRb = highlightObject.GetComponentsInChildren<Rigidbody>();
858 foreach (var c
in allCollider)
861 foreach (var c
in allRb)
864 Destroy(highlightObject.GetComponent<
HashHolder>());
866 yield
return new WaitForEndOfFrame();
870 Destroy(highlightObject);
874 highlightObject.transform.SetPositionAndRotation(targetPosition,
Quaternion.Euler(targetRotation));
875 highlightObject.transform.position = targetPosition;
876 highlightObject.transform.eulerAngles = targetRotation;
879 highlightObject.transform.localScale *= 1.001f;
881 highlightObject.transform.SetParent(
null,
true);
882 highlightObject.SetActive(
true);
883 MatChange(highlightObject);
884 if (highlightTool) highlightTool.SetActive(
false);
887 private IEnumerator ShowPreview(Vector3 TargetPosition, GameObject TargetObject)
890 yield
return new WaitForEndOfFrame();
907 private IEnumerator ShowSecondPreview(GameObject Target)
909 yield
return new WaitForEndOfFrame();
915 private IEnumerator ShowToolHighLight()
917 if (highlightTool) Destroy(highlightTool);
927 yield
return new WaitForEndOfFrame();
933 cachedGO = savedCustomTool;
937 case Tool.Screwdriver:
946 case Tool.SmolWrench:
949 case Tool.DigitalTorqueWrench:
952 case Tool.SeegerPlier:
961 case Tool.LevegosPisztoly:
964 case Tool.GreaseBrush:
967 case Tool.CustomTool:
968 cachedGO = savedCustomTool;
975 if (cachedGO ==
null)
Debug.LogError(
"ShowToolHighlight tool is null!");
977 highlightTool = Instantiate(cachedGO, cachedGO.transform.position, cachedGO.transform.rotation,
null);
982 Destroy(highlightTool.GetComponent<Interactable>());
984 var allCollider = highlightTool.GetComponentsInChildren<Collider>();
985 var allRb = highlightTool.GetComponentsInChildren<Rigidbody>();
987 foreach (var c
in allCollider)
990 foreach (var c
in allRb)
993 Destroy(highlightTool.GetComponent<
HashHolder>());
995 yield
return new WaitForEndOfFrame();
997 highlightTool.transform.SetPositionAndRotation(cachedGO.transform.position, cachedGO.transform.rotation);
1000 highlightTool.transform.localScale *= 1.001f;
1002 highlightTool.SetActive(
true);
1004 MatChange(highlightTool,
true);
1009 if (highlightSecond) Destroy(highlightSecond);
1013 yield
return new WaitForEndOfFrame();
1015 highlightSecond = Instantiate(
secondGO, pos, Quaternion.Euler(rot),
1017 highlightSecond.transform.position = pos;
1018 highlightSecond.transform.eulerAngles = rot;
1022 Destroy(highlightSecond.GetComponent<Interactable>());
1024 Destroy(highlightSecond.GetComponent<Rigidbody>());
1025 var allCollider = highlightSecond.GetComponentsInChildren<Collider>();
1026 foreach (var coll
in allCollider)
1031 highlightSecond.transform.SetParent(originalSecondParent,
true);
1034 yield
return new WaitForEndOfFrame();
1036 highlightSecond.transform.SetPositionAndRotation(pos, Quaternion.Euler(rot));
1037 highlightSecond.transform.position = pos;
1038 highlightSecond.transform.eulerAngles = rot;
1040 MatChange(highlightSecond,
true);
1046 if (highlightSecond) Destroy(highlightSecond);
1050 yield
return new WaitForEndOfFrame();
1052 highlightSecond = Instantiate(
secondGO, secondPos, Quaternion.Euler(secondRot),
1054 highlightSecond.transform.position = secondPos;
1055 highlightSecond.transform.eulerAngles = secondRot;
1059 Destroy(highlightSecond.GetComponent<Interactable>());
1061 Destroy(highlightSecond.GetComponent<Rigidbody>());
1062 var allCollider = highlightSecond.GetComponentsInChildren<Collider>();
1063 foreach (var coll
in allCollider)
1068 highlightSecond.transform.SetParent(originalSecondParent,
true);
1071 yield
return new WaitForEndOfFrame();
1073 highlightSecond.transform.SetPositionAndRotation(secondPos, Quaternion.Euler(secondRot));
1074 highlightSecond.transform.position = secondPos;
1075 highlightSecond.transform.eulerAngles = secondRot;
1077 MatChange(highlightSecond,
true);
1081 private void MatChange(GameObject go,
bool tool =
false)
1083 var mrs = go.GetComponentsInChildren<MeshRenderer>();
1084 foreach (var meshRenderer
in mrs)
1086 var list =
new List<Material>();
1087 for (var i = 0; i < meshRenderer.materials.Length; i++)
1090 meshRenderer.materials = list.ToArray();
1102 Destroy(highlightTool);
1104 StopAllCoroutines();
1105 StartCoroutine(LateOnPutToolDown());
1107 StartCoroutine(Cleanup());
1110 private IEnumerator LateOnPutToolDown()
1114 if (nextActionIsTheSame()) OnToolPutDown();
1119 if (tcd.onDetachFromHand ==
null)
1121 tcd.onDetachFromHand.AddListener(OnToolPutDown);
1125 internal bool nextActionIsTheSame()
1130 foreach (var conn
in connections)
1135 foreach (var act
in actions)
1139 if (toolIndex == ta.toolIndex)
1158 private IEnumerator Cleanup()
1161 Destroy(highlightTool);
1162 Destroy(highlightObject);
1164 Destroy(highlightTool);
1165 Destroy(highlightObject);
1167 Destroy(highlightTool);
1168 Destroy(highlightObject);
1170 Destroy(highlightTool);
1171 Destroy(highlightObject);
1176 torqueNm = Convert.ToInt32(input);
1183 NmInput?.SetActive((Tool)toolIndex == Tool.DigitalTorqueWrench);
1186 GetToolObject()?.SetActive(
true);
1190 private void Teszt()
1198 TriggerOutput(
outPuts[0].name);
1201 Destroy(highlightObject);
1202 Destroy(highlightTool);
1203 StopAllCoroutines();
1206 private IEnumerator TriggerCollGen()
1208 var target =
selectedGO.GetComponentInChildren<MeshRenderer>().gameObject;
1209 var isActive = target.activeSelf;
1210 target.SetActive(
true);
1212 var mc = target.AddComponent<MeshCollider>();
1213 var origScale = target.transform.localScale;
1214 var origPos = target.transform.position;
1216 target.transform.position =
Vector3.one * 999 * (
Random.value + 1);
1223 teg.OnTrigger.AddListener(TriggerOutput);
1224 generatedTriggers = teg.GenerateThreadLocking();
1226 target.transform.position = origPos;
1227 foreach (var generatedTrigger
in generatedTriggers) generatedTrigger.SetActive(
false);
1229 target.SetActive(isActive);
1233 private void TriggerOutput()
1238 var tool = GetToolObject();
1239 if (tool && !nextActionIsTheSame())
1246 Destroy(highlightTool);
1247 BrushGrabbed =
false;
1249 Destroy(highlightObject);
1254 StartCoroutine(LateTrigger(
id));
1265 var tool = GetToolObject();
1283 GetToolObject()?.SetActive(
true);
1285 if ((Tool)
drop.value == Tool.GreaseBrush)
1287 brush.transform.parent.gameObject.SetActive(
true);
1304 if (hash ==
"")
return;
1307 StartCoroutine(TriggerCollGen());
1312 if (!
action.Contains(
"HoldTool"))
1320 private void OnToolPutDown()
1323 if (GetToolObject())
1325 var rb = GetToolObject().GetComponentInChildren<Rigidbody>();
1328 rb.isKinematic =
true;
1329 rb.useGravity =
false;
1330 rb.velocity = Vector3.zero;
1335 TriggerOutput(
outPuts[0].name);
1338 if (!nextActionIsTheSame())
1340 if (GetToolObject() ==
null)
1356 var rb =
secondGO.GetComponent<Rigidbody>();
1357 rb.isKinematic =
true;
1359 tcd.enabled =
false;
1360 secondGO.transform.position = secondOriginalPos;
1361 secondGO.transform.eulerAngles = secondOriginalRot;
1365 Destroy(highlightTool);
1366 Destroy(highlightObject);
1372 var tool = GetToolObject();
1375 tcd.enabled =
false;
1376 tcd.onDetachFromHand.RemoveListener(OnToolPutDown);
1385 IEnumerator LateTrigger(
string id)
1387 yield
return new WaitForSeconds(0.5f);
1396 if (GetToolObject() ==
null && savedCustomTool !=
null)
1420 tcds.enabled =
true;
1422 tcds.attachmentFlags |= AttachmentFlags.SnapOnAttach;
1424 Macro.allActiveTCD.Add(tcds);
1425 originalSecondParent =
secondGO.transform.parent;
1426 secondOriginalPos =
secondGO.transform.position;
1427 secondOriginalRot =
secondGO.transform.eulerAngles;
1431 if (GetToolObject())
1433 var rb = GetToolObject().GetComponentInChildren<Rigidbody>();
1436 rb.isKinematic =
true;
1437 rb.useGravity =
false;
1444 StartCoroutine(ShowHighLight());
1458 StartCoroutine(ShowPreview(
brush.transform.position,
brush));
1459 BrushGrabbed =
true;
1462 foreach (var generatedTrigger
in generatedTriggers)
1463 generatedTrigger.SetActive(
true);
1465 if (btcd.onDetachFromHand ==
null)
1470 btcd.onDetachFromHand.AddListener(OnToolPutDown);
1478 StartCoroutine(ShowToolHighLight());
1482 StartCoroutine(ShowPreview(GetToolObject().transform.position, GetToolObject()));
1483 var tool = GetToolObject();
1491 if (tcd.onDetachFromHand ==
null)
1496 tcd.onDetachFromHand.AddListener(OnToolPutDown);
1502 internal IEnumerator TCDOff()
1504 yield
return new WaitForSeconds(0.7f);
1505 if (GetToolObject() ==
null)
1514 internal void ClecoCallback(Collider other)
1516 if (!activated || done)
return;
1519 if (other && (other.gameObject ==
selectedGO || other.transform.IsChildOf(
selectedGO.transform)))
1523 Destroy(highlightObject);
1527 public override void GetObjectData(SerializationInfo info, StreamingContext context)
1529 base.GetObjectData(info, context);
1530 var convertOldSave =
false;
1533 targetPosition = GameObject.Find(
"iris_position_helper").transform.TransformPoint(targetPosition);
1534 targetRotation = GameObject.Find(
"iris_position_helper").transform.TransformDirection(targetRotation);
1537 info.AddValue(
"toolIndex", toolIndex, typeof(
int));
1538 info.AddValue(
"targetPosition", targetPosition, typeof(Vector3));
1539 info.AddValue(
"targetRotation", targetRotation, typeof(Vector3));
1541 info.AddValue(
"selectedGO",
selectedGO, typeof(GameObject));
1545 info.AddValue(
"selectedGOHash",
selectedHash, typeof(
string));
1554 info.AddValue(
"customTool", savedCustomTool, typeof(GameObject));
1560 info.AddValue(
"customToolHash", savedCustomTool.GetComponent<
HashHolder>().
Hash, typeof(
string));
1567 info.AddValue(
"torqueNm", torqueNm, typeof(
int));
1571 info.AddValue(
"taktTime", taktTime, typeof(
float));
1575 info.AddValue(
"secondHash",
secondGoHash, typeof(
string));
1576 info.AddValue(
"sp", secondPos, typeof(Vector3));
1577 info.AddValue(
"sr", secondRot, typeof(Vector3));
1582 public ToolAction(SerializationInfo info, StreamingContext context) : base(info, context)
1584 toolIndex = (int)info.GetValue(
"toolIndex", typeof(
int));
1585 targetPosition = (Vector3)info.GetValue(
"targetPosition", typeof(Vector3));
1586 targetRotation = (Vector3)info.GetValue(
"targetRotation", typeof(Vector3));
1590 foreach (var e
in info)
1592 if (e.Name ==
"selectedGO")
selectedGO = (GameObject)info.GetValue(
"selectedGO", typeof(GameObject));
1593 if (e.Name ==
"customTool")
1594 savedCustomTool = (GameObject)info.GetValue(
"customTool", typeof(GameObject));
1595 if (e.Name ==
"selectedGOHash")
selectedHash = info.GetString(
"selectedGOHash");
1596 if (e.Name ==
"customToolHash")
customToolHash = info.GetString(
"customToolHash");
1598 if (e.Name ==
"torqueNm") torqueNm = info.GetInt32(
"torqueNm");
1600 if (e.Name ==
"second")
hasTwoObjects = info.GetBoolean(
"second");
1601 if (e.Name ==
"secondHash")
secondGoHash = info.GetString(
"secondHash");
1602 if (e.Name ==
"sp") secondPos = (Vector3)info.GetValue(
"sp", typeof(Vector3));
1603 if (e.Name ==
"sr") secondRot = (Vector3)info.GetValue(
"sr", typeof(Vector3));
1605 if (e.Name ==
"taktTime") taktTime = (float)info.GetValue(
"taktTime", typeof(
float));
UnityEngine.UI.Button Button
List< GameObject > outPuts
static ClecoTrigger instance
UnityEvent< Collider > triggerEnter
ActionObject[] GetActionsByIn(string id)
List< string > GetOutputConnectionsToObject(string id)
Connection GetConnectionById(string id)
static Controller Instance
void StartFollowing(Vector3 EndPosition, GameObject TargetObject)
static List< GameObject > gameObjects
A list of the currently selected GameObjects.
static void AddOnRemovedFromSelectionListener(Callback< IEnumerable< GameObject > > del)
static void SetSelection(IEnumerable< GameObject > selection)
static GameObject activeGameObject
static void SetInteractable(GameObject go, bool isKinematic=true)
static Vector3 LerpAngle(Vector3 from, Vector3 to, float t)
static ManipulatorArm instance
void hideHandPreview(GameObject objectToGrab)
void EnterOffsetEditor(GameObject objectToGrab, ActionObject action, Vector3 TargetPos, Vector3 TargetRot)
static PreviewHand Instance
static SeegerHelper instance
static SoundManager instance
static TorqueWrenchDigital instance
static TorqueWrench instance
static TorqueWrenchSmol instance