项目核心思路
该项目实现了一个完整的游戏账号流程:
用户侧流程:新用户注册 -> 返回登录 -> 输入账号密码 -> 选择游戏服务器 -> 进入游戏。
数据管理:所有数据(账号信息、服务器列表、用户选择)都通过 XML 进行本地持久化存储和读取,实现了“记住密码”、“自动登录”等功能。
UI 管理:采用单例模式和基类继承的方式管理各个 UI 面板,使得面板的显示、隐藏和逻辑调用清晰且高效。
流程图
流程分析
1. 数据模型层 (Model)
LoginData
(登录数据)
作用:存储与用户登录相关的数据
重要字段:
userName
,password
: 账号密码。frontServerID
: 记录用户上次登录的服务器ID,是实现“上次登录”功能的关键。rememberPW
,autoLogin
: 布尔值,控制是否记住密码和自动登录。
RegisterData
(注册数据)
作用:存储所有已注册的账户信息。
重要字段:
registerInfo
: 一个序列化字典,键值对为<用户名, 密码>
。这是验证登录信息的基础数据库。
ServerInfo
& Server
(服务器信息)
作用:定义服务器列表和单个服务器的数据结构。
重要字段 (
Server
类):id
: 服务器唯一标识。name
: 服务器名称(如“王者之巅”)。state
: 服务器状态(0:正常,1:流畅,2:火爆,3:维护等),用于在UI上显示不同图标。isNew
: 是否为新区,用于显示“新”标识。
2. 数据管理层 (Manager)
这个类是整个系统的核心大脑,负责处理所有业务逻辑和数据存取。
LoginMgr
(登录管理器)
作用:单例类,统筹管理登录、注册、服务器数据的所有操作。
核心功能:
初始化:在构造函数中从XML加载所有数据(
LoginData
,RegisterData
,ServerInfo
)。数据存取:提供
SaveLoginData()
和SaveRegisterData()
方法,将内存中的数据保存回XML文件。注册验证:
RegisterUser()
方法检查用户名是否已存在,不存在则添加到注册数据中。登录验证:
CheckInfo()
方法比对输入的用户名密码是否与注册数据匹配。数据提供:通过属性(如
LoginData
)向UI层提供数据。
3. UI 基础层
BasePanel<T>
(UI面板基类)
提供了一个所有UI面板的基类,简化了面板管理
作用:泛型单例基类。所有其他UI面板都继承自它。
核心功能:
Instance
: 提供全局唯一的访问点。ShowMe()
,HideMe()
: 默认实现显示和隐藏GameObject。Init()
: 抽象方法,强制子类实现初始化逻辑(如按钮事件绑定)。
4. UI 表现层 (View)
这些是具体的UI界面,继承自 BasePanel<T>
,负责界面展示和用户交互
LoginPanel
(登录面板)
作用:用户输入账号密码的界面。
核心功能:
输入框和按钮的事件绑定。
初始化时,根据保存的
LoginData
自动填充账号密码。点击登录按钮时,调用
LoginMgr.Instance.CheckInfo()
进行验证。根据
autoLogin
标志,自动尝试登录。验证成功后,根据
frontServerID
决定是直接进入游戏(ServerPanel
)还是需要选择服务器(ChooseServerPanel
)。
RegisterPanel
(注册面板)
作用:新用户注册账号的界面。
核心功能:
输入用户名和密码(要求大于6位)。
调用
LoginMgr.Instance.RegisterUser()
完成注册。注册成功后,自动填充登录面板并清空上次的服务器记录(
ClearLoginData
)。
ChooseServerPanel
(选择服务器面板)
作用:让用户从所有服务器中选择一个的界面。通常分为左侧服务器组列表和右侧具体服务器列表。
核心功能:
Init()
: 根据服务器总数,动态生成左侧的服务器组按钮(如“1-5区”、“6-10区”)。UpdatePanel()
: 当点击左侧组按钮时,动态生成该组内的所有服务器按钮到右侧。ShowMe()
: 显示时,更新顶部显示的“最近登录的服务器”信息。
ServerPanel
(服务器面板)
作用:显示当前选定的服务器,并提供“进入游戏”的最终入口。
核心功能:
显示已选服务器的名称。
“进入游戏”按钮调用
SceneManager.LoadScene("GameScene")
,正式进入游戏场景。提供“切换服务器”按钮返回到
ChooseServerPanel
。
TipPanel
(提示面板)
作用:一个通用的弹窗,用于显示操作结果(如“密码错误”、“注册成功”等)。
核心功能:
ChangeInfo()
: 动态改变提示信息。通常只有一个“确定”按钮用于关闭自己。
5. UI 组件层
这些是动态生成的UI列表项,用于构建更复杂的UI界面。
ServerItem
(服务器组项)
作用:代表
ChooseServerPanel
左侧列表中的一个组(如“1-5区”按钮)。功能:点击后,通知
ChooseServerPanel
更新右侧列表。
ServerChooseItem
(服务器选择项)
作用:代表
ChooseServerPanel
右侧列表中的一个具体服务器按钮。功能:
根据
Server
数据初始化显示(服务器名、状态图标、是否新区)。点击后,将它的服务器ID保存到
LoginData.frontServerID
,并打开ServerPanel
。