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 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(); m_Coords = GetComponent(); 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]; } }