diff options
Diffstat (limited to 'AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs')
-rw-r--r-- | AlienSurvival/Assets/Scripts/Test/TestWaspRobot.cs | 145 |
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]; + } + +} |