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