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 collisions = new List(); //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(); m_SpriteRenderer = GetComponent(); 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); } }