93 lines
3.0 KiB
C#
93 lines
3.0 KiB
C#
using Data;
|
||
using Item;
|
||
using UnityEngine;
|
||
// 添加 System 命名空间以使用 Action
|
||
|
||
namespace Entity
|
||
{
|
||
public class Character : LivingEntity
|
||
{
|
||
public override Attributes defAttributes
|
||
{
|
||
get
|
||
{
|
||
var def = base.defAttributes;
|
||
var weaponDef = GetCurrentWeapon()?.Attributes;
|
||
if (weaponDef != null)
|
||
{
|
||
weaponDef.health = def.health;
|
||
weaponDef.moveSpeed = def.moveSpeed;
|
||
return weaponDef;
|
||
}
|
||
|
||
return def;
|
||
}
|
||
}
|
||
|
||
|
||
private int _currentSelected; // 私有字段用于存储实际值
|
||
|
||
/// <summary>
|
||
/// 当前选中的背包槽位索引。
|
||
/// 当此值被设置时,如果与旧值不同,将触发 OnCurrentSelectedChanged 事件。
|
||
/// </summary>
|
||
public int CurrentSelected
|
||
{
|
||
get => _currentSelected;
|
||
set
|
||
{
|
||
var maxIndex = Inventory != null && Inventory.Capacity > 0 ? Inventory.Capacity - 1 : 0;
|
||
var clampedValue = Mathf.Clamp(value, 0, maxIndex);
|
||
_currentSelected = clampedValue;
|
||
InitWeaponAnimator();
|
||
}
|
||
}
|
||
|
||
public Inventory Inventory { get; private set; }
|
||
|
||
|
||
public override void Init(EntityDef entityDef)
|
||
{
|
||
Inventory = new Inventory(this, 3);
|
||
Inventory.OnInventoryChanged += InventoryChange;
|
||
CurrentSelected = 0;
|
||
base.Init(entityDef);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 尝试将指定物品添加到角色的背包中。
|
||
/// </summary>
|
||
/// <param name="itemResource">要尝试添加的物品资源。</param>
|
||
/// <param name="quantity">要尝试添加的数量。</param>
|
||
/// <returns>
|
||
/// 未成功添加到背包的物品数量。
|
||
/// 如果返回0,表示所有物品都成功添加;
|
||
/// 如果返回quantity,表示未能添加任何物品;
|
||
/// 如果返回一个介于0和quantity之间的值,表示部分物品被添加。
|
||
/// </returns>
|
||
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 WeaponResource GetCurrentWeapon()
|
||
{
|
||
var currentSelectItem = Inventory.GetSlot(CurrentSelected);
|
||
return currentSelectItem?.Item as WeaponResource;
|
||
}
|
||
|
||
private void InventoryChange()
|
||
{
|
||
InitWeaponAnimator();
|
||
}
|
||
}
|
||
} |