Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
UI_FadeScreen.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UI_FadeScreen : MonoBehaviour
{
[SerializeField]private Animator anim;
void Awake()
{
anim = GetComponent<Animator>();
if(anim != null)
{
Debug.Log(345);
}
if(anim == null)
{
Debug.Log(123);
}
}
public void FadeOut()//淡出动画
{
if (anim == null)
{
Debug.Log("anim is null");
return;
}
anim.SetBool("fadeOut", true);
Debug.Log(456);
}
public void FadeIn()//淡入动画
{
anim.SetBool("fadeOut", false);
}
}
UI_MainMune.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class UI_MainMune : MonoBehaviour
{
[SerializeField] private string sceneName = "MainScene";//要切换的场景名
[SerializeField] private GameObject continueButton;
[SerializeField] private UI_FadeScreen fadeScreen;
private void Start()
{
if(SaveManager.instance.HasSavedData()== false)//如果不存在已有文件,则不显示continue
{
continueButton.SetActive(false);
}
}
public void ContinueGame()//将场景切换至已经存在的主场景的函数
//此函数通过Unity控制栏的button调用
{
StartCoroutine(LoadSceneWithFadeEffect(1.5f));
}
public void NewGame()//重写开始游戏函数
{
SaveManager.instance.DeleteSaveData();
StartCoroutine(LoadSceneWithFadeEffect(1.5f));
}
public void ExitGame()//退出游戏函数
{
Debug.Log("Exit Game");
}
IEnumerator LoadSceneWithFadeEffect(float _delay)//延迟载入显示渐变动画函数
{
fadeScreen.FadeOut();
yield return new WaitForSeconds(_delay);
SceneManager.LoadScene(sceneName);//通过场景名切换场景函数
//作为Unity自带的方法,自然是直接可以通过文件名找到Unity内部的文件的
}
}
SaveManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class SaveManager : MonoBehaviour
{
public static SaveManager instance;
[SerializeField] private string fileName;
[SerializeField] private bool encryptData;
GameData gameData;
private List<ISaveManager> saveManagers;
private FileDataHandler dataHandler;
[ContextMenu("Delete save file")]//把一个方法在Unity里面显示出来的做法
public void DeleteSaveData()//调用并被公开的删除文件函数
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encryptData);
dataHandler.Delete();
}
private void Awake()
{
if (instance != null)
Destroy(instance);
else
instance = this;
}
private void Start()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encryptData);
saveManagers = FindAllSaveManagers();
LoadGame();
}
public void NewGame()
{
gameData = new GameData();
}
public void LoadGame()
{
gameData = dataHandler.Load();
if(this.gameData == null)
{
Debug.Log("No data");
NewGame();
}
foreach(ISaveManager saveManager in saveManagers)//循环调用所有的找到脚本的LoadData和SaveData到,这样便可以将所有的数据汇聚到gameData中,并从中拿到data
{
saveManager.LoadData(gameData);
}
Debug.Log("Loaded currency " + gameData.currency);
}
public void SaveGame()循环调用所有的找到脚本的LoadData和SaveData到,这样便可以将所有的数据汇聚到gameData中,并从中拿到data
{
foreach(ISaveManager saveManager in saveManagers)
{
saveManager.SaveData(ref gameData);
}
dataHandler.Save(gameData);
}
private void OnApplicationQuit()
{
SaveGame();
}
private List<ISaveManager> FindAllSaveManagers()//全局寻找带ISave的脚本的函数
{
IEnumerable<ISaveManager> saveManager = FindObjectsOfType<MonoBehaviour>().OfType<ISaveManager>();
return new List<ISaveManager>(saveManager);
}
public bool HasSavedData()//判断是否存在已保存数据的函数
{
if(dataHandler.Load() != null)//Load在文件不存在时默认返回null
{
return true;
}
return false;
}
}
UI.cs
using System.Collections;
using UnityEngine;
public class UI : MonoBehaviour
{
[Header("End screen")]
[SerializeField] private UI_FadeScreen fadeScreen;
[SerializeField] private GameObject endText;
[Space]
[SerializeField] private GameObject characterUI;
[SerializeField] private GameObject skillTreeUI;
[SerializeField] private GameObject craftUI;
[SerializeField] private GameObject optionsUI;
[SerializeField] private GameObject inGameUI;
public UI_itemTooltip itemToolTip;
public UI_statToolTip statToopTip;
public Ui_SkillToolTip skillToolTip;
public UI_CraftWindow craftWindow;
public void Awake()
{
SwitchTo(skillTreeUI);//修复可能出现skill没法加载成功的bug
}
public void Start()
{
SwitchTo(inGameUI);
itemToolTip.gameObject.SetActive(false);
statToopTip.gameObject.SetActive(false);
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.C))
{
SwitchWithKeyTo(characterUI);
}
if (Input.GetKeyDown(KeyCode.B))
{
SwitchWithKeyTo(craftUI);
}
if (Input.GetKeyDown(KeyCode.K))
{
SwitchWithKeyTo(skillTreeUI);
}
if (Input.GetKeyDown(KeyCode.O))
{
SwitchWithKeyTo(optionsUI);
}
}
public void SwitchTo(GameObject _menu)//切换窗口函数
{
for (int i = 0; i < transform.childCount; i++)
{
bool fadeScreen = transform.GetChild(i).GetComponent<UI_FadeScreen>() != null;//保证存在淡入淡出效果的函数时才会为真,才会使darkScreen保持存在
if (!fadeScreen)
transform.GetChild(i).gameObject.SetActive(false);
}
if (_menu != null)
{
_menu.SetActive(true);
}
}
public void SwitchWithKeyTo(GameObject _menu)//键盘切换窗口函数
{
if (_menu != null && _menu.activeSelf)//通过判断是否传入mune和mune是否激活来决定使设置为可视或不可使
{
_menu.SetActive(false);
CheckForInGameUI();
return;
}
SwitchTo(_menu);
}
private void CheckForInGameUI()//当其他UI不在时自动切换值InGameUI函数
{
for (int i = 0; i < transform.childCount; i++)
{
if (transform.GetChild(i).gameObject.activeSelf)
return;
}
SwitchTo(inGameUI);
}
public void SwitchOnEndScreen()//死亡综合效果函数
{
SwitchTo(null);
fadeScreen.FadeOut();
StartCoroutine(EndScreenCorutine());
}
IEnumerator EndScreenCorutine()//死亡显示文本函数
{
yield return new WaitForSeconds(1);
endText.SetActive(true);
}
}
PlayerDeadState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerDeadState : PlayerState
{
public PlayerDeadState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
{
}
public override void AnimationFinishTrigger()
{
base.AnimationFinishTrigger();
}
public override void Enter()
{
base.Enter();
GameObject.Find("Canvas").GetComponent<UI>().SwitchOnEndScreen();//找到后调用死亡效果函数
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
player.SetZeroVelocity();
}
}