(client) feat:实现热重载,实现多维度,实现武器,实现掉落物,实现状态UI,实现攻击AI (#44)

Co-authored-by: zzdxxz <2079238449@qq.com>
Co-committed-by: zzdxxz <2079238449@qq.com>
This commit is contained in:
2025-08-27 19:56:49 +08:00
committed by TheRedApricot
parent d91210a6ff
commit 8456b6c162
132 changed files with 18568 additions and 2534 deletions

View File

@ -1,8 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using Data;
using Base;
using Data; // 确保 Data 命名空间包含 DefBase, CharacterDef, MonsterDef, BuildingDef, ItemDef, EventDef
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
namespace UI
{
@ -22,96 +21,117 @@ namespace UI
private void Init()
{
InitReloadGameButton();
InitEvent();
InitCharacter();
InitMonster();
InitBuilding();
InitItem();
InitWeapon();
}
private void InitReloadGameButton()
{
var button = InstantiatePrefab(buttonTemplate, menuContent.transform);
button.Label = "热重载Def";
button.AddListener(HotReload);
}
/// <summary>
/// 通用的初始化定义按钮的方法。
/// </summary>
/// <typeparam name="TDef">定义的类型,必须继承自 Data.DefBase。</typeparam>
/// <param name="titleLabel">菜单部分的标题。</param>
/// <param name="noDefMessage">当没有定义时显示的提示信息。</param>
/// <param name="buttonTextSelector">用于从 TDef 获取按钮显示文本的函数。</param>
/// <param name="buttonAction">点击按钮时执行的动作,传入对应的 TDef 对象。</param>
private void InitDefineButtons<TDef>(string titleLabel, string noDefMessage, System.Func<TDef, string> buttonTextSelector, System.Action<TDef> buttonAction) where TDef : Define
{
var title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = titleLabel;
var defList = Managers.DefineManager.Instance.QueryNamedDefinesByType<TDef>();
if (defList == null || defList.Length == 0)
{
var noDefTitle = InstantiatePrefab(textTemplate, menuContent.transform);
noDefTitle.Label = noDefMessage;
noDefTitle.text.color = Color.red;
}
else
{
foreach (var def in defList)
{
var button = InstantiatePrefab(buttonTemplate, menuContent.transform);
button.Label = buttonTextSelector(def);
// 确保 lambda 捕获的是循环当前迭代的 def 变量,而不是循环变量本身
var currentDef = def;
button.AddListener(() => buttonAction(currentDef));
}
}
}
private void InitEvent()
{
var title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "事件菜单";
title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "未定义任何事件";
title.text.color = Color.red;
// for (int i = 0; i < 30; i++)
// {
// var button= InstantiatePrefab(buttonTemplate, menuContent.transform);
// button.text.text = i.ToString();
// }
// 假设存在 Data.EventDef 类型,且它继承自 Data.DefBase并包含一个可作为标签的字段。
// 如果事件触发逻辑不同于生成实体,需要在此处定义相应的回调。
InitDefineButtons<EventDef>(
"事件菜单",
"未定义任何事件",
// 假设 EventDef 也有 label 字段作为按钮文本
def => def.label,
eventDef =>
{
// TODO: 在这里实现事件触发逻辑
Debug.Log($"触发事件: {eventDef.label}");
// 示例: Managers.EventManager.Instance.TriggerEvent(eventDef.id);
});
}
private void InitCharacter()
{
var title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "生成人物";
var defList = Managers.DefineManager.Instance.QueryNamedDefinesByType<Data.CharacterDef>();
if (defList == null || defList.Length == 0)
{
title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "未定义任何角色";
title.text.color = Color.red;
}
else
foreach (var def in defList)
{
var button = InstantiatePrefab(buttonTemplate, menuContent.transform);
button.Label = def.label;
var pawnDef = def;
button.AddListener(() => GenerateEntityCallback(pawnDef));
}
InitDefineButtons<CharacterDef>(
"生成人物",
"未定义任何角色",
def => def.label,
GenerateEntityCallback);
}
private void InitMonster()
{
var title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "生成怪物";
var defList = Managers.DefineManager.Instance.QueryNamedDefinesByType<Data.MonsterDef>();
if (defList == null || defList.Length == 0)
{
title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "未定义任何怪物";
title.text.color = Color.red;
}
else
foreach (var def in defList)
{
var button = InstantiatePrefab(buttonTemplate, menuContent.transform);
button.Label = def.label;
var pawnDef = def;
button.AddListener(() => GenerateEntityCallback(pawnDef));
}
InitDefineButtons<MonsterDef>(
"生成怪物",
"未定义任何怪物",
def => def.label,
GenerateMonsterEntityCallback);
}
private void InitBuilding()
{
var title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "生成建筑";
var defList = Managers.DefineManager.Instance.QueryNamedDefinesByType<Data.BuildingDef>();
if (defList == null || defList.Length == 0)
{
title = InstantiatePrefab(textTemplate, menuContent.transform);
title.Label = "未定义任何建筑";
title.text.color = Color.red;
}
else
foreach (var def in defList)
{
var button = InstantiatePrefab(buttonTemplate, menuContent.transform);
button.Label = def.label;
var pawnDef = def;
button.AddListener(() => GenerateBuildingCallback(pawnDef));
}
InitDefineButtons<BuildingDef>(
"生成建筑",
"未定义任何建筑",
def => def.label,
GenerateBuildingCallback);
}
private void InitItem()
{
InitDefineButtons<ItemDef>(
"生成掉落物",
"未定义任何物品",
def => def.label,
GeneratePickupCallback);
}
private void InitWeapon()
{
InitDefineButtons<WeaponDef>(
"生成武器",
"未定义任何武器",
def => def.label,
GeneratePickupCallback);
}
/// <summary>
/// 通用的实例化函数,返回实例化的预制件脚本组件。
/// </summary>
@ -145,23 +165,47 @@ namespace UI
{
entityPlacementUI.currentAction = () =>
{
Managers.EntityManage.Instance.GenerateEntity(entityDef, Utils.MousePosition.GetWorldPosition());
Managers.EntityManage.Instance.GenerateEntity(Program.Instance.FocusedDimensionId,entityDef, Utils.MousePosition.GetWorldPosition());
};
entityPlacementUI.Prompt = $"当前生成器:\n名称{entityDef.label}\n描述{entityDef.description}";
entityPlacementUI.snapEnabled = false;
Base.UIInputControl.Instance.Show(entityPlacementUI);
UIInputControl.Instance.Show(entityPlacementUI);
}
private void GenerateMonsterEntityCallback(MonsterDef monsterDef)
{
entityPlacementUI.currentAction = () =>
{
Managers.EntityManage.Instance.GenerateMonsterEntity(Program.Instance.FocusedDimensionId,monsterDef, Utils.MousePosition.GetWorldPosition());
};
entityPlacementUI.Prompt = $"当前生成器:\n名称{monsterDef.label}\n描述{monsterDef.description}";
entityPlacementUI.snapEnabled = false;
UIInputControl.Instance.Show(entityPlacementUI);
}
private void GenerateBuildingCallback(BuildingDef def)
{
entityPlacementUI.currentAction = () =>
{
Managers.EntityManage.Instance.GenerateBuildingEntity(def, Utils.MousePosition.GetSnappedWorldPosition());
Managers.EntityManage.Instance.GenerateBuildingEntity(Program.Instance.FocusedDimensionId,def, Utils.MousePosition.GetSnappedWorldPosition());
};
entityPlacementUI.Prompt = $"当前生成器:\n名称{def.label}\n描述{def.description}";
entityPlacementUI.snapEnabled = true;
Base.UIInputControl.Instance.Show(entityPlacementUI);
UIInputControl.Instance.Show(entityPlacementUI);
}
private void GeneratePickupCallback(ItemDef itemDef)
{
entityPlacementUI.currentAction = () =>
{
Managers.EntityManage.Instance.GeneratePickupEntity(Program.Instance.FocusedDimensionId,itemDef, Utils.MousePosition.GetWorldPosition());
};
entityPlacementUI.Prompt = $"当前生成器:\n名称{itemDef.label}\n描述{itemDef.description}";
entityPlacementUI.snapEnabled = false;
UIInputControl.Instance.Show(entityPlacementUI);
}
private void HotReload()
{
UIInputControl.Instance.HideAll();
Program.Instance.needLoad = true;
SceneManager.LoadScene(0);
}
}
}