Files
aibis-dream/Assets/Scripts/FixSystemNew/BodyModule/BodyModuleSystem.cs
T
2025-05-02 16:06:06 +08:00

236 lines
6.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using AibisDream.Framework;
using Cinemachine;
using UnityEngine;
namespace AibisDream.FixSystem
{
public class BodyModuleSystem : MonoBehaviour
{
#region 内部索引
public List<BodyModule> BodyModules { get; private set; }
private GameObject _bodyModuleGroup;
private GameObject _headModuleGroup;
public CableSystem CableSystem { get; private set; }
[HideInInspector] public HeatMapController heatMapController;
#endregion
#region 系统状态
private readonly ModuleSystemData _data = new();
public bool inHotErr;
private int _heatValue;
public bool isAvailable;
private int HeatValue
{
get => _heatValue;
set
{
_heatValue = value;
inHotErr = _heatValue > 0;
}
}
#endregion
[SerializeField] public float plugSnappingRange = 1f;
private void Awake()
{
InitComponentRefs();
}
private void InitComponentRefs()
{
// 注册数据
// StorageSystem.Instance.RegisterData(_data);
// 处理内部索引
_bodyModuleGroup = transform.Find("Body Module Group")?.gameObject;
_headModuleGroup = transform.Find("Head Module Group")?.gameObject;
CableSystem = transform.Find("Cable System").GetComponent<CableSystem>();
if (transform.Find("HeatMapController"))
{
heatMapController = transform.Find("HeatMapController").GetComponent<HeatMapController>();
}
FixSystemCenter.SystemDic.Register(this);
// 注册Camera
var virtualCam = transform.GetComponentInChildren<ICinemachineCamera>();
CameraKit.Instance.RegisterCamera(CameraEnum.BodyModule, virtualCam);
}
private void OnDestroy()
{
StorageSystem.Instance.UnregisterData<ModuleSystemData>();
CameraKit.Instance.UnRegisterCamera(CameraEnum.BodyModule);
}
/// <summary>
/// 寻找最接近的Module
/// </summary>
/// <param name="sourcePos">源位置</param>
/// <param name="targetModule">最近的Module</param>
/// <returns>是否能找到目标范围内的Module</returns>
public bool TryFindClosestModule(Vector3 sourcePos, out BodyModule targetModule)
{
var closestDistance = Mathf.Infinity;
BodyModule closestModule = null;
// 寻找最接近的BodyModule
foreach (var bodyModule in BodyModules)
{
if (!bodyModule.IsAvailable()) // 检查模块是否可用
{
continue; // 跳过不可用的模块
}
float tempDistance = Vector3.Distance(sourcePos, bodyModule.GetSocketPos());
if (tempDistance < closestDistance)
{
closestDistance = tempDistance;
closestModule = bodyModule;
}
}
// 判断距离是否在目标范围内,在的话就返回,不在的话返回个空的
if (closestDistance < plugSnappingRange && closestModule)
{
targetModule = closestModule;
return true;
}
else
{
targetModule = null;
return false;
}
}
/// <summary>
/// 寻找指定名称的BodyModule
/// </summary>
/// <param name="modulename">模块名称</param>
/// <returns>对应名称的BodyModule</returns>
public BodyModule FindBodyModuleByName(string modulename)
{
return BodyModules?.FirstOrDefault(module => module.data.moduleName == modulename);
}
/// <summary>
/// 设置发热
/// </summary>
public void SetHeat(int targetHeatValue)
{
HeatValue = targetHeatValue;
heatMapController.SetTemptureDirect(HeatValue);
}
public void ShowHeatMap()
{
heatMapController.ShowHeatMap();
DisableSystem();
ResetPlug();
}
public void HideHeatMap()
{
heatMapController.HideHeatMap();
EnableSystem();
}
/// <summary>
/// 冷却后处理
/// </summary>
public void OnCooling()
{
if (!inHotErr) return;
// 系统冷却
_heatValue = 0;
}
/// <summary>
/// 插头重新插入初始插孔
/// </summary>
public void ResetPlug()
{
CableSystem.ResetPlug();
}
/// <summary>
/// 激活交互系统
/// </summary>
public void EnableSystem()
{
isAvailable = true;
}
/// <summary>
/// 停止交互系统
/// </summary>
public void DisableSystem()
{
isAvailable = false;
}
public void SwitchModuleGroup(ModuleState moduleState)
{
// 先切换Group
switch (moduleState)
{
case ModuleState.Body:
_bodyModuleGroup?.SetActive(true);
_headModuleGroup?.SetActive(false);
break;
case ModuleState.Head:
_bodyModuleGroup?.SetActive(false);
_headModuleGroup?.SetActive(true);
break;
default:
throw new ArgumentOutOfRangeException(nameof(moduleState), moduleState, null);
}
// 重新获取ModuleGroup
var root = moduleState == ModuleState.Body ? _bodyModuleGroup : _headModuleGroup;
BodyModules = root?.GetComponentsInChildren<BodyModule>().ToList();
// 更改data
_data.moduleState = moduleState;
}
/// <summary>
/// 从模块中清除
/// </summary>
/// <param name="module">将要被移除的模块</param>
public void RemoveModule(BodyModule module)
{
BodyModules.Remove(module);
}
}
[LoadIndex(2)]
public class ModuleSystemData : IData
{
public ModuleState moduleState;
public IEnumerator Load()
{
FixSystemCenter.SystemDic.Get<BodyModuleSystem>().SwitchModuleGroup(moduleState);
yield break;
}
}
public enum ModuleState
{
Body,
Head
}
}