当前位置: 首页 > news >正文

学习游戏制作记录(数据加密以及主菜单和画面优化)8.27

1.实现数据加密

FileDataHandler 脚本:


private bool encryptData = false;//是否加密
public string codeWord = "alexdev";//加密码

    public FileDataHandler(string _dataDirPath, string _fileName, bool _encryptData)
{
dataDirPath = _dataDirPath;
FileName = _fileName;
encryptData = _encryptData;
}

    private string EncryptDecrpt(string _data)//加密的过程
{
string modifilerData = "";

        for(int i=0; i < _data.Length; i++)
{
modifilerData += (char)(_data[i] ^codeWord[i % codeWord.Length]);
}

        return modifilerData;
}

            if(encryptData)//在每次保存和加载前调用这个函数
{
dataToStore = EncryptDecrpt(dataToStore);
}

SaveManager脚本:


[SerializeField] private bool encryptData;

    private void Awake()
{
if (instance != null)
{
Destroy(gameObject);
}
else
{
instance = this;
}

        saveManagers = FindAllSaveManagers();
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName,encryptData);//传入是否加密的参数

        LoadData();

        Debug.Log(saveManagers.Count);
}

2.创建主菜单

新建一个场景,自行添加按钮,文本等描述

创建 UI_MainMenu脚本挂载在你的画布上:

[SerializeField] private string SceneName = "MainScene";
[SerializeField] private GameObject continueButton;

private void Start()//初始化,若无加载文件则隐藏继续游戏的按钮
{
if(SaveManager.instance.HasSaveData()==false)
{
continueButton.SetActive(false);
}
}
public void Continue()//继续游戏绑定该函数
{
SceneManager.LoadScene(SceneName);
}

public void NewGame()//新游戏
{
SaveManager.instance.DeletSavedData();//清除原有数据

    SceneManager.LoadScene(SceneName);
}

public void ExitGame()
{

}

SaveManager脚本:

    public bool HasSaveData()//判断是否有数据需要加载
{
if(dataHandler.Load()!=null)
{
return true;
}

        else
{ return false; }
}

3.屏幕渐变效果

创建一块黑布,创造它的淡入和淡出动画(改变透明度)

 UI_Fadescreen脚本:

    private Animator anim;

    private void Start()
{
anim = GetComponent<Animator>();
}

    public void FadeOut() => anim.SetTrigger("fadeOut");//设置触发器

    public void FadeIn() => anim.SetTrigger("fadeIn");

UI_MainMenu脚本:

    IEnumerator LoadSceneWithFadeEffect(float _delay)实现延迟淡出
{
fadescreen.FadeOut();

        yield return new WaitForSeconds(_delay);

        SceneManager.LoadScene(SceneName);
}

    public void Continue()
{
StartCoroutine(LoadSceneWithFadeEffect(1.5f));//启用协程
}

    public void NewGame()
{
SaveManager.instance.DeletSavedData();

        StartCoroutine(LoadSceneWithFadeEffect(1.5f));
}

UI脚本:


  [Header("End Info")]
[SerializeField] private UI_Fadescreen fadescreen;//实现角色场景的淡入淡出
[SerializeField] private GameObject end;//死亡时出现的图像
[Space]

    public void SwitchOnEndScreen()
{
SwithTo(null);

        fadescreen.FadeOut();//淡出

        StartCoroutine(EndScreenCorotine());//启用协程
}

    IEnumerator EndScreenCorotine()
{
yield return new WaitForSeconds(1);

        end.SetActive(true);//启用
}

    public void SwithTo(GameObject _menu) 
{
for(int i=0;i<transform.childCount;i++)//防止清除渐变效果
{
bool isfadeScreen =transform.GetChild(i).GetComponent<UI_Fadescreen>()!=null;
if(isfadeScreen==false)
transform.GetChild(i).gameObject.SetActive(false);
}


        if(_menu != null)
{
_menu.gameObject.SetActive(true);
}


    }
PlayerDeadState脚本:

    public override void Enter()//死亡实现淡出效果
{
base.Enter();

        GameObject.Find("Canvas").GetComponent<UI>().SwitchOnEndScreen();
}

4.实现结束画面

创建GameManager脚本:

    public static GameManager instance;
public void Awake()//单例化处理
{
if (instance != null)
{
Destroy(instance.gameObject);
}
else
{
instance = this;
}
}
public void RestartScence()//重新加载场景
{
Scene scene =SceneManager.GetActiveScene();

        SceneManager.LoadScene(scene.name);
}

 UI脚本:


[SerializeField] private GameObject restartButton;//重新开始的按钮

    IEnumerator EndScreenCorotine()
{
yield return new WaitForSeconds(1f);

        end.SetActive(true);

        yield return new WaitForSeconds(.5f);

        restartButton.SetActive(true);//启用按钮

    }

    public void ResartGameButton()=>GameManager.instance.RestartScence();//按钮绑定该函数

http://www.dtcms.com/a/354262.html

相关文章:

  • 运算电源抑制比(PSRR)测量及设计注意事项
  • 去哪里学AI?2025年AI培训机构推荐!
  • 部署k8s-efk日志收集服务(小白的“升级打怪”成长之路)
  • 数据库:缓冲池和磁盘I/O
  • 让组件“活”起来:使用 `useState` Hook 管理组件状态
  • 【苍穹外卖项目】Day12
  • Android中的SELinux
  • vue3 字符 居中显示
  • HyperMesh许可证过期?
  • 北京国标:专业高效的数据采集和分析服务
  • 【深入理解 Linux 网络】配置调优与性能优化
  • 官宣,2026第二届郑州国际台球产业展览会,展位开启招商
  • 解决网站图片加载慢:从架构原理到实践
  • Ubuntu系统中查看内存、CPU、GPU的使用情况以及它们之间的连接情况
  • TypeScript实战:轻松实现数字序号转中文大写数字
  • 什么是宏观和微观仿真
  • Wed 自动化测试常用函数实践(二)
  • 嵌入式开发学习 C++:day01
  • 【SystemUI】启动屏幕录制会自动开启投屏
  • 主流配置中心对比
  • 百度测试岗位--面试真题分析
  • JS逆向-反调试绕过事件检测无限Debug篡改猴Hook替换指向匹配修改条件断点
  • 泊松分布知识点讲解
  • Android WPS Office 18.20
  • 【Win软件 - 系统 - 网络】 Windows怎么禁止某个应用联网
  • 洛谷P13849 [CERC 2023] Equal Schedules题解
  • python接口自动化测试报告插件使用
  • CSS扩大点击热区示例
  • 明远智睿 RK3506 核心板:高集成度与强实时性的嵌入式解决方案
  • 【小白笔记】Hugging Face 下载:Git 到镜像网站的