diff options
author | chai <215380520@qq.com> | 2023-05-12 10:32:11 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-05-12 10:32:11 +0800 |
commit | 2fc9585797067730f28b03b0727bf05f9deed091 (patch) | |
tree | 8807e37b85ba922045eaa17ac445dd0a1d2d730c /WorldlineKeepers/Assets/Scripts/Unit/Enemies/SpiritScript.cs | |
parent | 2a1cd4fda8a4a8e649910d16b4dfa1ce7ae63543 (diff) |
+ worldline keepers
Diffstat (limited to 'WorldlineKeepers/Assets/Scripts/Unit/Enemies/SpiritScript.cs')
-rw-r--r-- | WorldlineKeepers/Assets/Scripts/Unit/Enemies/SpiritScript.cs | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/WorldlineKeepers/Assets/Scripts/Unit/Enemies/SpiritScript.cs b/WorldlineKeepers/Assets/Scripts/Unit/Enemies/SpiritScript.cs new file mode 100644 index 0000000..7ebae9c --- /dev/null +++ b/WorldlineKeepers/Assets/Scripts/Unit/Enemies/SpiritScript.cs @@ -0,0 +1,113 @@ +using mh; +using MH; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class SpiritScript : UnitBase +{ + public float speed = 10f; + + public Item_Coin coinPrefab; + + public int count = 0; + public float avg = 0; + + private FastCircleCollider collider; + + private static List<IQuadTreeObject> collisions = new List<IQuadTreeObject>(); + + private SpriteRenderer m_SpriteRenderer; + + private int m_CollisionCheckerCount = 0; + + private static int sCount = 0; + private static float sAvg = 0; + + protected override void Awake() + { + base.Awake(); + collider = GetComponent<FastCircleCollider>(); + m_SpriteRenderer = GetComponent<SpriteRenderer>(); + speed = 2; + TestSpirits.spirits.Add(this); + } + + protected override void Update() + { + base.Update(); + } + + public void Tick() + { + UnitBase hero = UnitManager.hero; + Vector2 pos = transform.position; + Vector2 heroPos = hero.transform.position; + Vector2 dir = (heroPos - pos).normalized; + Vector2 dist = dir * Time.deltaTime * speed; // 位移 + m_SpriteRenderer.flipX = dir.x < 0; + + collisions.Clear(); + + bool bCollide = false; + // 这个优化可能会导致穿透 + //if (m_CollisionCheckerCount == 0 && PhysicsManager.Instance.RetriveColliders(ref collisions, collider)) + if (/*m_CollisionCheckerCount == 0 &&*/ PhysicsManager.Instance.RetriveColliders(ref collisions, collider)) + { + count = collisions.Count; + sAvg = (sCount * sAvg + count) / (float)(sCount + 1); + avg = sAvg; + sCount++; + bool movable = true; + Vector2 seperate = new Vector2(); + for (int i = 0; i < collisions.Count; ++i) + { + FastCircleCollider col = collisions[i] as FastCircleCollider; + if (col == collider) + continue; + if (PhysicsManager.CircleVsCircle(col.center, col.radius, collider.center, collider.radius)) + { + bCollide = true; + movable = false; + Vector2 distance = collider.center - col.center; + seperate = distance.normalized * (col.radius + collider.radius - distance.magnitude); // + dist -= (distance.normalized * dist) * distance.normalized; // 去除这个方向的位移 + dist += seperate; + } + } + if (!movable) + { + } + } + if (bCollide) + { + m_CollisionCheckerCount = 0; + } + else + { + m_CollisionCheckerCount++; + m_CollisionCheckerCount %= 10; + } + // dist = dist.normalized * Time.deltaTime * speed; // 保持原速 + transform.position += dist.ToVector3(); + } + + private void FixedUpdate() + { + } + + public void OnDestroy() + { + TestSpirits.spirits.Remove(this); + } + + public void Die() + { + Item_Coin coin = Instantiate(coinPrefab) as Item_Coin; + coin.transform.position = this.transform.position; + + this.gameObject.SetActive(false); + Destroy(this.gameObject); + } + +} |