void OnDestroy() { if (inst == this) { inst = null; } }
void Awake() { inst = this; foreach (var p in pairs) { map[p.normal] = p.dead; } }
public bool TryHit(Vector3 pos, Vector3 vel) { if (status == Status.Hit) { return(false); } var sfx = RNG.Range(1, 4); Jukebox.Play("victim_hit_" + sfx); dropShadow.enabled = false; status = Status.Hit; pos = transform.position; // hack var sprites = gameObject.GetComponentsInChildren <SpriteRenderer>(); shrapnel = new List <GameObject>(sprites.Length); foreach (var spr in sprites) { if (spr == dropShadow) { continue; } var xf = spr.transform; var bounds = spr.bounds; var dup = Dup(spr.gameObject).transform; var sr = dup.GetComponent <SpriteRenderer>(); var deadSprite = ShrapnelRemapper.Get(sr.sprite); if (deadSprite != null) { sr.sprite = deadSprite; } var body = new GameObject("Shrapnel", typeof(Rigidbody), typeof(SphereCollider)).GetComponent <Rigidbody>(); body.gameObject.layer = ShrapnelLayer; body.position = 0.3f * xf.position + 0.7f * pos; body.rotation = xf.rotation; body.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY; body.velocity = vel; body.AddForce(Vec(RNG.Range(-3f, 3f), RNG.Range(8f, 12f), RNG.Range(0.5f, 2.5f)), ForceMode.Impulse); body.interpolation = RigidbodyInterpolation.Extrapolate; body.angularDrag = 0.01f; body.drag = 0.01f; body.angularVelocity = Vec(0, 0, RNG.Range(-0.4f, 0.4f)); var sphere = body.GetComponent <SphereCollider>(); sphere.radius = 0.55f * Mathf.Min(bounds.size.x, bounds.size.y); sphere.sharedMaterial = shrapnelMat; dup.parent = body.transform; dup.localScale = xf.lossyScale; dup.localPosition = Vector3.zero; spr.enabled = false; shrapnel.Add(body.gameObject); } return(true); }