(client) feat:健康给予,路径优化,结算界面,商店界面 (#60)

Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com>
Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/60
This commit is contained in:
2025-10-10 14:08:23 +08:00
parent 9a797479ff
commit 16b49f3d3a
1900 changed files with 114053 additions and 34157 deletions

View File

@@ -1,14 +1,18 @@
using Managers;
using Prefab;
using System.Collections.Generic;
using Base;
using Managers;
using Prefab;
using UnityEngine;
using UnityEngine.Events;
using Utils;
namespace Entity
{
public class Outline : MonoBehaviour
{
// 边界的最小尺寸
public static readonly Vector2 MinimumBoundsSize = new(0.5f, 0.5f);
// 实体身体的游戏对象
public GameObject body;
@@ -24,9 +28,6 @@ namespace Entity
// 关联的实体
public Entity entity;
// 边界的最小尺寸
public static readonly Vector2 MinimumBoundsSize = new(0.5f, 0.5f);
// 缓存身体纹理大小
private Vector2 _cachedBodyTextureSize;
@@ -44,8 +45,37 @@ namespace Entity
!UIInputControl.Instance.HasWindowOpen;
/// <summary>
/// 确保描边尺寸相关数据缓存已初始化。如果未初始化,则会计算并缓存
/// 此方法保证内部的尺寸计算只执行一次。
/// 当鼠标进入描边区域时调用
/// </summary>
protected virtual void OnMouseEnter()
{
if (!CanShow)
return;
Show();
}
/// <summary>
/// 当鼠标离开描边区域时调用。
/// </summary>
protected virtual void OnMouseExit()
{
Hide();
}
/// <summary>
/// 当鼠标停留在描边区域时每帧调用。
/// </summary>
protected virtual void OnMouseOver()
{
if (!Program.Instance.CanOpenRightMenu || !CanShow)
return;
// 检测是否按下的是鼠标右键
if (Input.GetMouseButtonDown(1)) RightMenuManager.GenerateRightMenu(GetMenu(), Input.mousePosition);
}
/// <summary>
/// 确保描边尺寸相关数据缓存已初始化。如果未初始化,则会计算并缓存。
/// 此方法保证内部的尺寸计算只执行一次。
/// </summary>
private void EnsureDataCacheInitialized() // 修改部分2新增私有方法
{
@@ -58,8 +88,8 @@ namespace Entity
}
/// <summary>
/// 初始化描边,将计算出的尺寸应用于描边渲染器、碰撞体和进度条。
/// 此方法确保数据缓存已初始化,并可以被重复调用以重新应用设置。
/// 初始化描边,将计算出的尺寸应用于描边渲染器、碰撞体和进度条。
/// 此方法确保数据缓存已初始化,并可以被重复调用以重新应用设置。
/// </summary>
public virtual void Init() // 修改部分4修改 Init 方法
{
@@ -85,7 +115,7 @@ namespace Entity
}
/// <summary>
/// 显示描边。
/// 显示描边。
/// </summary>
public void Show()
{
@@ -94,7 +124,7 @@ namespace Entity
}
/// <summary>
/// 隐藏描边。
/// 隐藏描边。
/// </summary>
public void Hide()
{
@@ -102,7 +132,7 @@ namespace Entity
}
/// <summary>
/// 获取当前实体的碰撞体大小。在首次调用时自动计算并缓存。
/// 获取当前实体的碰撞体大小。在首次调用时自动计算并缓存。
/// </summary>
/// <returns>碰撞体大小的Vector2。</returns>
public Vector2 GetColliderSize() // 修改部分3修改 GetColliderSize 方法
@@ -112,7 +142,7 @@ namespace Entity
}
/// <summary>
/// 获取身体的纹理总大小。在首次调用时自动计算并缓存。
/// 获取身体的纹理总大小。在首次调用时自动计算并缓存。
/// </summary>
/// <returns>身体纹理大小的Vector2。</returns>
public Vector2 GetBodyTextureSize() // 修改部分3修改 GetBodyTextureSize 方法
@@ -122,7 +152,7 @@ namespace Entity
}
/// <summary>
/// 获取当前实体的碰撞体偏移。在首次调用时自动计算并缓存。
/// 获取当前实体的碰撞体偏移。在首次调用时自动计算并缓存。
/// </summary>
/// <returns>碰撞体偏移的Vector2。</returns>
public Vector2 GetOffset() // 修改部分3修改 GetOffset 方法
@@ -132,18 +162,18 @@ namespace Entity
}
/// <summary>
/// 计算并返回碰撞体大小。此方法是内部实现细节。
/// 计算并返回碰撞体大小。此方法是内部实现细节。
/// </summary>
/// <returns>碰撞体大小的Vector2。</returns>
private Vector2 CalculateColliderSize()
{
return !string.IsNullOrEmpty(entity.entityDef?.colliderSize)
? Utils.StringUtils.StringToVector2(entity.entityDef.colliderSize)
? StringUtils.StringToVector2(entity.entityDef.colliderSize)
: CalculateBodyTextureSize();
}
/// <summary>
/// 计算并返回身体纹理的总大小。此方法是内部实现细节。
/// 计算并返回身体纹理的总大小。此方法是内部实现细节。
/// </summary>
/// <returns>身体纹理总大小的Vector2。</returns>
private Vector2 CalculateBodyTextureSize()
@@ -151,18 +181,12 @@ namespace Entity
// 获取所有子对象的 Renderer 组件
var renderers = body.GetComponentsInChildren<Renderer>(true);
// 如果没有找到任何 Renderer返回一个默认值
if (renderers.Length == 0)
{
return MinimumBoundsSize;
}
if (renderers.Length == 0) return MinimumBoundsSize;
// 初始化 totalBounds 为第一个 Renderer 的 bounds
var totalBounds = renderers[0].bounds;
// 遍历剩余的 Renderer将它们的 bounds 合并到 totalBounds 中
for (var i = 1; i < renderers.Length; i++)
{
totalBounds.Encapsulate(renderers[i].bounds);
}
for (var i = 1; i < renderers.Length; i++) totalBounds.Encapsulate(renderers[i].bounds);
// 获取合并后的包围盒的XY大小
var size = new Vector2(totalBounds.size.x, totalBounds.size.y);
@@ -173,50 +197,18 @@ namespace Entity
}
/// <summary>
/// 计算并返回碰撞体偏移。此方法是内部实现细节。
/// 计算并返回碰撞体偏移。此方法是内部实现细节。
/// </summary>
/// <returns>碰撞体偏移的Vector2。</returns>
private Vector2 CalculateOffset()
{
return string.IsNullOrEmpty(entity.entityDef?.colliderPosition)
? Vector2.zero
: Utils.StringUtils.StringToVector2(entity.entityDef.colliderPosition);
: StringUtils.StringToVector2(entity.entityDef.colliderPosition);
}
/// <summary>
/// 当鼠标进入描边区域时调用
/// </summary>
protected virtual void OnMouseEnter()
{
if (!CanShow)
return;
Show();
}
/// <summary>
/// 当鼠标离开描边区域时调用。
/// </summary>
protected virtual void OnMouseExit()
{
Hide();
}
/// <summary>
/// 当鼠标停留在描边区域时每帧调用。
/// </summary>
protected virtual void OnMouseOver()
{
if (!Program.Instance.CanOpenRightMenu || !CanShow)
return;
// 检测是否按下的是鼠标右键
if (Input.GetMouseButtonDown(1))
{
RightMenuManager.GenerateRightMenu(GetMenu(), Input.mousePosition);
}
}
/// <summary>
/// 获取右键菜单项列表。
/// 获取右键菜单项列表
/// </summary>
/// <returns>包含菜单项名称和对应回调函数的列表。</returns>
protected virtual List<(string name, UnityAction callback)> GetMenu()
@@ -232,17 +224,17 @@ namespace Entity
}
/// <summary>
/// 将当前实体变为默认实体。
/// 将当前实体变为默认实体。
/// </summary>
protected void BecomeDefault()
{
entity?.Kill();
if (entity != null)
if (entity)
EntityManager.Instance.GenerateDefaultEntity(Program.Instance.FocusedDimensionId, entity.Position);
}
/// <summary>
/// 开始玩家对实体的操控。
/// 开始玩家对实体的操控。
/// </summary>
protected void StartControl()
{
@@ -250,12 +242,11 @@ namespace Entity
}
/// <summary>
/// 结束玩家对实体的操控。
/// 结束玩家对实体的操控。
/// </summary>
protected void EndControl()
{
entity.PlayerControlled = false;
}
}
}
}