using System; using System.Linq; using Data; using Item; using Managers; using UnityEngine; using Utils; // 添加 System 命名空间以使用 Action namespace Entity { public class Character : Entity { private int _currentSelected; // 私有字段用于存储实际值 /// /// 当前选中的背包槽位索引。 /// 当此值被设置时,如果与旧值不同,将触发 OnCurrentSelectedChanged 事件。 /// public int currentSelected { get => _currentSelected; set { var maxIndex = Inventory != null && Inventory.Capacity > 0 ? Inventory.Capacity - 1 : 0; var clampedValue = Mathf.Clamp(value, 0, maxIndex); if (_currentSelected != clampedValue) { _currentSelected = clampedValue; OnCurrentSelectedChanged?.Invoke(_currentSelected); // 触发事件 } } } public Inventory Inventory { get; private set; } /// /// 当当前选中的槽位索引改变时触发的事件。 /// 参数:新的选中索引。 /// public event Action OnCurrentSelectedChanged; public override void Init(EntityDef entityDef) { base.Init(entityDef); Inventory = new Inventory(this, 3); // 初始化 currentSelected。 // 使用属性来设置,确保触发事件和范围检查。 // 如果Inventory.Capacity为0,则currentSelected会被钳制到0。 // 如果Inventory.Capacity为3,currentSelected=0是有效值。 currentSelected = 0; } /// /// 尝试将指定物品添加到角色的背包中。 /// /// 要尝试添加的物品资源。 /// 要尝试添加的数量。 /// /// 未成功添加到背包的物品数量。 /// 如果返回0,表示所有物品都成功添加; /// 如果返回quantity,表示未能添加任何物品; /// 如果返回一个介于0和quantity之间的值,表示部分物品被添加。 /// public int TryPickupItem(ItemResource itemResource, int quantity) { if (Inventory == null) { Debug.LogError($"Character '{name}' inventory is not initialized. Cannot pickup item."); return quantity; // 如果背包未初始化,则视为未能添加任何物品 } var remainingQuantity = Inventory.AddItem(itemResource, quantity); return remainingQuantity; } public override void TryAttack() { if (IsAttacking) return; if (!DefineManager.Instance.defines.TryGetValue(nameof(BulletDef), out var def)) return; // 修正:First() 可能会在一个空的 Values 集合上抛出异常。 // 更好的做法是使用 TryGetValue 或 FirstOrDefault 并检查结果。 // 这里假设至少有一个 BulletDef 存在,如果不是,需要更复杂的错误处理。 var bulletDefEntry = def.Values.FirstOrDefault(); if (bulletDefEntry == null) { Debug.LogError("No BulletDef found in DefineManager. Cannot attack."); return; } var bulletDef = (BulletDef)bulletDefEntry; Vector3 dir = MousePosition.GetWorldPosition(); EntityManage.Instance.GenerateBulletEntity(Program.Instance.FocusedDimensionId, bulletDef, Position, dir - Position, this); } public override WeaponResource GetCurrentWeapon() { var currentSelectItem = Inventory.GetSlot(currentSelected); return (WeaponResource)currentSelectItem.Item; } } }