(client) feat:实现掉落物,UI显示,维度
This commit is contained in:
@ -1,10 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Base;
|
||||
using Data;
|
||||
using Data; // 确保 Data 命名空间包含 DefBase, CharacterDef, MonsterDef, BuildingDef, ItemDef, EventDef
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace UI
|
||||
{
|
||||
@ -29,6 +26,7 @@ namespace UI
|
||||
InitCharacter();
|
||||
InitMonster();
|
||||
InitBuilding();
|
||||
InitItem();
|
||||
}
|
||||
|
||||
private void InitReloadGameButton()
|
||||
@ -38,89 +36,101 @@ namespace UI
|
||||
button.AddListener(HotReload);
|
||||
}
|
||||
|
||||
private void InitEvent()
|
||||
/// <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 = "事件菜单";
|
||||
|
||||
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();
|
||||
// }
|
||||
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()
|
||||
{
|
||||
// 假设存在 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,
|
||||
GenerateEntityCallback);
|
||||
}
|
||||
|
||||
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>
|
||||
@ -154,24 +164,33 @@ namespace UI
|
||||
{
|
||||
entityPlacementUI.currentAction = () =>
|
||||
{
|
||||
Managers.EntityManage.Instance.GenerateEntity(Program.Instance.focuseDimensionId,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 GenerateBuildingCallback(BuildingDef def)
|
||||
{
|
||||
entityPlacementUI.currentAction = () =>
|
||||
{
|
||||
Managers.EntityManage.Instance.GenerateBuildingEntity(Program.Instance.focuseDimensionId,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();
|
||||
@ -179,5 +198,4 @@ namespace UI
|
||||
SceneManager.LoadScene(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user