Ejemplo n.º 1
0
 private void FillPool()
 {
     for (int i = 0; i < poolReserve; i++)
     {
         StraightBlast newObj = Instantiate(blastPrefab, blastPoolHolder);
         newObj.gameObject.SetActive(false);
         pool.Add(newObj);
     }
 }
Ejemplo n.º 2
0
    public void Fire()
    {
        if (timer <= 0f)
        {
            timer = cooldown;
        }
        else
        {
            return;
        }

        float angle = parent.transform.eulerAngles.z;

        Vector2 aimPos   = aim;
        float   aimAngle = -Vector2.SignedAngle(Vector2.up, aimPos - (Vector2)transform.position);

        if (Mathf.Abs(Mathf.DeltaAngle(angle, aimAngle)) < aimThreshold)
        {
            angle = aimAngle;
        }

        angle *= Mathf.Deg2Rad;

        if (parent.rb != null)
        {
            Vector2 dir = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle));
            dir.Normalize();
            parent.rb.AddForce(-dir * recoil);
        }

        for (int i = alternatingFire ? nextWeaponCounter : 0; i < weapons.Length; i++)
        {
            StraightBlast blast = pool[pool.Count - 1];
            pool.RemoveAt(pool.Count - 1);
            blast.Shoot(weapons[i].position, Quaternion.Euler(Vector3.forward * angle * Mathf.Rad2Deg),
                        pool, parent);
            //muzzle flash
            GameObject muzFlash = Instantiate(muzzleFlash);
            muzFlash.transform.position    = weapons[i].position;
            muzFlash.transform.eulerAngles = Vector3.forward * transform.eulerAngles.z;
            muzFlash.transform.parent      = transform;
            muzFlash.GetComponent <SpriteRenderer>().flipX = flipMuzzleFlash;
            flipMuzzleFlash = !flipMuzzleFlash;

            if (alternatingFire)
            {
                nextWeaponCounter = (nextWeaponCounter + 1) % weapons.Length;
                break;
            }
        }
    }