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();//按鈕綁定該函數