• Unity3D 4.61 实现淡入淡出的场景过渡方法。


    还在学习过程中,如果有大大看到请指点。

    orz原来官方就有了更好的处理方法的教程,具体查看下面视屏。

    [Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(五) 屏幕渐变效果

    由于使用原本的Application.LoadLevel()函数可以直接加载场景。

    但由于太过生硬,所以这里就做一个淡入淡出的效果来进行过渡。

    一、思路:

    只要在加载完成并切换完成之前,先黑屏,切换完成之后在在恢复就可以了。

    1.创建一个遮罩。

    颜色用黑色。#000

    Alpha默认设置为0。

    让遮罩层覆盖整个屏幕。

    设置遮罩层不被销毁。

    2.执行场景切换时,修改遮罩层的Alpha值,由透明修改成不透明。

    注:在脚本里,Alpha值0是透明,1是不透明。

    3.场景切换。

    4.场景切换成功后,修改遮罩层的Alpha值,由不透明修改成透明。

    二、主要问题:

    1.如果让遮罩层一直处于最上层?

    使用“UI” => "Panel"来做为遮罩层就可以了。

    UI层一直是最上层的.

    假如不使用UI,还要调整它不被其它游戏元素给挡着。

    2.同是UI层的元素,如果遮罩层把别的UI给遮住了,那么其它的UI面板就用不了了。

    这个目前还没找到解决办法 。。。我目前的做法是直接脚本另做处理控制直接不显示了。

    3.切换场景后,原场景的游戏对象都会被销毁,要如何让遮罩层不被销毁?

    给遮罩层增加个脚本,在脚本里加上这个就可以了,具体可以查文档。

        void Awake()
        {
            DontDestroyOnLoad(this.transform.gameObject);
        }

    三、开发

    1.定义好一些公共方法方便使用。

    由于目前我只懂得在脚本里使用“Tag”元素来获得游戏组件,所以先创建一个类并创建一个静态的方法,做为公用。

    public class Settings : MonoBehaviour
    {
        /// <summary>
        /// 根据标记加载对象。
        /// </summary>
        /// <returns></returns>
        public static TSource FindComponentByTag<TSource>(string tag) where TSource : Component
        {
            TSource source = null;
    
            //找到对象。
            GameObject sourceObject = GameObject.FindWithTag(tag);
    
            if (sourceObject != null)
            {
                source = sourceObject.GetComponent<TSource>();
            }
            else
            {
                Debug.Log("找不到“" + tag + "”脚本。");
            }
    
            return source;
        }
    }

    2.在 Unity 里创建遮罩层。

    2.1.创建一个摄像机,重命名为“LoadSceneCamera”,并调整好显示屏幕。

    2.2.在摄像机下面创建一个“Canvas”。并且在“Canvas”下面创建一个“Panel”,重命名为“Shade”。

    2.3.选择遮罩层(“Shade”),在Inspector里给遮罩层(“Shade”)创建一个标记,命名也是“Shade”,并且在“Tag”选项里选择“Shade”。

    2.4.给遮罩层(“Shade”)创建一个脚本,并命名为“LoadScene”。

    3.编写脚本。

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    
    public class LoadScene : MonoBehaviour {
    
        /// <summary>
        /// 是否隐藏屏幕(即:淡出)。
        /// </summary>
        private static bool _isHide = false;
    
        /// <summary>
        /// 是否显示屏幕(即:淡入)。
        /// </summary>
        private static bool _isShow = false;
    
        /// <summary>
        /// 渐变的 Alpha 值。
        /// </summary>
        private static float _start = 0;
    
        /// <summary>
        /// 在切换的场景名称。
        /// </summary>
        private static string _scene = string.Empty;
    
        void Update()
        {
            if (_isHide)
            {
                //获得遮罩层原本的颜色。
                Color color = Settings.FindComponentByTag<Image>("Shade").color;
    
                //由于 Alpha 值是“0”代表透明, “1”代表不透明。
                //为了平滑流畅,这里设置为每次更新增加0.1。
                _start += 0.1f;
    
                //根据 color 的值并将 Alpha 值设置给新的 Color 对象。
                Color end = new Color(color.r, color.g, color.b, _start);
    
                //设置遮罩层的颜色。
                //Color.Lerp(color, end, 1);方法代表的从什么颜色渐变到什么颜色。具体请查文档。
                Settings.FindComponentByTag<Image>("Shade").color = Color.Lerp(color, end, 1);
    
                //当 _start 大于等于 1 时,表示已经渐变完成。
                if (_start >= 1)
                {
                    //加载新场景。
                    Application.LoadLevel(_scene);
    
                    //将值重置成 1。
                    _start = 1;
                    
                    //设置为不可淡出。
                    _isHide = false;
    
                    //设置为可以进行淡入操作。
                    _isShow = true;
                }
            }
    
            //当淡出操作完成时。
            if (!_isHide && _isShow)
            {
                //同上。
                Color color = Settings.FindComponentByTag<Image>("Shade").color;
    
                //设置值与淡出相反。
                _start -= 0.1f;
    
                if (_start <= 0)
                {
                    //将值重置成 0。
                    _start = 0;
    
                    //设置为不可淡入。
                    _isShow = false;
                }
    
                Color end = new Color(color.r, color.g, color.b, _start);
                Settings.FindComponentByTag<Image>("Shade").color = Color.Lerp(color, end, 1);
            }
        }
    
        /// <summary>
        /// 当需要使用淡入淡出效果来加载场景时,直接调用此方法就可以了。
        /// </summary>
        /// <param name="name">场景名称。</param>
        public static void LoadLevel(string name)
        {
            _scene = name;
            _isHide = true;
        }
    
        /// <summary>
        /// 设置当前对象不可以被销毁。
        /// </summary>
        void Awake()
        {
            DontDestroyOnLoad(this.transform.gameObject);
        }
    }

    当需要使用淡入淡出效果来加载场景时,直接调用 LoadScene.LoadLevel() 方法就可以了。

  • 相关阅读:
    IIS10保存配置文件及导入、导出、备份、还原
    centos7 根分区扩容
    mssqlserver2014安装步骤
    error:class 'socket.error' [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
    Centos7安装Redis-5.0.3
    Aspose 学习笔记
    Maven学习笔记
    【web性能测试随笔】一、项目介绍及工具
    【Python学习笔记】python开发环境安装部署
    微信小程序中遮罩层滚动穿透问题(view增加一个属性解决)
  • 原文地址:https://www.cnblogs.com/cjnmy36723/p/4216417.html
Copyright © 2020-2023  润新知