using UnityEngine; namespace Colosseum.Skills.Effects { /// /// 프리팹 스폰 효과 (투사체, 파티클 등) /// [CreateAssetMenu(fileName = "SpawnEffect", menuName = "Colosseum/Skills/Effects/Spawn")] public class SpawnEffect : SkillEffect { [Header("Spawn Settings")] [SerializeField] private GameObject prefab; [SerializeField] private SpawnLocation spawnLocation = SpawnLocation.Caster; [SerializeField] private Vector3 spawnOffset = Vector3.zero; [SerializeField] private bool parentToCaster = false; [Min(0f)] [SerializeField] private float autoDestroyTime = 3f; protected override void ApplyEffect(GameObject caster, GameObject target) { if (prefab == null || caster == null) return; Vector3 spawnPos = GetSpawnPosition(caster, target) + spawnOffset; Quaternion spawnRot = GetSpawnRotation(caster, target); Transform parent = parentToCaster ? caster.transform : null; GameObject instance = Object.Instantiate(prefab, spawnPos, spawnRot, parent); // SkillProjectile 컴포넌트가 있으면 초기화 var projectile = instance.GetComponent(); if (projectile != null) { projectile.Initialize(caster, this); } if (autoDestroyTime > 0f) { Object.Destroy(instance, autoDestroyTime); } } private Vector3 GetSpawnPosition(GameObject caster, GameObject target) { return spawnLocation switch { SpawnLocation.Caster => caster.transform.position, SpawnLocation.CasterForward => caster.transform.position + caster.transform.forward * 2f, SpawnLocation.Target => target != null ? target.transform.position : caster.transform.position, _ => caster.transform.position }; } private Quaternion GetSpawnRotation(GameObject caster, GameObject target) { if (spawnLocation == SpawnLocation.Target && target != null) { return Quaternion.LookRotation(target.transform.position - caster.transform.position); } return caster.transform.rotation; } } public enum SpawnLocation { Caster, CasterForward, Target } }