Tanoda
Alap/Positioner.cs
Go to the documentation of this file.
1using System.Collections;
2using System.Collections.Generic;
3using UnityEditor;
4using UnityEngine;
6#if !UNITY_WEBGL
7using Valve.VR.InteractionSystem;
8[RequireComponent(typeof(ThrowableCanDisable))]
9#endif
10public class Positioner : MonoBehaviour
11{
12 internal Vector3 startPosition;
13 internal Vector3 startRotation;
14 public Vector3 FinalPosition;
15 public Vector3 FinalRotation;
16 public Vector3 FinalForward;
17 public Vector3 FinalRight;
18 public Vector3 FinalUp;
19 public float TolerancePos = 0.1f;
20 public float ToleranceRot = 25;
21 public bool isScrew = false;
22 internal GameObject NewParent;
23 internal bool Reparent = false;
24 public int ActiveInStage = 0;
25 public UnityEvent InGoodPosition;
26
27#if !UNITY_WEBGL
28 private ThrowableCanDisable tcd;
29 private Interactable inter;
30#endif
31 private bool _finished = false;
32
33#if !UNITY_WEBGL
34 void Start()
35 {
36 tcd = GetComponent<ThrowableCanDisable>();
37 inter = GetComponent<Interactable>();
38 StageManager.instance.OnStageChanged += Instance_OnStageChanged;
39 }
40
41 void Instance_OnStageChanged(int stage)
42 {
43 if (stage == ActiveInStage)
44 {
45 inter.enabled = true;
46 tcd.enabled = true;
47 }
48 }
49#endif
50
51 // Update is called once per frame
52 void Update()
53 {
54 if (_finished) return;
55
56 if (Vector3.Distance(transform.position, FinalPosition) < TolerancePos)
57 {
58 if (Vector3.Distance(transform.eulerAngles, FinalRotation) < ToleranceRot)
59 {
60#if !UNITY_WEBGL
61 tcd.enabled = false;
62 inter.attachedToHand.DetachObject(gameObject);
63 inter.highlightOnHover = false;
64 inter.enabled = false;
65#endif
66 _finished = true;
67 StartCoroutine(LerpPlace());
68 }
69 }
70 }
71
72 private IEnumerator LerpPlace()
73 {
74 float time = 0;
75 while (time <= 0.5f)
76 {
77 time += Time.deltaTime;
78 transform.position = Vector3.LerpUnclamped(transform.position, FinalPosition, time / 0.5f);
79 transform.eulerAngles = Vector3.LerpUnclamped(transform.eulerAngles, FinalRotation, time / 0.5f);
80 yield return null;
81 }
82
83 if (Reparent && NewParent)
84 {
85 transform.parent = NewParent.transform;
86 }
87 InGoodPosition.Invoke();
88 }
89
90 internal void SaveStartPos()
91 {
92 startPosition = transform.position;
93 startRotation = transform.eulerAngles;
94 }
95
96 internal void SaveFinalPos()
97 {
98 FinalPosition = transform.position;
99 FinalRotation = transform.eulerAngles;
100 FinalForward = transform.forward;
101 FinalRight = transform.right;
102 FinalUp = transform.up;
103 }
104
105 internal void RestoreStartPos()
106 {
107 transform.position = startPosition;
108 transform.eulerAngles = startRotation;
109 }
110
111 internal void RestoreFinalPos()
112 {
113 transform.position = FinalPosition;
114 transform.eulerAngles = FinalRotation;
115 }
116}
117
118#if UNITY_EDITOR
119[CustomEditor(typeof(Positioner))]
120public class PositionerInspector : Editor
121{
122
123
124 public override void OnInspectorGUI ()
125 {
126 DrawDefaultInspector();
127
128 Positioner myTarget = (Positioner)target;
129 GUILayout.BeginHorizontal();
130 if (GUILayout.Button("Save Start Pos"))
131 {
132 myTarget.startPosition = myTarget.transform.position;
133 myTarget.startRotation = myTarget.transform.eulerAngles;
134 }
135 if (GUILayout.Button("Save Final Pos"))
136 {
137 myTarget.FinalPosition = myTarget.transform.position;
138 myTarget.FinalRotation = myTarget.transform.eulerAngles;
139 }
140 GUILayout.EndHorizontal();
141 GUILayout.BeginHorizontal();
142 if (GUILayout.Button("Restore to Start"))
143 {
144 myTarget.transform.position = myTarget.startPosition;
145 myTarget.transform.eulerAngles = myTarget.startRotation;
146 }
147 if (GUILayout.Button("Restore to Final"))
148 {
149 myTarget.transform.position = myTarget.FinalPosition;
150 myTarget.transform.eulerAngles = myTarget.FinalRotation;
151 }
152 GUILayout.EndHorizontal();
153
154 }
155}
156
157
158#endif
Vector3 FinalRotation
Vector3 FinalUp
UnityEvent InGoodPosition
Vector3 FinalRight
Vector3 FinalPosition
Vector3 FinalForward
float TolerancePos
float ToleranceRot