78 lines
2.6 KiB
C#
78 lines
2.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Script.Gameplay.Connect;
|
|
using Script.Gameplay.Interface;
|
|
|
|
namespace Script.Gameplay.Edit
|
|
{
|
|
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<ConnectionLine> ConnectionLines { get; set; } = new List<ConnectionLine>();
|
|
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<Rigidbody>();
|
|
if (rb != null)
|
|
{
|
|
rb.AddForce(emitPoint.TransformDirection(emitDirection.normalized) * emitForce, ForceMode.Impulse);
|
|
}
|
|
// 添加销毁逻辑
|
|
Destroy(obj, destroyDelay);
|
|
}
|
|
}
|
|
}
|