public static ProjectileScript Spawn(Vector2 position, Sprite sprite, Vector2 vel, bool stickInTarget = false, int pierce = 0, float gravity = 0, float lifetime = 30, bool isEnemy = false, float rotationOffset = 0, float glow = 0) { var g = new GameObject(); g.AddComponent <Rigidbody2D>(); g.AddComponent <BoxCollider2D>(); g.AddComponent <SpriteRenderer>(); ProjectileScript p = g.AddComponent <ProjectileScript>(); //Debug.Log(p); #region Position, Rotation and velocity p.transform.position = position; p.rotationOffset = rotationOffset; p.AddComponents(); p.rb.velocity = vel; p.transform.eulerAngles = new Vector3(0, 0, p.rb.velocity.GetAngle() + rotationOffset); p.useGrav = gravity != 0; p.gravity = gravity; #endregion #region collision Setup if (isEnemy) { p.targetLayer = LayerMask.NameToLayer("Player"); p.gameObject.layer = LayerMask.NameToLayer("Enemy"); } else { p.gameObject.layer = LayerMask.NameToLayer("Player"); p.targetLayer = (1 << LayerMask.NameToLayer("Default")) | (1 << LayerMask.NameToLayer("Enemy")); } p.groundLayer = 1 << LayerMask.NameToLayer("Terrain"); p.willDespawn = lifetime != -1; p.lifetime = lifetime; p.rb.freezeRotation = true; p.rb.velocity = vel; p.collider.isTrigger = true; (p.collider as BoxCollider2D).size = sprite.rect.size / sprite.pixelsPerUnit; #endregion #region Visuals p.spriteRenderer.sprite = sprite; Material m = new Material(Resources.Load <Material>("Basic Material")); m.SetTexture("_MainText", sprite.texture); m.SetColor("_Color", new Vector4(1, 1, 1, 1) * (glow + 1)); p.spriteRenderer.material = m; p.spriteRenderer.sortingLayerName = "Effects"; #endregion return(p); }