效果:按下B键场景逐渐变黑,按下C键场景逐渐透明
淡入淡出用于游戏开始、结束和场景过度。由UGUI的RawImage组件实现,思路是用代码改变RawImage的透明度,为节约开销,采用了委托的观察者模式,详细步骤如下:
1、在Hierachy面板中新建三个空物体,分别命名为UI_Manager、Fade和Test。
2、由于有外部物体引用UI_Manager,所以为UI_Manager添加Tag,Tag也命名为UI_Manager。
3、添加RawImage组件:一定要右键--UI--添加RawImage或者从菜单栏GamrObject处添加RawImage组件,而不能从component添加,添加完成后调整为如下图层级。
4、添加脚本:FadeInOut.cs挂在RawImage上,FadeInOutControl.cs挂在UI_Manager上,testEvent.cs挂在临时测试的Test上。
5、由于U_Manager引用了U_Manager,且为内部引用,故将RawImage直接拖入U_Manager的FadeInOut兰中。
为避免在编辑场景的时候中心总有个RawImage的黑块,影响编辑,故需将RawImage前面的√去掉,由代码在运行时激活。
6、分别重置 UI_Manager、Cavas、dade和FadeRawImage的transform(即分别点transform-->reset)。
7、将RawImage的Color调整为黑色。
测试:运行场景,按下B键屏幕逐渐变黑,按下C键逐渐透明则表示测试成功,很简单吧?
附三个代码如下:
1、FadeInOut.cs
/***************************场景淡入淡出******************************/
//用法:挂在RawImage组件上
//功能:场景淡入淡出
//注意:注意reset RawImage的位置,否则可能无效果,一定要右键--UI--添加RawImage或者从菜单栏GamrObject处添加RawImage
// 组件,而不能从component添加。
//设计:闲云野鹤
//环境:vs2017.15.7.3 unity3d2018 1.5f1
//版本:1.0
//时间:2018.8.25
/***************************场景淡入淡出******************************/
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//注意添加命名空间
using UnityEngine.UI;//注意添加RawImage命名空间
public class FadeInOut : MonoBehaviour
{
public bool isBlack = false;//不透明状态
public float fadeSpeed = 1;//透明度变化速率
RawImage rawImage;
void Start()
{
RectTransform rectTransform = GetComponent();
rectTransform.sizeDelta = new Vector2(Screen.width, Screen.height);//使背景满屏
rawImage = GetComponent();
rawImage.color = Color.clear;
// SceneManager.LoadScene("menu");//切换场景
}
void Update()
{
if (rawImage.color.a > 0.001f && isBlack == false)
rawImage.color = Color.Lerp(rawImage.color, Color.clear, Time.deltaTime * fadeSpeed*0.5f);//渐亮
if (rawImage.color.a <= 0.999f && isBlack == true)
rawImage.color = Color.Lerp(rawImage.color, Color.black, Time.deltaTime * fadeSpeed);//渐暗
}
}
2、FadeInOutControl.cs
/***************************控制场景淡入淡出******************************/
//用法:与FadeInOut脚本关联使用
//功能:控制FadeInOut淡入淡出脚本
//注意:无
//设计:闲云野鹤
//环境:vs2017.15.7.3 unity3d2018 1.5f1
//版本:1.0
//时间:2018.8.25
/***************************控制场景淡入淡出******************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//注意添加RawImage命名空间
public class FadeInOutControl : MonoBehaviour
{
FadeInOut fadeInOut;
public GameObject rawImage;
void Start()
{
rawImage.SetActive(true);
fadeInOut = rawImage.GetComponent();
}
public void BackGroundControl(bool b)
{
if (b == true)
fadeInOut.isBlack = true;
else
fadeInOut.isBlack = false;
}
}
3、testEvent.cs
/***************************监听场景淡入淡出事件******************************/
//用法:与FadeInOut脚本关联
//功能:监听淡入淡出事件
//注意:无
//设计:闲云野鹤
//环境:vs2017.15.7.3 unity3d2018 1.5f1
//版本:1.0
//时间:2018.8.25
/***************************监听场景淡入淡出事件******************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class testEvent : MonoBehaviour {
FadeInOutControl fadeInOutControl;
delegate void BackupGroundDelegate(bool b);//委托
BackupGroundDelegate dele;
void Start () {
fadeInOutControl = GameObject.FindWithTag("UI_Manager").GetComponent();
dele =fadeInOutControl.BackGroundControl;
}
void Update () {
if (Input.GetKeyDown(KeyCode.B))//事件触发
dele(true);
if (Input.GetKeyDown(KeyCode.C))//事件触发
dele(false);
}
}
测试成功后删除Test物体。以后可在任何脚本中加入如下代码即可触发场景淡入淡出:
delegate void BackupGroundDelegate(bool b);//委托
void Start () {
fadeInOutControl = GameObject.FindWithTag("UI_Manager").GetComponent();
dele =fadeInOutControl.BackGroundControl;
}
...........dele(true);//淡出
...........dele(false);//淡入