using System.Collections; using UnityEngine; [System.Serializable] public class ProjectilePattern { [SerializeField] public float Arc = 15; [SerializeField] public int Amount = 3; [SerializeField] public float Speed = 1; [SerializeField] public GameObject bulletPrefab; [SerializeField] public bool Burst = true; [SerializeField] public float BurstDelay = 0.1f; } public class ProjectileSpawner : MonoBehaviour { [SerializeField] private float delayBetweenBulletSequences = 0.1f; public void RunBulletSequence(Vector3 origin, Vector3 normal, Vector3 baseDirection, ProjectilePattern[] bulletSequence) { StartCoroutine(RunBulletSequenceCourotine(origin, normal, baseDirection, bulletSequence)); } private IEnumerator RunBulletSequenceCourotine(Vector3 origin, Vector3 normal, Vector3 baseDirection, ProjectilePattern[] bulletSequence) { baseDirection.Normalize(); foreach (ProjectilePattern bulletPattern in bulletSequence) { float stepSize = bulletPattern.Arc / ((float)bulletPattern.Amount); for (int i = 0; i < bulletPattern.Amount; i++) { float angle = stepSize * i + stepSize / 2f - bulletPattern.Arc / 2f; Vector3 bulletDir = Quaternion.AngleAxis(angle, normal) * baseDirection; GameObject projectile = Instantiate(bulletPattern.bulletPrefab, origin, Quaternion.identity); Debug.DrawRay(origin, bulletDir, Color.magenta, 5f); projectile.transform.up = bulletDir; projectile.GetComponent().AddForce(bulletDir * bulletPattern.Speed); projectile.GetComponent().comingFrom = GetComponent(); if (bulletPattern.Burst) yield return new WaitForSeconds(bulletPattern.BurstDelay); } yield return new WaitForSeconds(delayBetweenBulletSequences); } } public static Vector2 rotate(Vector2 v, float deg) { float delta = deg * (float)Mathf.Deg2Rad; return new Vector2( v.x * Mathf.Cos(delta) - v.y * Mathf.Sin(delta), v.x * Mathf.Sin(delta) + v.y * Mathf.Cos(delta) ); } }