Files
Gen_Hack-and-Slash-Roguelite/Client/Assets/Scripts/Entity/Character.cs

90 lines
3.9 KiB
C#
Raw Normal View History

using System.Linq;
using Data;
using UnityEngine;
namespace Entity
{
public class Character : Entity
{
2025-08-26 16:00:58 +08:00
// ------------- 新增 / 修改部分 START -------------
// 声明 Inventory 字段。更改为 private set 以确保 Inventory 实例只能在 Character 内部设置。
public Inventory Inventory { get; private set; }
public override void Init(EntityDef entityDef)
{
2025-08-26 16:00:58 +08:00
base.Init(entityDef);
// 1. 初始化背包:
// 在这里创建并初始化 Inventory 实例。
// 'this' 指的是当前 Character 实例,作为 Inventory 的拥有者。
// 容量可以根据 entityDef 或一个默认值来设定。这里使用默认值 20。
Inventory = new Inventory(this, 3);
// (可选) 可以在此订阅背包事件,以便 Character 对背包变化做出响应,
// 例如更新角色状态、播放音效或更新UI。
// Inventory.OnItemAdded += HandleItemAddedToInventory;
// Inventory.OnItemRemoved += HandleItemRemovedFromInventory;
// Inventory.OnInventoryChanged += HandleInventoryChanged;
}
2025-08-26 16:00:58 +08:00
/// <summary>
/// 尝试将指定物品添加到角色的背包中。
/// </summary>
/// <param name="itemResource">要尝试添加的物品资源。</param>
/// <param name="quantity">要尝试添加的数量。</param>
/// <returns>未成功添加到背包的物品数量。
/// 如果返回0表示所有物品都成功添加
/// 如果返回quantity表示未能添加任何物品
/// 如果返回一个介于0和quantity之间的值表示部分物品被添加。</returns>
public int TryPickupItem(Item.ItemResource itemResource, int quantity)
{
2025-08-26 16:00:58 +08:00
if (Inventory == null)
{
Debug.LogError($"Character '{this.name}' inventory is not initialized. Cannot pickup item.");
return quantity; // 如果背包未初始化,则视为未能添加任何物品
}
// 直接调用 Inventory 实例的 AddItem 方法。
// AddItem 方法已经包含了严谨的逻辑来处理物品堆叠、新槽位分配、容量检查以及无效输入的警告。
int remainingQuantity = Inventory.AddItem(itemResource, quantity);
return remainingQuantity;
}
2025-08-26 16:00:58 +08:00
// (可选) 示例事件处理方法,用于展示如何响应背包事件
// private void HandleItemAddedToInventory(Item.ItemResource item, int count)
// {
// Debug.Log($"{DefName} picked up {count} x {item.Name}. Current total: {Inventory.GetItemCount(item)}");
// // 例如更新UI、播放音效、完成任务等
// }
// private void HandleItemRemovedFromInventory(Item.ItemResource item, int count)
// {
// Debug.Log($"{DefName} removed {count} x {item.Name}. Current total: {Inventory.GetItemCount(item)}");
// // 例如更新UI、播放音效、更新制作状态等
// }
// private void HandleInventoryChanged()
// {
// Debug.Log($"{DefName}'s inventory changed. Occupied slots: {Inventory.OccupiedSlotsCount}/{Inventory.Capacity}");
// // 例如通知背包UI刷新显示
// }
// ------------- 新增 / 修改部分 END -------------
public override void TryAttack()
{
if (IsAttacking)
return;
if (!Managers.DefineManager.Instance.defines.TryGetValue(nameof(BulletDef), out var def))
return;
var buttonDef = def.Values.First();
Vector3 dir = Utils.MousePosition.GetWorldPosition();
2025-08-25 18:24:12 +08:00
Managers.EntityManage.Instance.GenerateBulletEntity(Program.Instance.focuseDimensionId,(BulletDef)buttonDef, Position,
dir - Position, this);
}
}
2025-08-26 16:00:58 +08:00
}