创建 登录窗口LoginWnd.cs
绑定 登录窗口LoginWnd.cs
编写 登录窗口LoginWnd.cs
using UnityEngine;
using UnityEngine.UI; //输入文本 命名空间
//功能 : 登录注册窗口
public class LoginWnd : MonoBehaviour{public InputField iptAcct;public InputField iptPass;public Button btnEnter;public Button btnNotice;public void InitWnd() {//获取本地存储账号密码if (PlayerPrefs.HasKey("Acct") && PlayerPrefs.HasKey("Pass")){iptAcct.text = PlayerPrefs.GetString("Acct");iptPass.text = PlayerPrefs.GetString("Pass");}else {iptAcct.text = "";iptPass.text = "";}}//TODO//更新本地存储的账号密码
}
编写完成后我们需要在 登录业务系统LoginSys.cs中去调用这个登录窗口LoginWnd.cs
编写登陆业务系统LoginSys.cs脚本
using UnityEngine;
//功能 : 登陆注册业务系统
public class LoginSys : MonoBehaviour{#region 引用登录窗口public LoginWnd loginWnd;#endregionpublic void InitSys() {Debug.Log("Init LoginSys...");}//进入登录界面public void EnterLogin() {//单例引用显示 加载窗口GameRoot.Instance.loadingWnd.gameObject.SetActive(true);//加载窗口初始化GameRoot.Instance.loadingWnd.InitWnd();//TODO//异步加载登录界面#region 调用ResSvc单例类ResSvc.Instance.AsyncLoadScene(Constans.SceneLogin);#endregion//并显示加载进度//加载完成后再打开登陆界面}#region 打开登录窗口public void OpenLoginWnd() {//激活登录窗口loginWnd.gameObject.SetActive(true);//初始化登录窗口loginWnd.InitWnd();}#endregion
}
该登录窗口LoginSys.cs 应该在 激活登录窗口 初始化登录窗口后(在资源加载服务层关闭加载窗口之后)被打开
所以找到资源加载服务层ResSvc.cs脚本
然而可以简化代码 - 简化前
简化后
因为要在资源服务层ResSvc.cs的异步加载函数中调用登陆业务系统LoginSys.cs的打开登录窗口函数 所以要先把登陆业务系统设置成单例
这样在 资源服务层ResSvc.cs就可以调用到 登陆业务系统LoginSys.cs的打开登录窗口函数了
然后对脚本 登录窗口LoginWnd.cs进行关联
再对游戏根入口GameRoot.cs进行关联
调整背景场景 的Canvas的穿透度
这样确保这个场景背景在加载其他UI窗口时 这个背景置于最底层
运行效果
但是在游戏整个运行中不能每次调用 资源加载服务ResSvc.cs都要打开这个登录窗口
所以这句代码要被放在别处
我们希望资源加载的服务 只做资源加载服务 而不用管这个资源加载的请求是谁发出来的
所以这行代码要被注释 需要进行修改
我们可以传递一个回调函数来解决这个问题
当异步加载完成之后就进行回调
这样写的好处是因为这个loded是从外面传进来的 代码是通用的 而且结构清晰无需多于引用
在其他地方无论是切换战斗 切换主城都可以用
另外 登陆业务系统也可以用Lamd表达式对代码进行简化
简化前
简化后
using UnityEngine;
//功能 : 登陆注册业务系统
public class LoginSys : MonoBehaviour{#region 单例模式public static LoginSys Instance = null;#endregion#region 引用登录窗口public LoginWnd loginWnd;#endregionpublic void InitSys() {#region 单例模式Instance = this;#endregionDebug.Log("Init LoginSys...");}//进入登录界面public void EnterLogin() {//TODO//异步加载登录界面//并显示加载进度#region 调用ResSvc单例类ResSvc.Instance.AsyncLoadScene(Constans.SceneLogin,() => {//打开登录窗口loginWnd.gameObject.SetActive(true);//初始化登录窗口loginWnd.InitWnd();});#endregion}
}
运行效果还是一样的
End.