可根据自己需要使用单例模式
public class DialogManager
{
public static Dictionary DialogDic = new Dictionary();//储存所有对话框,可以根据自己需要进行管理
private static Transform panelParent;//对话框根目录
static DialogManager()
{
panelParent = GameObject.Find("Canvas").transform;
}
///
/// 展示对话框
///
/// 对话框的类型(Prefab也要用这个类型命名)
/// 对话框返回值的类型
/// 回调
public static void Show(System.Action> callback)
{
Show(null, callback);
}
///
/// 展示对话框
///
/// 对话框的类型(Prefab也要用这个类型命名)
/// 对话框返回值的类型
/// 传参
/// 回调
public static void Show(object par, System.Action> callback)
{
string key = typeof(TDialog).Name;
IDialog dialog;
if (DialogDic.TryGetValue(key, out var dialogObj))//存在,获取
{
dialog = dialogObj as IDialog;
dialog.OnStart(par);
}
else//不存在,新建
{
GameObject obj = Object.Instantiate(Resources.Load(key), panelParent);
obj.name = key;
dialog = obj.GetComponent>();
DialogDic.Add(key, dialog);
dialog.OnStart(par);
dialog.CloseAction += res =>
{
dialog.OnExit();
callback?.Invoke(res);
};
}
}
}
////// 对话框接口,所有对话框都要继承此接口 /// ///对话框返回值的类型 public interface IDialog{ System.Action > CloseAction { get; set; } void OnStart(object par = null); void OnExit(); }
////// 对话框返回类型(这里用作区分点击哪个按钮) /// public enum DialogStatus { OK, Cancel }
///2.创建一个测试的对话框/// 对话框返回值 /// ///对话框返回值的类型 public class DialogResult{ public DialogStatus Status { get; set; } public TResult Result { get; set; } }
public class QuestionDialog : MonoBehaviour, IDialog3.调用创建的对话框{ public Action > CloseAction { get; set; } private Button OKButton, CancelButton; private InputField QuestionField; private void Awake() { OKButton = transform.Find("OKButton").GetComponent
DialogManager.Show("传参", res => { if (res.Status == DialogStatus.OK) Debug.Log(res.Result); else Debug.Log("取消"); });



