feat(Emmit): 实现发射器

This commit is contained in:
2025-10-21 15:32:59 +08:00
parent 6ff684a71e
commit a7dcf15aed
16 changed files with 673 additions and 11 deletions

View File

@@ -53,7 +53,7 @@ namespace Script.Gameplay.Facility
[SerializeField] private bool isActive = true;
public bool IsActive
public bool IsEditableActive
{
get => isActive;
set

View File

@@ -8,7 +8,7 @@ namespace Script.Gameplay.Facility
{
[SerializeField] private bool isActive = true;
public bool IsActive
public bool IsEditableActive
{
get => isActive;
set

View File

@@ -62,9 +62,9 @@ namespace Script.Gameplay.Facility
#region EditableComponent
[SerializeField] private bool isActive = true;
private bool isActive = true;
public bool IsActive
public bool IsEditableActive
{
get => isActive;
set

View File

@@ -0,0 +1,77 @@
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<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);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1a5a563132c84e50b983b557eb3da442
timeCreated: 1761028056

View File

@@ -42,7 +42,7 @@ namespace Script.Gameplay.Facility
[SerializeField] private bool isActive = true;
public bool IsActive
public bool IsEditableActive
{
get => isActive;
set

View File

@@ -28,7 +28,7 @@ namespace Script.Gameplay.Facility
#region EditableComponent
public bool IsActive
public bool IsEditableActive
{
get => isActive;
set => isActive = value;

View File

@@ -8,7 +8,7 @@ namespace Script.Gameplay.Facility
{
[SerializeField] private bool isActive = true;
public bool IsActive
public bool IsEditableActive
{
get => isActive;
set