三、账号密码存储

使用Playfers存储

Unity本地持久化类Playerprefs使用详解 - PlaneZhong - 博客园 (cnblogs.com)

一、登陆界面切换

1、登陆界面的脚本(机制类脚本)

在这个UI上挂载一个脚本LoginWnd

先声明一下这个脚本,拖拽

2、在登录模块中调用

这里的lambo表达式是简化了下面的方法

这里面的回调函数,是一个机制

使用这个机制的是:EnterLogin

因此,直接用一个lambo指向被注释的方法

作用是:当每一次场景切换时,都会调用委托里面的方法

而,登陆界面只需要出现一次,所以在这个异步加载的方法中添加一个回调参数

在LoginSys中进行调用异步加载场景的方法,就实现了只出现一次登陆场景

二、Playfers存储

cs 复制代码
//登录注册界面
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class LoginWnd : MonoBehaviour
{
	public TMP_InputField iptAcct;
	public TMP_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调用。

如果查询到了账号和密码,那么就赋值给text

没有就自己输入

三、函数重载

先看代码

cs 复制代码
//UI界面基类
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class WindowRoot : MonoBehaviour
{
    public ResSvc resSvc = null;
    public void SetWndState(bool isActive=true)//这个窗口默认打开
    {
        //判断当前的状态是否等于目标状态
        //如果不等于目标状态,那就设置为目标状态
        if (gameObject.activeSelf != isActive)
        {
            SetActive(gameObject, isActive);
           // gameObject.SetActive(isActive);
        }//如果是当前的状态,那么初始化/不是就给一个清理的函数
        if (isActive)
        {
            InitWnd();
        }
        else
        {
            ClearWnd();
        }
    }
    protected virtual void InitWnd()
    {
        resSvc = ResSvc.Instance;
    }
    protected virtual void ClearWnd()
    {
        resSvc = null;
    }

	#region 重载方法
    protected void SetActive(GameObject go,bool isActive=true)
    {
        go.SetActive(isActive);
    }
	protected void SetActive(Transform trans, bool state = true)
	{
		trans.gameObject.SetActive(state);
	}
    protected void SetActive(RectTransform rectTrans, bool state = true)
	{
		rectTrans.gameObject.SetActive(state);
	}
    protected void SetActive(Image img, bool state = true)
	{
		img.transform.gameObject.SetActive(state);
	}
    protected void SetActive(TextMeshProUGUI txt, bool state = true)
	{
		txt.transform.gameObject.SetActive(state);
	}


	protected void SetText(TextMeshProUGUI txt,string context="")
    {
        txt.text = context;
    }
    protected void SetText(Transform trans, int num = 0)
    {
        SetText(trans.GetComponent<TextMeshProUGUI>(), num);
	}
    protected void SetText(Transform trans, string context = "")
	{
		SetText(trans.GetComponent<TextMeshProUGUI>(), context);
	}
	protected void SetText(TextMeshProUGUI txt, int num = 0)
	{
		SetText(txt, num.ToString());
	}
	#endregion
}

1、文本重载

在这个文本方法中,如果输入的不是一个String类型。那么需要写一个方法包含玩家输入的类型

这里使用重载方法,很方便。

如果传入Tran类型,那就获取身上的组件,传入int/string

设置面板的失活生效也如此

此时,可以优化一下设置窗口的方法

2、注意事项

设置成Protected方法,只能被派生类继承,不能被其他方法调用

如果保护类型的虚方法,可以在子类中进行重写,也是要相同的保护类型。

四、UI基类

WindowRoot是ui加载进度的基类和登录注册界面的基类

在这里相当于调用这个单例类

在派生类中进行重写,并且继承虚方法中单例类的引用,而不用在派生类中单独声明

相关推荐
郝学胜_神的一滴11 小时前
游戏引擎原理与实践 04:拆解引擎基础系统与内存管理
c++·游戏
小羊没烦恼!14 小时前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
UIU11417 小时前
头文件可以防什么错?运用头文件做声明
c++·学习·c#
Hello_Pyhx19 小时前
DLSS5-Swapper 配置教程:核对游戏API、选择路线与排查F8无响应
游戏
Martina_032120 小时前
山谷地形下雨后湿痕总往坡上爬?用6步检查高度场、流向遮罩与分区加载
人工智能·游戏·数学建模·3d·自然语言处理·aigc·关卡设计
特立独行的猫a1 天前
用仓颉语言给娃写了个打字练习游戏:cj-tauri 项目实战
游戏·ui·框架·tauri·仓颉·cangjie·cj-tauri
鑫 源1 天前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin
爱吃奥利奥_wen1 天前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
辻弋2011 天前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
Martina_03212 天前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc