【Unity之UI编程】玩法面板的实现


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏UI_Unity专栏


⭐UI程序袁⭐


文章目录


🎶前言


🅰️ ****


🎶(1)开始面板LoginPanel 脚本


csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
//-------------------------------------
//---------------------------------------------------------------------------------------------------------------
//___________项目:       ______________
//___________功能: 开始面板
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class LoginPanel : BasePanel 
{
    private CanvasGroup PanelGroup;
    // Start is called before the first frame update

    private void Awake()
    {
        PanelGroup = GetComponent<CanvasGroup>();
        if (!PanelGroup)
        {
            PanelGroup = gameObject.AddComponent<CanvasGroup>();
        }

    }

    protected override  void Start()
    {
        base.Start();
        AllEvent();
    }

    /// <summary>
    /// 重写隐藏方法
    /// </summary>
    public override void HideMe()
    {
        Fade(false, PanelGroup);//进行淡出的效果
        base.HideMe();
       
    }
    /// <summary>
    /// 添加控件监听事件
    /// </summary>
    private void AllEvent()
    {
        try
        {
            GetControl<Button>("ButtonS").onClick.AddListener(() =>
            {
                Debug.Log(GetControl<InputField>("InputAC").text);
                //如果账号密码为空
                if (GetControl<InputField>("InputAC").text == "" && GetControl<InputField>("InputAC").text == "")
                {                
                    UIManager.GetInstance().ShowPanel<TipPanel>("TipPanel"); //显示提示面板
                }

            });

        }
        catch
        {
            Debug.Log("没有获取到");
        }


    }
}

🎶(2)提示面板TipPanel 脚本


csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
//-------------------------------------
//---------------------------------------------------------------------------------------------------------------
//___________项目:     
//___________功能:  提示面板
//___________创建者:_______秩沅_____
//_____________________________________
//-------------------------------------

   
public class TipPanel : BasePanel 
{
    private CanvasGroup PanelGroup;
    private UnityAction evnetListen ;
    private void Awake()
    {
        PanelGroup = GetComponent<CanvasGroup>();
        if (!PanelGroup)
        {
            PanelGroup = gameObject.AddComponent<CanvasGroup>();
        }

    }
    protected  override  void Start()
    {
        base.Start();
 
        //添加点击事件
        GetControl<Button>("BtuSure").onClick.AddListener(()=>
        {
            UIManager.GetInstance().RemovePanel("TipPanel");
        });

    }

    /// <summary>
    /// 重写的显示方法
    /// </summary>
    public override void ShowMe()
    {
        Fade(true, PanelGroup);
        base.ShowMe();
    }

    /// <summary>
    /// 重写的隐藏方法
    /// </summary>
    public override void HideMe()
    {
        Fade(false, PanelGroup);
        base.HideMe();
    }

    /// <summary>
    /// 提供给外部改变提示文本内容的方法
    /// </summary>
    /// <param name="component"></param>
    public void ChangComponent(string component)
    {
        GetControl<Text>("ContentText").text = component;
    }
}

优化后的面板基类BasePanel


csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

/// <summary>
/// 面板基类 
/// 帮助我门通过代码快速的找到所有的子控件
/// 方便我们在子类中处理逻辑 
/// 节约找控件的工作量
/// </summary>
public class BasePanel : MonoBehaviour
{
    //通过里式转换原则 来存储所有的控件
    private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();

	// Use this for initialization
	protected virtual void Start ()
    {
        FindChildrenControl<Button>();
        FindChildrenControl<Image>();
        FindChildrenControl<Text>();
        FindChildrenControl<Toggle>();
        FindChildrenControl<Slider>();
        FindChildrenControl<ScrollRect>();
        FindChildrenControl<InputField>();
    }
	
    /// <summary>
    /// 显示自己
    /// </summary>
    public virtual void ShowMe()
    {
        gameObject.SetActive(true);
    }

    /// <summary>
    /// 隐藏自己
    /// </summary>
    public virtual void HideMe()
    {
        gameObject.SetActive(false);
    }


    /// <summary>
    /// 销毁自己
    /// </summary>
    public virtual void RemoveMe()
    {
        Destroy(gameObject);
    }
    /// <summary>
    /// 得到对应名字的对应控件脚本
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="controlName"></param>
    /// <returns></returns>
    protected T GetControl<T>(string controlName) where T : UIBehaviour
    {
       

        if(controlDic.ContainsKey(controlName))
        {
           
            for( int i = 0; i <controlDic[controlName].Count; ++i )
            {
                if (controlDic[controlName][i] is T)
                {
                    Debug.Log("获取到了" + controlName);
                    return controlDic[controlName][i] as T;
                }
                else
                {
                    Debug.Log("未获取到" );
                }
            }
        }

        return null;
    }

    /// <summary>
    /// 找到面板中子对象的对应控件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    private void FindChildrenControl<T>() where T:UIBehaviour
    {
        
        //把相同类型的空间脚本存储在数组当中
        T[] controls = this.GetComponentsInChildren<T>();      
        for (int i = 0; i < controls.Length; ++i)
        {
            string objName = controls[i].gameObject.name;
          
            if (controlDic.ContainsKey(objName))
                controlDic[objName].Add(controls[i]);
            else
                controlDic.Add(objName, new List<UIBehaviour>() { controls[i] });
            //那如果包含多个相同的空间,并且每个空间执行的逻辑都不一样,那该怎么优化(觉得还是取消这个代码好)
            //除非在这些相同的控件中执行的功能都是一样的
        //如果是按钮控件
            //if(controls[i] is Button)
            //{
            //    (controls[i] as Button).onClick.AddListener(()=>
            //    {
            //        OnClick(objName);
            //    });
            //}
            如果是单选框或者多选框
            //else if(controls[i] is Toggle)
            //{
            //    (controls[i] as Toggle).onValueChanged.AddListener((value) =>
            //    {
            //        OnValueChanged(objName, value);
            //    });
            //}
        }
    }

    /// <summary>
    ///   淡入淡出的效果
    /// </summary>

    public void Fade( bool flag , CanvasGroup Panel)
    {
   
            if (flag)
            {
                Panel.alpha = 0;
                MonoManager.GetInstance().RemoveUpdateListener("fadeOut");
                MonoManager.GetInstance().AddUpdateListener("fadeIn", () =>
                {
                    if(Panel != null )
                    Panel.alpha = Mathf.Lerp(Panel.alpha, 1, Time.deltaTime * 5);
                }
                );

            }
            else
            {
                MonoManager.GetInstance().RemoveUpdateListener("fadeIn");
                MonoManager.GetInstance().AddUpdateListener("fadeOut", () =>
                {
                    if (Panel != null)
                        Panel.alpha = Mathf.Lerp(Panel.alpha, 0, Time.deltaTime * 5);
                }
                );

            }
        }
    
    
}

优化后的Mono管理器


csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.Events;


public class MonoManager : SingleManager<MonoManager>
{
    private MonoController controller;
   
    public MonoManager()
    {
        //保证了MonoController对象的唯一性
        GameObject obj = new GameObject("MonoController");
        controller = obj.AddComponent<MonoController>();
    }

    /// <summary>
    /// 给外部提供的 添加帧更新事件的函数
    /// </summary>
    /// <param name="fun"></param>
    public void AddUpdateListener(string name   ,UnityAction fun)
    {
        controller.AddUpdateListener(name,fun);
    }

    /// <summary>
    /// 提供给外部 用于移除帧更新事件函数
    /// </summary>
    /// <param name="fun"></param>
    public void RemoveUpdateListener(string name)
    {
        controller.RemoveUpdateListener(name);
    }
csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;


public class MonoController : MonoBehaviour {

 
    private Dictionary<string, UnityAction> eventDic = new Dictionary<string, UnityAction>();

    // Use this for initialization
    void Start () {
        DontDestroyOnLoad(this.gameObject);
	}
	
	// Update is called once per frame
	void Update () {
        foreach( UnityAction monoEvent in eventDic.Values )
        {
            if (monoEvent != null)
                monoEvent();
        }
       
    }

    /// <summary>
    /// 给外部提供的 添加帧更新事件的函数
    /// </summary>
    /// <param name="fun"></param>
    public void AddUpdateListener(string name ,UnityAction fun)
    {
        if(eventDic.ContainsKey(name))
        {
            eventDic[name] += fun;
        }
        else
        {
            if(fun != null )
            eventDic.Add(name, fun);
        }
       // updateEvent += fun;
    }

    /// <summary>
    /// 提供给外部 用于移除帧更新事件函数
    /// </summary>
    /// <param name="fun"></param>
    public void RemoveUpdateListener(string name)
    {

        if (eventDic.ContainsKey(name))
        {
            eventDic.Remove(name);
        }
        else
        {
            Debug.Log("未添加过该事件!!");
        }
    }
}

⭐相关文章⭐


软件设计师高频考点大全

unity之c#专题篇---系统强基



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

相关推荐
跟着珅聪学java1 小时前
spring boot +Elment UI 上传文件教程
java·spring boot·后端·ui·elementui·vue
Alger_Hamlet15 小时前
Photoshop 2025 Mac中文 Ps图像编辑软件
macos·ui·photoshop
牙膏上的小苏打233315 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海17 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
浅陌sss1 天前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮1 天前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge1 天前
【Unity网络编程知识】FTP学习
网络·unity
神码编程1 天前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay1 天前
Unity 单例模式写法
unity·单例模式
火一线1 天前
【Framework-Client系列】UIGenerate介绍
游戏·unity