using UnityEngine; // แท่นวาร์ปในแม็พปริซึม: บินเข้าแท่นแล้วไปโผล่ที่แท่นคู่กัน (สีเดียวกัน) // เจ้าของยานเป็นคนตัดสินใจวาร์ป แล้วแจ้งทุกเครื่องผ่าน PlayerController.WarpRPC // มีคูลดาวน์ต่อยาน (PlayerController.WarpCooldown) กันวาร์ปไปกลับรัวๆ [RequireComponent(typeof(Collider2D))] public class WarpPad : MonoBehaviour { public static readonly Color ColorA = new Color(.45f, .95f, 1f); public static readonly Color ColorB = new Color(1f, .55f, 1f); public WarpPad partner; public Color tint = Color.white; private SpriteRenderer glow; private float flash; private const float GlowSize = 7f; private void Start() { // แท่นที่บันทึกใน Scene แล้วลืมผูกคู่: หาคู่จากชื่อ (WarpPad_A1 ↔ WarpPad_A2) if (partner == null && transform.parent != null && name.Length > 1) { string partnerName = name.Substring(0, name.Length - 1) + (name.EndsWith("1") ? "2" : "1"); var other = transform.parent.Find(partnerName); if (other != null) partner = other.GetComponent(); } glow = PrismFx.CreateGlow(transform, transform.position, GlowSize, tint, -1); } private void Update() { if (glow == null) return; flash = Mathf.MoveTowards(flash, 0, Time.deltaTime * 2.5f); float t = Time.time * 2.6f + transform.position.x * .1f; float alpha = .28f + .14f * Mathf.Sin(t) + flash * .6f; glow.color = new Color(tint.r, tint.g, tint.b, alpha); glow.transform.localScale = Vector3.one * (GlowSize / PrismFx.DotWorldSize) * (1f + .07f * Mathf.Sin(t * .7f) + flash * .5f) / Mathf.Max(.001f, transform.lossyScale.x); } private void OnTriggerEnter2D(Collider2D other) => TryWarp(other); private void OnTriggerStay2D(Collider2D other) => TryWarp(other); private void TryWarp(Collider2D other) { if (partner == null) return; var ship = other.GetComponentInParent(); if (ship != null) ship.TryWarp(this, partner); } // จุดโผล่: ห่างจากแท่นไปทางกลางสนาม ไม่ทับวงแท่น (กันวาร์ปเด้งกลับทันที) public Vector2 ExitPoint() { Vector2 position = transform.position; Vector2 toCenter = position.sqrMagnitude > .01f ? -position.normalized : Vector2.up; return position + toCenter * 3.8f; } public void Flash() { flash = 1f; PrismFx.Burst(transform.position, tint, 5f); } }