2025-07-19 19:03:53 +08:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2025-07-25 19:16:58 +08:00
|
|
|
|
using Data;
|
2025-07-19 19:03:53 +08:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.UI;
|
|
|
|
|
|
|
|
|
|
namespace UI
|
|
|
|
|
{
|
2025-07-21 13:58:58 +08:00
|
|
|
|
public class DevMenuUI : UIBase
|
2025-07-19 19:03:53 +08:00
|
|
|
|
{
|
|
|
|
|
public GameObject menuContent;
|
|
|
|
|
|
2025-08-07 16:44:43 +08:00
|
|
|
|
public EntityPlacementUI entityPlacementUI;
|
|
|
|
|
|
2025-07-19 19:03:53 +08:00
|
|
|
|
public Prefab.TextPrefab textTemplate;
|
|
|
|
|
public Prefab.ButtonPrefab buttonTemplate;
|
2025-08-07 16:44:43 +08:00
|
|
|
|
|
|
|
|
|
private void Start()
|
2025-07-19 19:03:53 +08:00
|
|
|
|
{
|
|
|
|
|
Init();
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-07 16:44:43 +08:00
|
|
|
|
private void Init()
|
2025-07-19 19:03:53 +08:00
|
|
|
|
{
|
|
|
|
|
InitEvent();
|
|
|
|
|
InitCharacter();
|
2025-08-07 16:44:43 +08:00
|
|
|
|
InitMonster();
|
2025-08-11 12:45:52 +08:00
|
|
|
|
InitBuilding();
|
2025-07-19 19:03:53 +08:00
|
|
|
|
}
|
2025-08-07 16:44:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void InitEvent()
|
2025-07-19 19:03:53 +08:00
|
|
|
|
{
|
|
|
|
|
var title = InstantiatePrefab(textTemplate, menuContent.transform);
|
|
|
|
|
title.Label = "事件菜单";
|
2025-08-11 12:45:52 +08:00
|
|
|
|
|
|
|
|
|
title = InstantiatePrefab(textTemplate, menuContent.transform);
|
|
|
|
|
title.Label = "未定义任何事件";
|
|
|
|
|
title.text.color = Color.red;
|
2025-07-19 19:03:53 +08:00
|
|
|
|
// for (int i = 0; i < 30; i++)
|
|
|
|
|
// {
|
|
|
|
|
// var button= InstantiatePrefab(buttonTemplate, menuContent.transform);
|
|
|
|
|
// button.text.text = i.ToString();
|
|
|
|
|
// }
|
2025-08-07 16:44:43 +08:00
|
|
|
|
|
2025-07-19 19:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-08-07 16:44:43 +08:00
|
|
|
|
private void InitCharacter()
|
2025-07-19 19:03:53 +08:00
|
|
|
|
{
|
|
|
|
|
var title = InstantiatePrefab(textTemplate, menuContent.transform);
|
2025-07-21 13:58:58 +08:00
|
|
|
|
title.Label = "生成人物";
|
2025-07-19 19:03:53 +08:00
|
|
|
|
|
|
|
|
|
var defList = Managers.DefineManager.Instance.QueryNamedDefinesByType<Data.CharacterDef>();
|
2025-08-11 12:45:52 +08:00
|
|
|
|
if (defList == null || defList.Length == 0)
|
2025-07-19 19:03:53 +08:00
|
|
|
|
{
|
2025-08-11 12:45:52 +08:00
|
|
|
|
title = InstantiatePrefab(textTemplate, menuContent.transform);
|
|
|
|
|
title.Label = "未定义任何角色";
|
|
|
|
|
title.text.color = Color.red;
|
2025-08-07 16:44:43 +08:00
|
|
|
|
}
|
2025-08-11 12:45:52 +08:00
|
|
|
|
else
|
|
|
|
|
foreach (var def in defList)
|
|
|
|
|
{
|
|
|
|
|
var button = InstantiatePrefab(buttonTemplate, menuContent.transform);
|
|
|
|
|
button.Label = def.label;
|
|
|
|
|
var pawnDef = def;
|
|
|
|
|
button.AddListener(() => GenerateEntityCallback(pawnDef));
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-07 16:44:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void InitMonster()
|
|
|
|
|
{
|
|
|
|
|
var title = InstantiatePrefab(textTemplate, menuContent.transform);
|
|
|
|
|
title.Label = "生成怪物";
|
|
|
|
|
|
|
|
|
|
var defList = Managers.DefineManager.Instance.QueryNamedDefinesByType<Data.MonsterDef>();
|
2025-08-11 12:45:52 +08:00
|
|
|
|
if (defList == null || defList.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
title = InstantiatePrefab(textTemplate, menuContent.transform);
|
|
|
|
|
title.Label = "未定义任何怪物";
|
|
|
|
|
title.text.color = Color.red;
|
|
|
|
|
}
|
|
|
|
|
else
|
2025-08-07 16:44:43 +08:00
|
|
|
|
foreach (var def in defList)
|
|
|
|
|
{
|
|
|
|
|
var button = InstantiatePrefab(buttonTemplate, menuContent.transform);
|
2025-07-19 19:03:53 +08:00
|
|
|
|
button.Label = def.label;
|
2025-07-25 19:16:58 +08:00
|
|
|
|
var pawnDef = def;
|
|
|
|
|
button.AddListener(() => GenerateEntityCallback(pawnDef));
|
2025-07-19 19:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2025-08-07 16:44:43 +08:00
|
|
|
|
|
2025-08-11 12:45:52 +08:00
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-19 19:03:53 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 通用的实例化函数,返回实例化的预制件脚本组件。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T">预制件脚本的类型</typeparam>
|
|
|
|
|
/// <param name="prefab">要实例化的预制件</param>
|
|
|
|
|
/// <param name="parent">实例化对象的父对象</param>
|
|
|
|
|
/// <returns>实例化的预制件脚本组件</returns>
|
2025-08-07 16:44:43 +08:00
|
|
|
|
private T InstantiatePrefab<T>(T prefab, Transform parent) where T : Component
|
2025-07-19 19:03:53 +08:00
|
|
|
|
{
|
|
|
|
|
if (prefab == null || parent == null)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError("Prefab or parent is null!");
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 实例化预制件
|
2025-08-07 16:44:43 +08:00
|
|
|
|
var instance = Instantiate(prefab.gameObject, parent);
|
2025-07-19 19:03:53 +08:00
|
|
|
|
|
|
|
|
|
// 获取实例化对象的脚本组件
|
2025-08-07 16:44:43 +08:00
|
|
|
|
var instantiatedComponent = instance.GetComponent<T>();
|
2025-07-19 19:03:53 +08:00
|
|
|
|
|
|
|
|
|
if (instantiatedComponent == null)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError($"Failed to get component of type {typeof(T).Name} from the instantiated prefab!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return instantiatedComponent;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-07 16:44:43 +08:00
|
|
|
|
private void GenerateEntityCallback(PawnDef pawnDef)
|
2025-07-25 19:16:58 +08:00
|
|
|
|
{
|
2025-08-07 16:44:43 +08:00
|
|
|
|
entityPlacementUI.currentAction = () =>
|
|
|
|
|
{
|
2025-08-11 12:45:52 +08:00
|
|
|
|
Managers.EntityManage.Instance.GenerateEntity(pawnDef, Utils.MousePosition.GetWorldPosition());
|
2025-08-07 16:44:43 +08:00
|
|
|
|
};
|
|
|
|
|
entityPlacementUI.Prompt = $"当前生成器:\n名称:{pawnDef.label}\n描述:{pawnDef.description}";
|
2025-08-11 12:45:52 +08:00
|
|
|
|
entityPlacementUI.snapEnabled = false;
|
|
|
|
|
Base.UIInputControl.Instance.Show(entityPlacementUI);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void GenerateBuildingCallback(BuildingDef def)
|
|
|
|
|
{
|
|
|
|
|
entityPlacementUI.currentAction = () =>
|
|
|
|
|
{
|
|
|
|
|
Managers.EntityManage.Instance.GenerateBuildingEntity(def, Utils.MousePosition.GetSnappedWorldPosition());
|
|
|
|
|
};
|
|
|
|
|
entityPlacementUI.Prompt = $"当前生成器:\n名称:{def.label}\n描述:{def.description}";
|
|
|
|
|
entityPlacementUI.snapEnabled = true;
|
2025-08-07 16:44:43 +08:00
|
|
|
|
Base.UIInputControl.Instance.Show(entityPlacementUI);
|
2025-07-25 19:16:58 +08:00
|
|
|
|
}
|
2025-07-19 19:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|