summaryrefslogtreecommitdiff
path: root/AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs
diff options
context:
space:
mode:
Diffstat (limited to 'AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs')
-rw-r--r--AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs145
1 files changed, 145 insertions, 0 deletions
diff --git a/AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs b/AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs
new file mode 100644
index 0000000..3a73d21
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs
@@ -0,0 +1,145 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class TestWaspRobot : MonoBehaviour
+{
+ [SerializeField] private TopDownTransform m_Follow;
+
+ [SerializeField] private float m_MoveSpeed;
+
+ private SpriteRenderer m_SpriteRenderer;
+ private TopDownTransform m_Coords;
+
+ // wasp»·ÈÆ
+ [SerializeField] private float m_Radius;
+
+ [SerializeField] private List<Sprite> m_Sprites;
+
+ private bool m_Following;
+
+ private float m_Angle;
+
+ private float m_OrbitSpeed = 3f;
+
+ enum State
+ {
+ None,
+ Move,
+ Orbit,
+ }
+
+ private State m_State = State.None;
+
+ private Coroutine m_Coroutine;
+
+ private void Start()
+ {
+ m_SpriteRenderer = GetComponent<SpriteRenderer>();
+ m_Coords = GetComponent<TopDownTransform>();
+
+ m_Following = false;
+ m_Angle = 0;
+
+ ChangeState(State.Move);
+ }
+
+ private void ChangeState(State state)
+ {
+ if(m_State != state)
+ {
+ //Debug.Log(m_State.ToString() + "->" + state.ToString());
+
+ if(m_Coroutine != null)
+ {
+ StopCoroutine(m_Coroutine);
+ }
+ m_State = state;
+ m_Coroutine = StartCoroutine("co" + m_State.ToString());
+ }
+ }
+
+ void Update()
+ {
+
+ float distance = (m_Follow.positionOnGround - m_Coords.positionOnGround).magnitude;
+ m_Following = distance > m_Radius + 0.1f;
+
+ if(m_Following)
+ {
+ ChangeState(State.Move);
+ }
+ else
+ {
+ ChangeState(State.Orbit);
+ }
+
+ }
+
+ IEnumerator coMove()
+ {
+ while (true)
+ {
+ if (m_Following)
+ {
+ Vector2 dir = (m_Follow.positionOnGround - m_Coords.positionOnGround).normalized;
+
+ Vector2 posOnGround = m_Coords.positionOnGround;
+ posOnGround.x += m_MoveSpeed * Time.deltaTime * dir.x;
+ posOnGround.y += m_MoveSpeed * Time.deltaTime * dir.y;
+
+ m_Coords.positionOnGround = posOnGround;
+
+ float rad = GetAngleToTarget();
+
+ int index = GetSpriteIndex(rad);
+ SetSprite(index);
+ }
+
+ yield return null;
+ }
+ }
+
+ IEnumerator coOrbit()
+ {
+ m_Angle = GetAngleToTarget();
+
+ while (true)
+ {
+ m_Angle += Time.deltaTime * m_OrbitSpeed;
+
+ Vector2 centre = m_Follow.positionOnGround;
+ centre += new Vector2(Mathf.Cos(m_Angle), Mathf.Sin(m_Angle)).normalized * m_Radius;
+ m_Coords.positionOnGround = Vector2.Lerp(m_Coords.positionOnGround, centre, 0.25f);
+
+ int index = GetSpriteIndex(m_Angle);
+ SetSprite(index);
+
+ yield return null;
+ }
+ }
+
+ float GetAngleToTarget()
+ {
+ Vector2 posOnGround = m_Coords.positionOnGround;
+ Vector2 target = m_Follow.positionOnGround;
+
+ Vector2 dir = (posOnGround - target).normalized;
+
+ return Mathf.Atan2(dir.y, dir.x) + 2 * Mathf.PI * TestMathHelper.Check(dir.y < 0);
+ }
+
+ // angle rad
+ int GetSpriteIndex(float rad)
+ {
+ int index = ((int)Mathf.Floor(((rad * Mathf.Rad2Deg) % 360) / 30)) % 12;
+ index = Mathf.Clamp(index, 0, m_Sprites.Count - 1);
+ return index;
+ }
+
+ void SetSprite(int index)
+ {
+ m_SpriteRenderer.sprite = m_Sprites[index];
+ }
+
+}