当前位置: 首页 > article >正文

Unity类银河战士恶魔城学习总结(P149 Screen Fade淡入淡出菜单)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节实现了进入游戏和死亡之后的淡入淡出动画效果

UI_FadeScreen.cs

1. Animator 组件的引用 (anim)

  • 该脚本通过 Animator 控制 UI 元素的动画效果。anim 是对 Animator 组件的引用,触发动画。

2. FadeOutFadeIn 方法

  • 这两个方法分别用于触发淡出和淡入的动画效果。具体行为取决于 Animator 中的动画触发器。

  • FadeOut(): 调用 anim.SetTrigger("fadeOut") 来触发名为 "fadeOut" 的动画触发器。这个触发器会在 Animator 控制器中关联到某个淡出动画(如逐渐让 UI 元素透明,或让元素消失等)。

  • FadeIn(): 调用 anim.SetTrigger("fadeIn") 来触发名为 "fadeIn" 的动画触发器。同样,这会在 Animator 中关联到一个淡入动画(如逐渐使 UI 元素出现,或增加元素的透明度等)。

3. 使用 Animator 控制动画

  • Animator 是 Unity 中用于控制动画的组件。通过设置触发器(SetTrigger)可以在动画状态机中切换到指定的动画状态。
  • 脚本本身并不直接控制动画的具体效果,而是通过 Animator 和触发器来控制,因此你需要在 Unity 编辑器中确保 Animator 中有相应的动画和触发器。
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

添加了一个协程,用于延时出现动画

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

改动!!!

       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);
    }
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);
    }
}

PlayerDeathState.cs


http://www.kler.cn/a/413803.html

相关文章:

  • deepin 安装 chrome 浏览器
  • MD5算法加密笔记
  • 【es6】原生js在页面上画矩形及删除的实现方法
  • 损失函数分类
  • day2全局注册
  • 华三(HCL)和华为(eNSP)模拟器共存安装手册
  • 【安全 - openssl 生成密钥对和CSR】
  • FCBP 认证考试要点摘要
  • sin函数拟合
  • 设计模式之 备忘录模式
  • 使用Kamailio实现VoIP通话流程详解
  • 【Java 学习】面向程序的三大特性:封装、继承、多态
  • XSS--跨站脚本攻击
  • “python+ADCIRC”潮汐、风驱动循环、风暴潮等海洋水动力模拟
  • Vue 3 路由教程
  • 计算机网络八股整理(三)
  • 计算分数的浮点数值
  • 112. UE5 GAS RPG 制作高亮接口
  • WPF的表格控件 FlexGrid设置行的高度自适应
  • 【优选算法】位运算
  • 面经-综合面/hr面
  • shell脚本_不同脚本的互相调用和重定向操作
  • 【Linux】命令行参数与环境变量
  • 微软企业邮箱:安全可靠的企业级邮件服务!
  • C# 反射详解
  • 优先算法 —— 双指针系列 - 有效三角形的个数