Пример #1
0
 void OnDestroy()
 {
     if (inst == this)
     {
         inst = null;
     }
 }
Пример #2
0
 void Awake()
 {
     inst = this;
     foreach (var p in pairs)
     {
         map[p.normal] = p.dead;
     }
 }
Пример #3
0
    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);
    }