Elin Decompiled Documentation EA 23.344.1 Nightly
Loading...
Searching...
No Matches
MissileHomingEffect.cs
Go to the documentation of this file.
1using System;
2using UnityEngine;
3
4public class MissileHomingEffect : MonoBehaviour
5{
6 [Header("Orbit")]
7 [SerializeField]
8 private float orbitRadiusMin = 2f;
9
10 [SerializeField]
11 private float orbitRadiusMax = 4f;
12
13 [SerializeField]
14 private float orbitAngleMin = 220f;
15
16 [SerializeField]
17 private float orbitAngleMax = 340f;
18
19 [Header("Timing")]
20 [SerializeField]
21 private float launchDelayMin;
22
23 [SerializeField]
24 private float launchDelayMax = 0.25f;
25
26 [SerializeField]
27 private bool useFixedDuration = true;
28
29 [SerializeField]
30 private float fixedDurationMin = 0.65f;
31
32 [SerializeField]
33 private float fixedDurationMax = 0.95f;
34
35 [SerializeField]
36 private float speed = 10f;
37
38 [Header("Rotation")]
39 [SerializeField]
40 private bool rotateToDirection = true;
41
42 [SerializeField]
43 private float rotationOffset;
44
45 private SpriteRenderer spriteRenderer;
46
47 private bool launched;
48
49 private bool startedMoving;
50
51 private float delayElapsed;
52
53 private float launchDelay;
54
55 private float elapsed;
56
57 private float travelDuration;
58
59 private float launchZ;
60
61 private Vector2 startPosition;
62
63 private Vector2 targetPosition;
64
65 private float startRadius;
66
67 private float peakRadius;
68
69 private float startAngle;
70
71 private float totalAngle;
72
73 private float turnSign;
74
75 public bool IsFlying => launched;
76
77 private void Awake()
78 {
79 spriteRenderer = GetComponent<SpriteRenderer>();
80 }
81
82 public void Launch(Vector2 from, Vector2 to)
83 {
84 launchZ = base.transform.position.z;
85 base.transform.position = new Vector3(from.x, from.y, launchZ);
86 startPosition = from;
87 targetPosition = to;
88 delayElapsed = 0f;
89 elapsed = 0f;
90 startedMoving = false;
91 launched = true;
92 launchDelay = UnityEngine.Random.Range(launchDelayMin, launchDelayMax);
93 if (spriteRenderer != null)
94 {
95 spriteRenderer.enabled = launchDelay <= 0f;
96 }
97 Vector2 vector = from - to;
98 startRadius = vector.magnitude;
99 if (startRadius < 0.001f)
100 {
101 startRadius = 0.001f;
102 vector = Vector2.right * startRadius;
103 }
104 startAngle = Mathf.Atan2(vector.y, vector.x);
105 float f = UnityEngine.Random.Range(orbitAngleMin, orbitAngleMax);
106 totalAngle = Mathf.Max(180f, Mathf.Abs(f)) * (MathF.PI / 180f);
107 turnSign = ((UnityEngine.Random.value < 0.5f) ? (-1f) : 1f);
108 float a = UnityEngine.Random.Range(orbitRadiusMin, orbitRadiusMax);
109 peakRadius = Mathf.Max(a, startRadius * 0.75f);
111 {
112 travelDuration = Mathf.Max(0.001f, UnityEngine.Random.Range(fixedDurationMin, fixedDurationMax));
113 }
114 else
115 {
116 float num = EstimatePathLength();
117 travelDuration = num / Mathf.Max(0.001f, speed);
118 }
119 if (launchDelay <= 0f)
120 {
121 StartMoving();
122 }
123 }
124
125 private void Update()
126 {
127 if (!launched)
128 {
129 return;
130 }
131 if (!startedMoving)
132 {
133 delayElapsed += Time.deltaTime;
135 {
136 StartMoving();
137 }
138 return;
139 }
140 elapsed += Time.deltaTime;
141 float num = Mathf.Clamp01(elapsed / travelDuration);
142 Vector2 vector = EvaluatePosition(num);
143 base.transform.position = new Vector3(vector.x, vector.y, launchZ);
145 {
146 UpdateRotation(num);
147 }
148 if (num >= 1f)
149 {
150 base.transform.position = new Vector3(targetPosition.x, targetPosition.y, launchZ);
151 if (spriteRenderer != null)
152 {
153 spriteRenderer.enabled = false;
154 }
155 launched = false;
156 OnArrive();
157 }
158 }
159
160 private void StartMoving()
161 {
162 startedMoving = true;
163 elapsed = 0f;
164 base.transform.position = new Vector3(startPosition.x, startPosition.y, launchZ);
165 if (spriteRenderer != null)
166 {
167 spriteRenderer.enabled = true;
168 }
170 {
171 UpdateRotation(0f);
172 }
173 }
174
175 private Vector2 EvaluatePosition(float t)
176 {
177 float num = EvaluateRadius(t);
178 float f = startAngle + totalAngle * turnSign * t;
179 Vector2 vector = new Vector2(Mathf.Cos(f), Mathf.Sin(f));
180 return targetPosition + vector * num;
181 }
182
183 private Vector2 EvaluateDirection(float t)
184 {
185 float num = EvaluateRadius(t);
186 float num2 = EvaluateRadiusDerivative(t);
187 float f = startAngle + totalAngle * turnSign * t;
188 float num3 = totalAngle * turnSign;
189 Vector2 vector = new Vector2(Mathf.Cos(f), Mathf.Sin(f));
190 Vector2 vector2 = new Vector2(0f - vector.y, vector.x);
191 return vector * num2 + vector2 * num * num3;
192 }
193
194 private float EvaluateRadius(float t)
195 {
196 float num = 1f - t;
197 return num * num * num * startRadius + 3f * num * num * t * peakRadius + 3f * num * t * t * peakRadius;
198 }
199
200 private float EvaluateRadiusDerivative(float t)
201 {
202 float num = 1f - t;
203 return 3f * num * num * (peakRadius - startRadius) - 3f * t * t * peakRadius;
204 }
205
206 private void UpdateRotation(float t)
207 {
208 Vector2 vector = EvaluateDirection(t);
209 if (!(vector.sqrMagnitude < 1E-06f))
210 {
211 float num = Mathf.Atan2(vector.y, vector.x) * 57.29578f;
212 base.transform.rotation = Quaternion.Euler(0f, 0f, num + rotationOffset);
213 }
214 }
215
216 private float EstimatePathLength()
217 {
218 float num = 0f;
219 Vector2 a = EvaluatePosition(0f);
220 for (int i = 1; i <= 32; i++)
221 {
222 Vector2 vector = EvaluatePosition((float)i / 32f);
223 num += Vector2.Distance(a, vector);
224 a = vector;
225 }
226 return num;
227 }
228
229 protected virtual void OnArrive()
230 {
231 }
232}
Vector2 EvaluateDirection(float t)
void UpdateRotation(float t)
SpriteRenderer spriteRenderer
Vector2 EvaluatePosition(float t)
float EvaluateRadius(float t)
float EvaluateRadiusDerivative(float t)
void Launch(Vector2 from, Vector2 to)