2using System.Collections;
3using System.Globalization;
5using System.Runtime.Serialization;
6using JetBrains.Annotations;
7using NaughtyAttributes;
13using Valve.VR.InteractionSystem;
20 private Hand[] playerHands;
22 private GameObject handGO;
23 private float minDistance;
24 private float prevDistance;
25 private bool onTheLine;
33 internal bool HandMove;
40 if (base.isInFieldOfView(
cachedGO)) base.actionRecognized =
true;
41 if (Player.instance ==
null)
return;
43 playerHands = Player.instance.hands;
44 if (playerHands !=
null)
58 float d =
float.MaxValue;
59 float handInteractDistance = 0.1f;
60 if (offsetHolder !=
null)
62 foreach (var hand
in playerHands)
64 var currentDistance = Vector3.Distance(hand.transform.position, offsetHolder.transform.TransformPoint(offsetHolder.
Offset));
65 if (currentDistance < d && currentDistance <= handInteractDistance)
69 handGO = hand.objectAttachmentPoint.gameObject;
100 StartCoroutine(SimpleFollowHand());
108 StartCoroutine(LerpPos());
126 private IEnumerator LerpPos()
131 lh += Time.deltaTime;
132 yield
return new WaitForEndOfFrame();
154 private IEnumerator csítesMoveAzAMTSre()
157 if (name ==
"0c4ac7d9-ed60-458a-a249-0a1833f8b1ee" || name ==
"a5c19db4-6286-4e8a-b735-781a1daeea35" || name ==
"134044ab-e1be-4597-be1d-6345633424ab")
161 Vector3 handStartPos =
default;
162 var startLocalRot =
cachedGO.transform.localEulerAngles;
163 var startLocalPos =
cachedGO.transform.localPosition;
166 if (Player.instance !=
null && handStartPos ==
default)
168 float d =
float.MaxValue;
169 foreach (var hand
in playerHands)
171 if (!hand.objectAttachmentPoint)
continue;
172 if (!hand.gameObject.activeInHierarchy)
continue;
173 var currentDistance =
Vector3.Distance(hand.objectAttachmentPoint.position,
cachedGO.transform.position);
174 if (currentDistance < d)
177 handGO = hand.objectAttachmentPoint.gameObject;
180 if (handStartPos ==
default && handGO !=
null)
182 handStartPos = handGO.transform.position;
190 var handdistance =
Vector3.Distance(handGO.transform.position, handStartPos);
191 var percent = handdistance / dist;
209 private IEnumerator SimpleFollowHand()
211 Transform OriginalParent =
cachedGO.transform.parent;
213 var startPos =
cachedGO.transform.position;
214 var startLocalPos =
cachedGO.transform.localPosition;
215 var startRot =
cachedGO.transform.rotation;
216 var startLocalRot =
cachedGO.transform.localEulerAngles;
217 Vector3 handStartPos =
default;
222 if (Player.instance !=
null)
224 float d =
float.MaxValue;
225 foreach (var hand
in playerHands)
227 if (!hand.objectAttachmentPoint)
continue;
228 if (!hand.gameObject.activeInHierarchy)
continue;
229 var currentDistance =
Vector3.Distance(hand.objectAttachmentPoint.position,
cachedGO.transform.position);
230 if (currentDistance < d)
233 handGO = hand.objectAttachmentPoint.gameObject;
236 if (handStartPos ==
default && handGO !=
null)
238 handStartPos = handGO.transform.position;
246 var handdistance =
Vector3.Distance(handGO.transform.position, handStartPos) * 0.5f;
247 var dist =
Vector3.Distance(startPos, targetWorldPos);
249 var percent = handdistance / dist;
250 if (percent > 1) percent = 1 + (1 - percent);
263 var firstSave =
true;
265 GameObject helper =
new GameObject();
266 helper.transform.position =
cachedGO.transform.position;
267 helper.transform.rotation =
cachedGO.transform.rotation;
269 while (Mathf.Abs(target - current) > 3)
271 if (Player.instance !=
null)
273 float d =
float.MaxValue;
274 foreach (var hand
in playerHands)
277 if (!hand.objectAttachmentPoint)
continue;
278 if (!hand.gameObject.activeInHierarchy)
continue;
279 var currentDistance =
Vector3.Distance(hand.objectAttachmentPoint.position,
cachedGO.transform.position);
280 if (currentDistance < d)
283 handGO = hand.objectAttachmentPoint.gameObject;
286 if (handStartPos ==
default && handGO !=
null)
288 handStartPos = handGO.transform.position;
296 helper.transform.LookAt(handGO.transform);
297 if (firstSave || startHandRot.eulerAngles ==
Vector3.zero)
299 startHandRot = helper.transform.rotation;
302 current =
Quaternion.Angle(startHandRot, helper.transform.rotation);
307 var percent = current / target;
308 if (percent > 1) percent = 1 + (1 - percent);
319 cachedGO.transform.SetParent(OriginalParent,
true);
327 GameObject helper =
new GameObject();
328 Transform OriginalParent =
cachedGO.transform.parent;
332 helper.transform.SetParent(
cachedGO.transform,
true);
334 helper.transform.localPosition = Vector3.zero;
338 helper.transform.SetParent(
cachedGO.transform.parent,
true);
340 cachedGO.transform.SetParent(helper.transform,
true);
343 var origLocal = helper.transform.localPosition;
344 while (Mathf.Abs(Vector3.Distance(
cachedGO.transform.position, targetWorldPos)) > 0.02)
347 origLocal.z = helper.transform.localPosition.z;
348 helper.transform.localPosition = origLocal;
361 helper.transform.position =
cachedGO.transform.position;
362 helper.transform.rotation =
cachedGO.transform.rotation;
363 var current = Quaternion.Angle(Quaternion.Euler(
originalRotation), helper.transform.rotation);
366 while (Mathf.Abs(target - current) > 1)
368 var worldOffsetPos = offsetHolder.transform.TransformPoint(offsetHolder.
Offset);
369 helper.transform.LookAt(handGO.transform);
370 current = Quaternion.Angle(Quaternion.Euler(
originalRotation), helper.transform.rotation);
375 cachedGO.transform.SetParent(OriginalParent,
true);
382 bool IsOnTheLine(Vector3 XPoint, Vector3 YPoint, Vector3 handPoint)
395 bool IsCBetweenAB(Vector3
A, Vector3
B, Vector3 C)
397 return Vector3.Dot((
B -
A).normalized, (C -
B).normalized) < 0f &&
Vector3.Dot((
A -
B).normalized, (C -
A).normalized) < 0f;
399 bool IsPointBetween(Vector3 a, Vector3 b, Vector3 point)
401 var ap =
Vector3.Distance(point, a);
402 var bp =
Vector3.Distance(point, b);
403 var ab =
Vector3.Distance(a, b);
404 return Mathf.Approximately(ap + bp, ab);
406 float distanceFromLine(Vector3
A, Vector3
B, Vector3 C)
408 Ray ray =
new Ray(
A,
B);
409 float distance =
Vector3.Cross(ray.direction, C - ray.origin).magnitude;
421 var ci = CultureInfo.CurrentCulture;
422 var nfi = ci.NumberFormat;
423 ttmInput.text =
ttmInput.text.Replace(
',', nfi.CurrencyDecimalSeparator[0]);
424 ttmInput.text =
ttmInput.text.Replace(
'.', nfi.CurrencyDecimalSeparator[0]);
425 var single = Convert.ToSingle(
ttmInput.text, ci);
426 ttmInput.text = single.ToString(
"F2");
431 Debug.LogWarning(
"not parsable number(?) in timeToMove inputfield!");
482 var ci = CultureInfo.CurrentCulture;
483 var nfi = ci.NumberFormat;
486 var single = Convert.ToSingle(
posInputs[0].text, ci);
487 posInputs[0].text = single.ToString(
"F1");
493 single = Convert.ToSingle(
posInputs[1].text, ci);
494 posInputs[1].text = single.ToString(
"F1");
500 single = Convert.ToSingle(
posInputs[2].text, ci);
501 posInputs[2].text = single.ToString(
"F1");
506 Debug.LogWarning(
"not parsable number(?) in Position inputfields!");
520 var ci = CultureInfo.CurrentCulture;
521 var nfi = ci.NumberFormat;
524 var single = Convert.ToSingle(
rotInputs[0].text, ci);
525 rotInputs[0].text = single.ToString(
"F0");
531 single = Convert.ToSingle(
rotInputs[1].text, ci);
532 rotInputs[1].text = single.ToString(
"F0");
538 single = Convert.ToSingle(
rotInputs[2].text, ci);
539 rotInputs[2].text = single.ToString(
"F0");
544 Debug.LogWarning(
"not parsable number(?) in Position inputfields!");
569 internal GameObject GetInputGO()
575 GameObject retval =
null;
583 Debug.Log($
"Mover requested: \"{retval}\"");
598 return inIDs.Keys.ToList()[0];
607 public new void GetObjectData(SerializationInfo info, StreamingContext context)
609 base.GetObjectData(info, context);
610 var convertOldSave =
false;
614 info.AddValue(
"timeToMove",
timeToMove, typeof(
float));
615 info.AddValue(
"HandMove", HandMove, typeof(
bool));
618 public MoveAction(SerializationInfo info, StreamingContext context) : base(info, context)
620 targetPosition = (Vector3)info.GetValue(
"targetPosition", typeof(Vector3));
621 targetRotation = (Vector3)info.GetValue(
"targetRotation", typeof(Vector3));
632 HandMove = info.GetBoolean(
"HandMove");
UnityEngine.UI.Button Button
void TriggerOutput(string id)
List< GameObject > outPuts
Connection GetConnectionByEndPointId(string id)
ActionObject GetActionByInOut(string id)
static Controller Instance
static float DistancePointLine(Vector3 point, Vector3 lineStart, Vector3 lineEnd)
static float StoF(string value)
static Vector3 ClampAngle(Vector3 value)
override void Triggered(string id)
MoveAction(SerializationInfo info, StreamingContext context)
void FillCurrentTransform()
void onPosChanged(string value)
void RefreshTargetDisplay()
void onRotChanged(string value)
new void GetObjectData(SerializationInfo info, StreamingContext context)
void onTtmChanged(string value)
void MoveWithHand(bool newValue)