Unity简单的对话框(Dialog)

36 篇文章 1 订阅

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("取消");
        });
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呼呼突突

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值