在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表达式就可以实现一个简单功能逻辑。
希望我的代码思路对你有所帮助,喜欢就点赞收藏吧!