學習游戲制作記錄(數據加密以及主菜單和畫面優化)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.pswp.cn/bicheng/94738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94738.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五自由度磁懸浮軸承同頻振動抑制:從機理拆解到傳遞函數驗證的核心方案

摘要 五自由度磁懸浮軸承憑借無摩擦、高轉速的優勢,在航空航天、透平機械等領域應用廣泛,但轉子不平衡質量引發的同頻振動(頻率與轉子轉速一致)始終是制約其精度的核心痛點。本文從轉子不平衡振動的物理機理出發,詳細推導不平衡力的數學模型,分析位移輸出中擾動信號的疊…

CSS 優先級:公司組織架構模型

為什么我的CSS樣式不生效&#xff1f; 在網頁開發中&#xff0c;你可能經常會遇到一個令人困惑的問題&#xff1a;你明明寫了CSS代碼&#xff0c;但是樣式卻不生效&#xff0c;或者出現了意想不到的沖突。你可能會反復檢查代碼&#xff0c;卻找不到任何語法錯誤。這背后隱藏的原…

Go語言循環語句全解析

循環語句概述循環語句在編程中的作用循環語句是編程中控制程序流程的重要結構&#xff0c;它允許我們重復執行特定代碼塊&#xff0c;直到滿足終止條件。在數據處理、算法實現、系統監控等場景中&#xff0c;循環都發揮著關鍵作用。典型應用場景&#xff1a;數據處理&#xff1…

基于NXP iMXRT600音頻算法開發方法

iMXRT600 是一款高性能的微控制器&#xff0c;在開發音頻算法時可按以下步驟和方法進行&#xff1a;1. 開發環境搭建硬件平臺準備好 iMXRT600 開發板&#xff0c;確保開發板上具備音頻輸入輸出接口&#xff0c;如 I2S&#xff08;Inter - IC Sound&#xff09;接口用于音頻數據…

怎么理解API?

想象一下你去一家餐廳吃飯。你&#xff08;用戶&#xff09;不會直接走進廚房告訴廚師怎么做菜&#xff0c;對吧&#xff1f;你會怎么做&#xff1f;你會拿起菜單&#xff0c;查看上面列出的菜品&#xff08;例如“意大利面”&#xff09;、它們的描述和價格。然后&#xff0c;…

系統架構設計師備考第7天——網絡協議中間件軟件構件

一、網絡協議 核心概念 定義&#xff1a;網絡協議是計算機通信的“語言規則”&#xff0c;規定了數據格式、傳輸時序、控制信號等&#xff0c;確保不同系統實體間正常通信。作用&#xff1a;實現資源共享與信息交換的基礎。常見類型&#xff1a; 局域網協議&#xff08;LAN&…

《數據之心》

《數據之心》一、故障2045年&#xff0c;中國“天算”量子云中樞第七區。魚小妖站在控制臺前&#xff0c;指尖劃過全息屏&#xff0c;藍光映在她清秀的臉龐上。她的長發如墨&#xff0c;眸子卻似星河&#xff0c;倒映著無數跳動的數據流。她是第七區最年輕的系統神經工程師&…

《C++ Primer 第五版》不要返回局部對象的引用或指針

1. 先看一個“看似合理”的例子#include <iostream> using namespace std;int& foo() {int x 10; // 局部變量&#xff0c;存在于棧中return x; // 返回它的引用 }int main() {int& ref foo(); // ref 綁定到了已經被銷毀的 xcout << ref &…

2024鴻蒙樣題需要掌握的知識點

一、讀取json格式文件為對象或數組&#xff0c;顯示相應字段1、創建json文件的參數一致的類2、導入類、導入json文件3、循環渲染import router from ohos.router //導入即對象 import books from resources/rawfile/book1.json import { Book } from ../model/BookEntry Compon…

QML Charts組件之坐標軸示例

目錄引言&#x1f3af; 運行效果預覽&#x1f4da; 相關系列文章五種坐標軸詳解與代碼實踐1. 數值坐標軸&#xff08;ValueAxis&#xff09;示例代碼說明2. 對數坐標軸&#xff08;LogValueAxis&#xff09;示例代碼說明3. 日期坐標軸&#xff08;DateTimeAxis&#xff09;示例…

Vue3+ElementPlus倒計時示例

按鈕文字默認顯示“開始倒計時”當點擊按鈕時&#xff0c;顯示正在倒計時(倒計時數字)倒計時結束按鈕顯示“開始倒計時” 倒計時邏輯 Hooks 函數 hooks/useCountDown.js /*** hooks函數&#xff1a;函數是用于封裝和復用組件邏輯的一種機制* 定義&#xff1a;Hooks 是一種在不使…

docker 的網絡

1.查看docker里面的網絡docker network ls 2.查看某個 Docker 網絡的 網關 IP 和 子網段docker network inspect <網絡名或ID>

數據挖掘,到底是在挖掘什么?

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;CSDN博客專家 ??&#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01…

【車載開發系列】CS+ for CC開發環境IDE

【車載開發系列】CS for CC開發環境IDE 【車載開發系列】CS for CC開發環境IDE【車載開發系列】CS for CC開發環境IDE一. 引言二. IDE安裝三. 新建工程四. 堆與棧內存的設置1&#xff09;棧內存設置2&#xff09;堆內存設置一. 引言 瑞薩單片機開發環境有三種&#xff1a;estu…

如何將視頻從安卓設備傳輸到Mac?

你是否想要創建備份、釋放存儲空間&#xff0c;或者分享難忘時刻&#xff1f;你可能想要輕松地將視頻從安卓設備復制到MacBook。在本篇關于“如何將視頻從安卓傳輸到Mac”的指南中&#xff0c;我們將介紹五種智能方法&#xff0c;幫助你無縫地復制視頻。從傳統的WiFi連接方法到…

MyBatis 初識:框架定位與核心原理——SQL 自由掌控的藝術

&#x1f50d; MyBatis 初識&#xff1a;框架定位與核心原理——SQL 自由掌控的藝術 文章目錄&#x1f50d; MyBatis 初識&#xff1a;框架定位與核心原理——SQL 自由掌控的藝術&#x1f9e9; 一、為什么需要 ORM 框架&#xff1f;&#x1f4a1; JDBC 的痛點&#xff1a;原始時…

谷粒商城項目-P6環境-使用vagrant快速創建Linux虛擬機

1.虛擬機 虛擬機使用virtualbox,我使用的是6.0.12版本 2.創建linux系統 使用vagrant 驗證是否安裝完成vagrant 在cmd使用vagrant看看有沒有命令提示 創建虛擬機 在cmd使用vagrant init centos/7創建 創建完成后使用vagrant up啟動虛擬容器 啟動完成后&#xff0c;使用va…

人形機器人的“奧運會“:宇樹科技領跑,動捕技術成訓練關鍵

近年來&#xff0c;人工智能、仿生學和運動控制技術的突破性發展&#xff0c;正推動人形機器人成為全球科技競爭的新焦點。各國政府、科研機構和企業加速布局醫療、救援、服務等領域的應用場景。在此背景下&#xff0c;首屆世界人形機器人大會應運而生并于近日圓滿落幕。此次運…

20250823給榮品RD-RK3588開發板刷Rockchip原廠的Android14【EVB7的V10】時調通AP6275P的WIFI

20250823給榮品RD-RK3588開發板刷Rockchip原廠的Android14【EVB7的V10】時調通AP6275P的WIFI 2025/8/23 17:02【我是先將這個DTSI文件中的代碼塊直接搬到rk3588-evb7-lp4.dtsi中&#xff0c;然后就可以上網了。接著就微調到最終版本&#xff01;】 E:\RD-RK3588_Android13\kern…

Mac 菜單欄多合一工具自薦:FancyTool

鑒于本人特別喜歡花里花哨的菜單欄&#xff0c;但又不想開機自啟太多軟件&#xff0c;所以自己開發了一個新的、輕量的&#xff0c;有點花里胡哨但又有些實用功能的多合一工具&#xff1a;[ FancyTool ]&#xff0c; 感興趣的朋友可以點擊鏈接下載使用。 我承認&#xff0c;這…