using System.Collections; using System.Collections.Generic; using UnityEngine; using Script.Gameplay.Connect; using Script.Gameplay.Interface; namespace Script.Gameplay.Facility { public class EmitterController : MonoBehaviour, IEditableComponent, IConnectable { [Header("发射器设置")] [SerializeField] private GameObject prefabToEmit; [SerializeField] private Transform emitPoint; [SerializeField] private Vector3 emitDirection = Vector3.forward; [SerializeField] private float emitForce = 10f; [SerializeField] private float emitInterval = 1f; [Header("生成对象销毁时间")] [SerializeField] private float destroyDelay = 5f; // 生成对象多少秒后销毁 private Coroutine emitCoroutine; // 不可交互 // 可编辑 public bool IsEditableActive { get; set; } = true; public string ComponentName { get; set; } = "Emitter"; public LockLevel LockLevel => LockLevel.Red; // 可连线 public List ConnectionLines { get; set; } = new List(); public void OnGazeEnter() { } public void OnGazeExit() { } public Vector3 GetPosition() => transform.position; public GameObject GetGameObject() => gameObject; public string GetConnectableName() => gameObject.name; // 接收信号 public void SignalActive(bool active, GameObject sender) { if(!IsEditableActive) return; if (active) { if (emitCoroutine == null) emitCoroutine = StartCoroutine(EmitRoutine()); } else { if (emitCoroutine != null) { StopCoroutine(emitCoroutine); emitCoroutine = null; } } } private IEnumerator EmitRoutine() { while (true) { Emit(); yield return new WaitForSeconds(emitInterval); } } private void Emit() { if (prefabToEmit == null || emitPoint == null) return; var obj = Instantiate(prefabToEmit, emitPoint.position, emitPoint.rotation); var rb = obj.GetComponent(); if (rb != null) { rb.AddForce(emitPoint.TransformDirection(emitDirection.normalized) * emitForce, ForceMode.Impulse); } // 添加销毁逻辑 Destroy(obj, destroyDelay); } } }