U3D游戏开发中使用框架与UGUI+JSON配置文件的代码思路

时间:2024-03-13 11:52:50

在U3D游戏开发之中,我们常常会搭建框架,主要作用是减少代码的复用率,提高开发效率,在开发中(特别是协同开发)我们搭建框架往往考虑框架的实用性以及易于理解性。(虽然你有可能要写框架测试示例给你的协作者)

UGUI是目前游戏开发中常见的UI思路,除此之外还有GUI,NGUI等等UI方案,NGUI在很早之前使用率较高,随着UGUI的推广,大部分游戏开始使用UGUI的UI思路。(关于NGUI的代码思路我在其他篇章的博客中有所讲解,可以前往查看我的其他博客了解)

JSON的数据持久化方案也是目前游戏中较为常见的配置文件思路,除JSON之外,还有XML,PlayerPrefs,ScriptObject,二进制等等配置文件思路,其中ScriptObject配置文件只在编辑器下数据持久化。

今天我们要介绍的ugui+json代码思路配合了策划的表格,通过json与表格数据相互转换得到表格之中数据,程序代码通过json读取数据应用在游戏之中。(xml也是如此)(你甚至可以使用编辑器知识直接制作一个方便转换的工具,或者网络搜索json在线,在线转换)。

本次使用的框架包括动态加载(场景加载),UI管理器(使UI不需要通过外部拖拽使用,在UI数量较多时,使用最为方便,方便协同开发<缺点:通过名称获取UI组件,如果你的UI名有重复出现可能会出现问题,如果你的UI名填写错误也可能会出现问题,你可以通过其他思路防止问题出现,这里不多加讲述>),基础UI面板框架(内部实现了UI面板的显示和隐藏,淡入淡出等等,以及获取UI组件等等方法),数据管理器框架(上一篇博客中有所介绍,数据管理器,通过对各类数据的封装,使外部通过数据管理器轻松实现json数据一键存储,一键修改功能<对于多项数据要一个一个修改,然后再存储,目前未对其优化>)

下面我将介绍我的思路代码(请不要直接复制源码,没有提供框架源码)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ServerPanel : BasePanel
{
    // Start is called before the first frame update
    void Start()
    {
        GetControl<Button>("btnBack").onClick.AddListener(() =>
        {
            if (LoginMgr.GetInstance().LoginData.autoLogin)
            {
                LoginMgr.GetInstance().LoginData.autoLogin = false;
               
            }

            //显示登录面板
            UIManager.GetInstance().ShowPanel<LoginPanel>("LoginPanel");
            //隐藏自己
            UIManager.GetInstance().HidePanel("ServerPanel");

        });
        GetControl<Button>("btnStart").onClick.AddListener(() =>
        {
            //进入游戏
            //由于过场景  Canvas过场景不会被移除
            //隐藏自己
            UIManager.GetInstance().HidePanel("ServerPanel");
            //隐藏下面的板子

            //数据存储 服务器数据
            LoginMgr.GetInstance().SaveLoginData();
            //切场景
            ScenesMgr.GetInstance().LoadScene("GameScene",()=>
            {
                //test
                UIManager.GetInstance().HidePanel("BackGroundLogin");
            });

          

        });
        //点击换区按钮
        GetControl<Button>("btnChange").onClick.AddListener(() =>
        {
            //显示服务器列表面板
            UIManager.GetInstance().ShowPanel<ChooseServerPanel>("ChooseServerPanel", E_UI_Layer.Mid);
            //隐藏自己
            UIManager.GetInstance().HidePanel("ServerPanel");
        });
    }
    public override void ShowMe()
    {
        base.ShowMe();
        //显示自己的时候 更新当前选择的服务器名字
        //之后通过 记录上一次登录的服务器ID 更新内容
        int id = LoginMgr.GetInstance().LoginData.frontServerID;
        if(id<=0)
        {
            GetControl<Text>("txtName").text = "未选择";
        }
        else
        {
            ServerInfo info = LoginMgr.GetInstance().ServerData[id - 1];
            GetControl<Text>("txtName").text = info.id + "区  " + info.name;
            //存储上一次登录的服务器
        }
        
    }

}

这样一来UI的相关代码量大大减少,方便日常开发,几乎使用一个lambda表达式就可以实现一个简单功能逻辑。

希望我的代码思路对你有所帮助,喜欢就点赞收藏吧!