【Unity之UI编程】编写一个面板交互界面需要注意的细节

这篇具有很好参考价值的文章主要介绍了【Unity之UI编程】编写一个面板交互界面需要注意的细节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互


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

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

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

⭐🅰️⭐




⭐前言⭐


🎶(1) 面板传递个人数据的优化


  • 当登录成功后,将玩家信息类通过,UI管理器中的显示加载方法中的委托函数,进行,加载面板后的逻辑处理(在里面执行传递玩家数据的操作),当然前提是进行传达的面板中里面都要有一个玩家信息类
    unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互
  palyerData = DataContorl.GetInstance().ReadData(userName);
              
                        //验证成功
                        if (DataContorl.GetInstance().Tip(userName, password))
                        {

                            UIContorl.GetInstance().ChangeTipPanel("登录成功"); //显示提示面板
                            UIManager.GetInstance().ShowPanel<SelectPanel>("SelectPanel", E_UI_Layer.Mid, (panel) =>
                            {
                                panel.playerInfo = palyerData;
                            });  //显示选服面板 

                            UIManager.GetInstance().RemovePanel("LoginPanel");//移除登录面板


                        //记录临时数据
                        LoginData.GetInstance().userName  = InputAC.text;
                        LoginData.GetInstance().password  = InputPW.text;
  • 后来一想,这个想法也不优化,因为涉及到如果每个面板为方便传递一个玩家的信息数据而每一个都去声明一个玩家信息类成员参数的话,那当面板移除之后,那个数据也会跟着消失,因为,现在的框架UI面板不是单例模式,只有管理器才是单例模式,所以现在想了一个办法就是:
    将当前登录的玩家信息 作为一个全局性的玩家信息,保存在一个单例模式类里面,这样就不会导致数据丢失,也方便到时,选服之后进行数据更新时方便调用,优化了全局

  • 实践

刚注册完数据
unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互


🎶(2) 如何优化频繁的Destroy()


  • 此时采用了,List列表的方式进行显隐处理(或者也可以采用它的升级版本缓存池模块)


    /// <summary>
    /// 动态加载左侧Item
    /// </summary>
    public void AotuLoadLeftItem()
    {
        int num = ServerLists.Count / 5 + 1; //分成多少个区服集按钮Item
        for (int i = 1; i <= num; i++)
        {
            //加载预制体
            GameObject leftItem = Instantiate(Resources.Load<GameObject>("UI/UIItem/leftItem1"));

            leftItem.transform.SetParent(LeftServe.content); //固定其父对象

            LeftItemData serverData = leftItem.GetComponent<LeftItemData>();

            //设置每个Item显示的区间范围
            int star, end;
            star  = (i-1) * 5 + 1;
            end = i  * 5;          
            if (i * 5 >= ServerLists.Count )
            {
                end = ServerLists.Count;
            }         
            serverData.ChangeTextShow(star, end );  //更新显示的区间范围文本

            Button leftItemButton = leftItem.GetComponent<Button>(); //给按钮添加监听,点击后更新右边的区服

            //  AotuLoadRightItem(star, end);  //更新对应的区间服务器集
            AotuLoadRightItem(star, end);
            //按下才可以激活
            leftItemButton.onClick.AddListener(() =>
            {
        
                ActiveTrue(star, end);
            });

        }
    }

    /// <summary>
    /// 动态加载右侧Item
    /// </summary>
    /// <param name="start"></param>
    /// <param name="end"></param>
    public void AotuLoadRightItem(int start ,int end)
    {
        for (int i = start; i <= end; i++)
        {

            GameObject rightItem = Instantiate(Resources.Load<GameObject>("UI/UIItem/ChooseItem1"));          
            rightItem.transform.SetParent(RightServe.content,false); //固定其父对象
           // rightItem.transform.localScale = Vector3.one;
            ChooseItemData serverData = rightItem.GetComponent<ChooseItemData>();

            serverData.UpdataItemInfo(ServerLists[i-1]); //更新服务器数据

            serverData.gameObject.SetActive(false);//先全部失活

            rightItemList.Add(rightItem);//然后存储到List列表中
        }
    }


    /// <summary>
    /// 激活,(好处减少了Destory的性能消耗)
    /// </summary>
    /// <param name="start"></param>
    /// <param name="end"></param>
    public void ActiveTrue(int start, int end)
    {
        textRange.text = "服务器" + start + "-" + end; //更新显示的范围文本
        for (int i = 0; i < 5; i++)
        {
            if (temparyList[ i ]!= null)
            {
                temparyList[ i ].SetActive(false);
            }
        }

        for (int i = start, j = 0; i <= end; i++,j++)
        {

            rightItemList[i - 1].SetActive(true);  //激活
            temparyList[ j ] = rightItemList[ i - 1 ]; //记录上一次显示的数据
        }
    }

}


🎶(3)公共Updata的优化


  • 以前当把事件传到Updata生命函数中每帧运行时,时用委托传递的,此时想要删除它,特别不方便,需要在原函数里面重新声明一个委托,
  • 那么此时我用字典以键值的方式来存储它,移除 的时候只要用名字字符串即可
    unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互
    unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// Mono的管理者
/// 1.声明周期函数
/// 2.事件 
/// 3.协程
/// </summary>
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("未添加过该事件!!");
        }
    }
}


🎶(4) 全局脑图


unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互
unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互

⭐🅰️⭐


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


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


unity制作ui界面教程,# UnityUI篇,# unity实战基础,unity,ui,交互文章来源地址https://www.toymoban.com/news/detail-752634.html


到了这里,关于【Unity之UI编程】编写一个面板交互界面需要注意的细节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity细节】Unity打包后UI面板消失是怎么回事

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 :unity细节和bug Unity打包后IMGUI面板消失是怎么回事 1:Unity打包后IMGUI面板消失可能是因为打包时没有正确设置资源的路径。在Unity中,IMGUI使用的是Resources文件夹中的

    2024年02月13日
    浏览(61)
  • 【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 插件为Unity自带的UGUI各控件实现 StartPanel ——(开始面板创建) StartTipPanel ——(游戏说明面板创建) defeatPanel ——(失败界面面

    2024年04月24日
    浏览(60)
  • Qt中多ui使用及简单布局实现交互界面

    第一章 Qt中C++代码搭配UI文件实现交互界面 第二章 Qt中多ui使用及简单布局实现交互界面 文章目录 前言 一、新增两个新UI文件 二、使用这两个新增的UI及简单布局 三.添加简单联动逻辑 四.编译运行及动态效果展示 总结         前一段时间,写了一篇关于Qt中C++代码搭配

    2024年02月04日
    浏览(56)
  • Qt中C++代码搭配UI文件实现交互界面

    第一章 Qt中C++代码搭配UI文件实现交互界面 第二章 Qt中多ui使用及简单布局实现交互界面 文章目录 一、关于Qt中的UI文件 二、创建一个基本的Qt工程 1.创建工程时,选择不生成ui文件 2.工程内容 3.构建并运行这个工程 4.实现并添加UI文件 三.使用这个新增的UI 四.编译运行 总结

    2024年02月13日
    浏览(47)
  • Android studio编写一个简单的登录界面

    1首先先创建一个空的activity项目,接着设置自己的项目名称,勾选上lacuncher 创建成功后点开 manifests 把刚刚创建的文件名下面的 intent-filter 这一行全部删除 然后点开res,复制一张图片,右键drawable点击粘贴,这里放的是图片资源,用于放置登录头像 然后点开layout文件,开始编

    2024年04月15日
    浏览(44)
  • 用Android Studio编写一个登录界面和注册界面并可以跳转

    下面是使用 Android Studio 编写一个简单的登录界面和注册界面,并实现跳转的示例代码。 首先,在 res/layout 目录下创建一个名为 activity_login.xml 的布局文件,作为登录界面的布局: 接下来,在 res/layout 目录下创建一个名为 activity_register.xml 的布局文件,作为注册界面的布局:

    2024年04月09日
    浏览(86)
  • Unity与iOS交互(1)——需要了解的IOS相关知识

    【前言】 以下只是简要介绍,详细的内容需要自己去看链接  【Objective-C基础知识】 .h .m .mm .cpp文件区别 .h是头文件扩展名。头文件包含类,类型,函数和常数的声明,这里的定义一般是Public的 .m是实现文件扩展名。其包含源代码,用于.h文件中的实现,一般是private的。这是

    2024年02月12日
    浏览(43)
  • ChatGPT在智能人机交互界面和UI设计中的应用如何?

    在智能人机交互界面和UI设计领域,ChatGPT可以发挥重要作用,为用户提供更加智能、自然和个性化的交互体验。其自然语言处理和生成能力使其成为创新的工具,可以改变用户与系统之间的互动方式,以下将详细探讨ChatGPT在这个领域的应用。 **1. 聊天式用户界面**:ChatGPT可以

    2024年02月11日
    浏览(43)
  • unity调用python代码,捕获控制台输出到ui面板上

    unity调用python代码后,想把python生成的数据内容直接传到unity内的ui面板上,但不是通过socket通信传递数据。这里直接捕获python内print到控制台的内容。 python代码部分直接print输出想要传递的数据 传递的数据通过文本的方式被unity接收,通过字符串操作获取想要的数据 output.To

    2024年02月04日
    浏览(99)
  • Unity与Android交互(3)——需要了解的Andorid基础知识

    【前言】 在上一篇文章中只是说了如何实现unity和android交互的问题,要了解其中的原理还必须要先了解一些Android的基础知识,了解后也能搞清楚如何接入SDK或者写Native插件。 (以下只是简要介绍,详细的内容需要自己去看链接) 【Android四大组件】 Activitiy 它提供了一个窗口

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包