【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本章节实现了进入游戏和死亡之后的淡入淡出动画效果
UI_FadeScreen.cs
1. Animator
组件的引用 (anim
)
- 该脚本通过
Animator
控制 UI 元素的动画效果。anim
是对Animator
组件的引用,触发动画。
2. FadeOut
和 FadeIn
方法
-
这两个方法分别用于触发淡出和淡入的动画效果。具体行为取决于
Animator
中的动画触发器。 -
FadeOut()
: 调用anim.SetTrigger("fadeOut")
来触发名为"fadeOut"
的动画触发器。这个触发器会在Animator
控制器中关联到某个淡出动画(如逐渐让 UI 元素透明,或让元素消失等)。 -
FadeIn()
: 调用anim.SetTrigger("fadeIn")
来触发名为"fadeIn"
的动画触发器。同样,这会在Animator
中关联到一个淡入动画(如逐渐使 UI 元素出现,或增加元素的透明度等)。
3. 使用 Animator
控制动画
Animator
是 Unity 中用于控制动画的组件。通过设置触发器(SetTrigger
)可以在动画状态机中切换到指定的动画状态。- 脚本本身并不直接控制动画的具体效果,而是通过
Animator
和触发器来控制,因此你需要在 Unity 编辑器中确保Animator
中有相应的动画和触发器。
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//2024.11.28
public class UI_FadeScreen : MonoBehaviour
{
private Animator anim;
private void Start()
{
anim = GetComponent<Animator>();
}
public void FadeOut()=> anim.SetTrigger("fadeOut");
public void FadeIn() => anim.SetTrigger("fadeIn");
}
UI_MainMenu.cs
添加了一个协程,用于延时出现动画
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//2024.11.27到冬天了
public class UI_MainMenu : MonoBehaviour
{
[SerializeField] private string sceneName = "MainScene";
[SerializeField] private GameObject continueButton;
[SerializeField] UI_FadeScreen fadeScreen;//引用UI_FadeScreen脚本
private void Start()
{
if (SaveManager.instance.HasSavedData() == false) //如果没有存档
continueButton.SetActive(false);//不显示继续游戏按钮
}
public void ContinueGame()
{
StartCoroutine(LoadSceneWithFadeEffect(1.5f));
}
public void NewGame()
{
SaveManager.instance.DeleteSaveData();
StartCoroutine(LoadSceneWithFadeEffect(1.5f));
}
public void ExitGame()
{
Debug.Log("退出游戏");
}
IEnumerator LoadSceneWithFadeEffect(float _delay)//加载场景的协程
{
fadeScreen.FadeOut();
yield return new WaitForSeconds(_delay);
SceneManager.LoadScene(sceneName);
}
}
UI.cs
改动!!!
cs
public void SwitchTo(GameObject _menu)// 该方法用于切换到指定的UI界面
{
for (int i = 0; i < transform.childCount; i++)//遍历当前UI对象的所有子物体
{
bool fadeScreen = transform.GetChild(i).GetComponent<UI_FadeScreen>() != null;//检查UI界面是否有FadeScreens
if (fadeScreen==false)
transform.GetChild(i).gameObject.SetActive(false);//遍历并隐藏所有子元素,确保了在显示新的UI界面时,所有其他的UI界面都会被隐藏
}
if (_menu != null)//传入的菜单不为空
{
_menu.SetActive(true);//显示
}
public void SwitchOnEndScreen()
{
fadeScreen.FadeOut();
StartCoroutine(EndScreenCorutione());
}
IEnumerator EndScreenCorutione()
{
yield return new WaitForSeconds(1.5f);
endText.SetActive(true);
}
cs
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class UI : MonoBehaviour
{
[Header("End screens")]
[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_SkillToolTip skillToolTip;
public UI_ItemTooltip itemToolTip;
public UI_StatToolTip statToolTip;
public UI_CraftWindow craftWindow;
private void Awake()
{
SwitchTo(skillTreeUI);//2024年11月22日,P138 Skill Tree Hot Fix,启动时默认显示技能树界面
}
void Start()
{
SwitchTo(inGameUI);
itemToolTip.gameObject.SetActive(false);//戏启动时隐藏物品提示框和状态提示框
statToolTip.gameObject.SetActive(false);
}
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)// 该方法用于切换到指定的UI界面
{
for (int i = 0; i < transform.childCount; i++)//遍历当前UI对象的所有子物体
{
bool fadeScreen = transform.GetChild(i).GetComponent<UI_FadeScreen>() != null;//检查UI界面是否有FadeScreens
if (fadeScreen==false)
transform.GetChild(i).gameObject.SetActive(false);//遍历并隐藏所有子元素,确保了在显示新的UI界面时,所有其他的UI界面都会被隐藏
}
if (_menu != null)//传入的菜单不为空
{
_menu.SetActive(true);//显示
}
}
public void SwitchWithKeyTo(GameObject _menu)//处理切换UI的逻辑
{
if (_menu != null && _menu.activeSelf)// UI界面已经显示,隐藏, 如果目标UI界面未显示,调用 SwitchTo 显示。
{
_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)//检查当前 UI 对象的第 i 个子对象是否处于激活状态。
return;
}
SwitchTo(inGameUI);
}
public void SwitchOnEndScreen()
{
fadeScreen.FadeOut();
StartCoroutine(EndScreenCorutione());
}
IEnumerator EndScreenCorutione()
{
yield return new WaitForSeconds(1.5f);
endText.SetActive(true);
}
}