refactor(Facility): 使用继承让所有机关都拥有了独自的 可交互 可编辑 可连接设定。大面积重构

This commit is contained in:
2025-10-22 17:34:58 +08:00
parent 3cdd41ea49
commit 3a0b202325
61 changed files with 1516 additions and 889 deletions

View File

@@ -0,0 +1,124 @@
using System.Collections.Generic;
using Script.Gameplay.Connect;
using Script.Gameplay.Interface;
using UnityEngine;
namespace Script.Gameplay.Facility
{
public class BaseFacilityController : MonoBehaviour, IInteractable, IEditableComponent, IConnectable, ISignalSender,
ISignalReceiver, IGaze
{
[SerializeField] protected bool isEnableInteract = true;
[SerializeField] protected bool isEnableEdit = true;
[SerializeField] protected bool isEnableConnect = true;
[SerializeField] protected string componentName;
[SerializeField] protected int needSignalCount = 1;
[SerializeField] protected bool isOpenInEditor = true;
protected int CurrentSignalCount = 0;
public virtual bool IsEnableInteract
{
get => isEnableInteract;
set => isEnableInteract = value;
}
public virtual bool IsEnableEdit
{
get => isEnableEdit;
set => isEnableEdit = value;
}
public virtual bool IsOpenInEditor
{
get => isOpenInEditor;
set
{
isOpenInEditor = value;
IsEnableInteract = value;
IsEnableConnect = value;
}
}
public virtual bool IsEnableConnect
{
get => isEnableConnect;
set => isEnableConnect = value;
}
public string ComponentName
{
get
{
// 如果没有自定义名称,则使用组件名称
return string.IsNullOrEmpty(componentName) ? GetType().Name : componentName;
}
set => componentName = value;
}
public List<ConnectionLine> ConnectionLines { get; set; } = new List<ConnectionLine>();
public string GetConnectableName()
{
return gameObject.name;
}
public GameObject GetGameObject()
{
return gameObject;
}
public virtual string GetInteractPrompt()
{
return $"Interact with {componentName}";
}
public Vector3 GetPosition()
{
return transform.position;
}
public virtual void Interact(GameObject interactor)
{
// Implement interaction logic here
}
public virtual void OnGazeEnter(GameObject go)
{
// Handle gaze enter
}
public virtual void OnGazeExit(GameObject go)
{
// Handle gaze exit
}
public virtual void OnSignalReceived(bool active, GameObject sender)
{
if (active)
{
CurrentSignalCount++;
}
else
{
CurrentSignalCount = Mathf.Max(0, CurrentSignalCount - 1);
}
if (CurrentSignalCount < needSignalCount)
{
return;
}
// Implement signal received logic here
}
public virtual void SendSignal(bool active, GameObject sender)
{
if (ConnectionLines != null)
{
foreach (var line in ConnectionLines)
{
line.OnSignalReceived(active, this.gameObject);
}
}
}
}
}