(client) feat:实现掉落物,UI显示,维度
This commit is contained in:
@ -1,89 +1,110 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Data;
|
||||
using Item;
|
||||
using Managers;
|
||||
using UnityEngine;
|
||||
using Utils;
|
||||
// 添加 System 命名空间以使用 Action
|
||||
|
||||
namespace Entity
|
||||
{
|
||||
public class Character : Entity
|
||||
{
|
||||
// ------------- 新增 / 修改部分 START -------------
|
||||
private int _currentSelected; // 私有字段用于存储实际值
|
||||
|
||||
// 声明 Inventory 字段。更改为 private set 以确保 Inventory 实例只能在 Character 内部设置。
|
||||
public Inventory Inventory { get; private set; }
|
||||
/// <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);
|
||||
|
||||
if (_currentSelected != clampedValue)
|
||||
{
|
||||
_currentSelected = clampedValue;
|
||||
OnCurrentSelectedChanged?.Invoke(_currentSelected); // 触发事件
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Inventory Inventory { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当当前选中的槽位索引改变时触发的事件。
|
||||
/// 参数:新的选中索引。
|
||||
/// </summary>
|
||||
public event Action<int> OnCurrentSelectedChanged;
|
||||
|
||||
public override void Init(EntityDef entityDef)
|
||||
{
|
||||
base.Init(entityDef);
|
||||
|
||||
// 1. 初始化背包:
|
||||
// 在这里创建并初始化 Inventory 实例。
|
||||
// 'this' 指的是当前 Character 实例,作为 Inventory 的拥有者。
|
||||
// 容量可以根据 entityDef 或一个默认值来设定。这里使用默认值 20。
|
||||
Inventory = new Inventory(this, 3);
|
||||
Inventory = new Inventory(this, 3);
|
||||
|
||||
// (可选) 可以在此订阅背包事件,以便 Character 对背包变化做出响应,
|
||||
// 例如更新角色状态、播放音效或更新UI。
|
||||
// Inventory.OnItemAdded += HandleItemAddedToInventory;
|
||||
// Inventory.OnItemRemoved += HandleItemRemovedFromInventory;
|
||||
// Inventory.OnInventoryChanged += HandleInventoryChanged;
|
||||
// 初始化 currentSelected。
|
||||
// 使用属性来设置,确保触发事件和范围检查。
|
||||
// 如果Inventory.Capacity为0,则currentSelected会被钳制到0。
|
||||
// 如果Inventory.Capacity为3,currentSelected=0是有效值。
|
||||
currentSelected = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试将指定物品添加到角色的背包中。
|
||||
/// 尝试将指定物品添加到角色的背包中。
|
||||
/// </summary>
|
||||
/// <param name="itemResource">要尝试添加的物品资源。</param>
|
||||
/// <param name="quantity">要尝试添加的数量。</param>
|
||||
/// <returns>未成功添加到背包的物品数量。
|
||||
/// 如果返回0,表示所有物品都成功添加;
|
||||
/// 如果返回quantity,表示未能添加任何物品;
|
||||
/// 如果返回一个介于0和quantity之间的值,表示部分物品被添加。</returns>
|
||||
public int TryPickupItem(Item.ItemResource itemResource, int quantity)
|
||||
/// <returns>
|
||||
/// 未成功添加到背包的物品数量。
|
||||
/// 如果返回0,表示所有物品都成功添加;
|
||||
/// 如果返回quantity,表示未能添加任何物品;
|
||||
/// 如果返回一个介于0和quantity之间的值,表示部分物品被添加。
|
||||
/// </returns>
|
||||
public int TryPickupItem(ItemResource itemResource, int quantity)
|
||||
{
|
||||
if (Inventory == null)
|
||||
{
|
||||
Debug.LogError($"Character '{this.name}' inventory is not initialized. Cannot pickup item.");
|
||||
Debug.LogError($"Character '{name}' inventory is not initialized. Cannot pickup item.");
|
||||
return quantity; // 如果背包未初始化,则视为未能添加任何物品
|
||||
}
|
||||
|
||||
// 直接调用 Inventory 实例的 AddItem 方法。
|
||||
// AddItem 方法已经包含了严谨的逻辑来处理物品堆叠、新槽位分配、容量检查以及无效输入的警告。
|
||||
int remainingQuantity = Inventory.AddItem(itemResource, quantity);
|
||||
|
||||
var remainingQuantity = Inventory.AddItem(itemResource, quantity);
|
||||
|
||||
return remainingQuantity;
|
||||
}
|
||||
|
||||
// (可选) 示例事件处理方法,用于展示如何响应背包事件
|
||||
// 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))
|
||||
if (!DefineManager.Instance.defines.TryGetValue(nameof(BulletDef), out var def))
|
||||
return;
|
||||
var buttonDef = def.Values.First();
|
||||
Vector3 dir = Utils.MousePosition.GetWorldPosition();
|
||||
Managers.EntityManage.Instance.GenerateBulletEntity(Program.Instance.focuseDimensionId,(BulletDef)buttonDef, Position,
|
||||
// 修正: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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user