Files
Cielonos/Assets/Scripts/MainGame/Characters/Player/Inventory/EquipmentSubmodule.cs

141 lines
5.2 KiB
C#
Raw Normal View History

2026-05-10 11:47:55 -04:00
using System.Collections.Generic;
2026-05-23 08:27:50 -04:00
using Cielonos.MainGame.Inventory;
2026-05-10 11:47:55 -04:00
using Cielonos.MainGame.UI;
2026-05-23 08:27:50 -04:00
using SLSUtilities.General;
2026-05-10 11:47:55 -04:00
using SLSUtilities.FunctionalAnimation;
using UnityEngine;
namespace Cielonos.MainGame.Characters
{
public partial class PlayerInventorySubcontroller
{
public partial class EquipmentSubmodule : SubmoduleBase<PlayerInventorySubcontroller>
{
public List<MainWeaponBase> preparedMainWeapons;
public MainWeaponBase currentMainWeapon;
public List<SupportEquipmentBase> currentSupportEquipments;
public EquipmentSubmodule(PlayerInventorySubcontroller owner) : base(owner)
{
preparedMainWeapons = new List<MainWeaponBase>();
currentSupportEquipments = new List<SupportEquipmentBase>(4) { null, null, null, null };
}
}
#region Main Weapon
public partial class EquipmentSubmodule
{
public void PrepareMainWeapon(MainWeaponBase weaponToPrepare)
{
if (!preparedMainWeapons.Contains(weaponToPrepare))
{
preparedMainWeapons.Add(weaponToPrepare);
}
}
public void EquipMainWeapon(MainWeaponBase newWeapon)
{
PlayerAnimationSubcontroller animSc = owner.player.animationSc;
// 停止当前动画到 Empty确保后续 Rebind 发生在无动画播放的安全状态
animSc.fullBodyFuncAnimSm.Stop(DisruptionType.Must, 0f);
currentMainWeapon = newWeapon;
// 开启批处理——后续所有 clip 替换积压到缓冲区
animSc.BeginOverrideBatch();
// 注册武器动画 clip全部进入缓冲区不触发 Rebind
// OnEquipped含 SetUp同样进入缓冲区内部调用 FlushOverrideBatch 关闭内层
currentMainWeapon.OnEquipped();
// 兜底 Flush若 OnEquipped 未调用 Flush如 Yasha 不调 base在此统一提交
animSc.FlushOverrideBatch();
PlayerCanvas.MainWeaponUIArea.Initialize(newWeapon);
2026-05-23 08:27:50 -04:00
(owner.player.eventSm as PlayerEventSubmodule)?.onMainWeaponChanged.Invoke(newWeapon);
2026-05-10 11:47:55 -04:00
}
public void RemoveMainWeapon()
{
Debug.Log("Unequipping main weapon: " + currentMainWeapon);
currentMainWeapon.OnUnequipped();
currentMainWeapon = null;
}
}
#endregion
#region Support Equipment
public partial class EquipmentSubmodule
{
public void EquipSupportEquipment(SupportEquipmentBase newEquipment, int slotIndex)
{
if (slotIndex < 0 || slotIndex >= 4)
{
Debug.LogWarning("Invalid support equipment slot index: " + slotIndex);
return;
}
//如果当前槽位没有足够的空间,扩展列表
if (currentSupportEquipments.Count <= slotIndex)
{
while (currentSupportEquipments.Count <= slotIndex)
{
currentSupportEquipments.Add(null);
}
}
//卸下当前装备(如果有的话)
if (currentSupportEquipments[slotIndex] != null)
{
currentSupportEquipments[slotIndex].OnUnequipped();
}
currentSupportEquipments[slotIndex] = newEquipment;
// 批处理 SupportEquipment 的动画 clip 替换
PlayerAnimationSubcontroller animSc = owner.player.animationSc;
animSc.BeginOverrideBatch();
newEquipment.OnEquipped();
animSc.FlushOverrideBatch();
PlayerCanvas.SupportEquipmentsUIArea.Initialize(newEquipment, slotIndex);
}
public void RemoveSupportEquipment(SupportEquipmentBase equipmentToRemove)
{
int slotIndex = currentSupportEquipments.IndexOf(equipmentToRemove);
if (slotIndex != -1)
{
equipmentToRemove.OnUnequipped();
currentSupportEquipments[slotIndex] = null;
PlayerCanvas.SupportEquipmentsUIArea.Remove(slotIndex);
}
}
public void RemoveSupportEquipment(int slotIndex)
{
if (slotIndex < 0 || slotIndex >= currentSupportEquipments.Count)
{
Debug.LogWarning("Invalid support equipment slot index: " + slotIndex);
return;
}
SupportEquipmentBase equipmentToRemove = currentSupportEquipments[slotIndex];
if (equipmentToRemove != null)
{
equipmentToRemove.OnUnequipped();
currentSupportEquipments[slotIndex] = null;
PlayerCanvas.SupportEquipmentsUIArea.Remove(slotIndex);
}
}
}
#endregion
}
}