学习游戏制作记录(数据加密以及主菜单和画面优化)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();//按钮绑定该函数