先看效果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI;
using DG.Tweening;
using System.Reflection;
public class Open : MonoBehaviour
{
private List<Texture2D> images = new List<Texture2D>();
private List<Sprite> spr = new List<Sprite>();
public Image Img1;
public Image Img2;
private string str;
private float _timer = 0;
private int _index = 0;
void Awake()
{
str = File.ReadAllText(Application.streamingAssetsPath + "/Image/Name.txt");
_index = 0;
_timer = 0;
//Debug.Log(str);
}
void Start()
{
load();
Img1.sprite = spr[_index];
Img2.sprite = spr[_index+1];
//Debug.Log(spr.Count);
}
void OnEnable()
{
ShowSildeImag();
}
void FixedUpdate()
{
}
private void ShowSildeImag()
{
Sequence sequence = DOTween.Sequence(); //声明一个Dotween动画队列,按照队列先入先出原则播放
//添加图片一的动画:图片1的alpha值由1变为0,实现渐变效果
sequence.Append(Img1.DOFade(0, 2).OnComplete(() =>
{
//添加一个动画 播放完成后的回调函数OnComplete,Lambda表达写法,动画播放完成后替换精灵图
ChangeSprite(Img1);
//Debug.Log("图片一替换为" + (_index + 1));
}));
//动画1播放的同时加入图片2的动画2与动画1同时播放,此时图片2的alpha值由0变为1
sequence.Join(Img2.DOFade(1, 2));
sequence.AppendInterval(2f);//延迟2秒后播放后面动画
sequence.Append(Img2.DOFade(0, 2).OnComplete(() =>
{
ChangeSprite(Img2);
//Debug.Log("图片二替换为" + (_index + 1));
}));
sequence.Join(Img1.DOFade(1, 2));
sequence.AppendInterval(2);
sequence.SetLoops(-1);//动画无限循环
}
private void ChangeSprite(Image img)
{
if (_index<spr.Count-1)
{
_index++;
}
else
{
_index = 0;
}
img.sprite = spr[_index];
}
/// <summary>
/// 加载文件夹内图片
/// </summary>
void load()
{
List<string> filePaths = new List<string>();
string imgtype = "*.BMP|*.JPG|*.GIF|*.PNG";
string[] ImageType = imgtype.Split('|');
for (int i = 0; i < ImageType.Length; i++)
{
//获取Application.dataPath文件夹下所有的图片路径
string[] dirs = Directory.GetFiles((Application.streamingAssetsPath + "/Image/"+str+"/"), ImageType[i]);
for (int j = 0; j < dirs.Length; j++)
{
filePaths.Add(dirs[j]);
Debug.Log(dirs[j]);
}
}
for (int i = 0; i < filePaths.Count; i++)
{
Texture2D tx = new Texture2D(100, 100);
tx.LoadImage(getImageByte(filePaths[i]));
images.Add(tx);
Sprite sprite = Sprite.Create(images[i], new Rect(0, 0, images[i].width, images[i].height), Vector2.zero);
spr.Add(sprite);
}
}
/// <summary>
/// 根据图片路径返回图片的字节流byte[]
/// </summary>
/// <param name="imagePath">图片路径</param>
/// <returns>返回的字节流</returns>
private static byte[] getImageByte(string imagePath)
{
FileStream files = new FileStream(imagePath, FileMode.Open);
byte[] imgByte = new byte[files.Length];
files.Read(imgByte, 0, imgByte.Length);
files.Close();
return imgByte;
}
}
新建两个image,用作动画轮播,将脚本挂在Image上
注意第二个image需要将color的透明度调整为0;
运行就可以实现了