简单的ui管理器,简单的3步完成
用c#来做ui管理对于unity来讲可能是老生常谈了,但是在Godot中可能有点坑,特此学习Godot并做一下记录。
1. UIManager:一个用来打开和关闭ui的工具
我是用一个简单的进入游戏的界面来演示
using System;
using System.Collections.Generic;
using Godot;
public partial class UIManager : Node
{
public UiPanelList UiPanels = new UiPanelList();
public List<Node> _showNodeList = new List<Node>();
public override void _Ready()
{
ShowPanel<EnterGamePanel>();
}
/// <summary>
/// 展示
/// </summary>
/// <param name="onShowAction"></param>
/// <typeparam name="T"></typeparam>
public void ShowPanel<T>(Action<T> onShowAction = null) where T : BasePanel
{
var scene = UiPanels.Load<T>();
var node = scene.Instantiate();
_showNodeList.Add(node);
AddChild(node);
var type = GetNode<T>(node.GetPath());
if (type == null)
{
return;
}
onShowAction?.Invoke(type);
type.OnOpen();
}
/// <summary>
/// 关闭界面
/// </summary>
/// <param name="onCloseAction"></param>
/// <typeparam name="T"></typeparam>
public void ClosePanel<T>(Action<T> onCloseAction = null) where T : BasePanel
{
var node = _showNodeList.Find(node => node.Name.Equals(typeof(T).Name));
if (node == null)
{
return;
}
var type = node.GetNode<T>(node.GetPath());
if (type == null)
{
RemoveChild(node);
return;
}
onCloseAction?.Invoke(type);
type.OnClose();
_showNodeList.Remove(node);
RemoveChild(node);
}
}
2. BasePanel:一个界面的基类
using Godot;
public partial class BasePanel : Node
{
public virtual void OnOpen()
{
GD.Print("OnOpen");
}
public virtual void OnClose()
{
GD.Print("OnClose");
}
}
3. UiPanelList:一个简单界面注册列表
主要是没有类似unity ScriptableObject的工具,或者我不知道(刚接触Godot),C++才能对引擎进行修改(可惜技术不够),没办法把代码和界面分离开,对美术和非程序员职位与程序员之间的沟通协调不是很友好。
using System.Collections.Generic;
using Godot;
public class UiPanelList
{
public List<PanelItem> PanelItems = new List<PanelItem>()
{
new(nameof(EnterGamePanel), "res://Modules/Main/enter_game_panel.tscn")
};
public PackedScene Load<T>()
{
var name = typeof(T).Name;
var scene = GD.Load<PackedScene>(GetPath(name));
return scene;
}
public string GetPath(string name)
{
var findRes = PanelItems.Find(item => item.Name.Equals(name));
if (findRes == null)
{
return "";
}
return findRes.Path;
}
}
public class PanelItem
{
public string Name;
public string Path;
public PanelItem(string pName, string pPath)
{
Name = pName;
Path = pPath;
}
}
————————————————
作者:设计途
原文链接:https://blog.csdn.net/qq_39465123/article/details/132917743