Unity实现动态更换程序待机图片
前言
在之前的公司做过一些项目,项目有过这样的需求:软件的待机界面需要可以动态更换,这样既可以方便调试人员的工作,又可以节省开发人员的工作时间,可谓是一举两得。在之前的公司做项目一直对这个功能未做整理,所以在这里整理一下。
步骤
1.在项目下建立StreamingAssets文件夹,并在此文件夹下建立Pictures文件夹,如下图所示:
2.在项目中搭建一个Image组件,用来显示加载出来的图片,如下图所示:
3.编写LoadImage.cs脚本,用来加载图片,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;
namespace IoadImages
{
public class LoadImage : MonoBehaviour
{
public List<string> filePaths = new List<string>();
private string LAN;
void Start()
{
LAN = Application.streamingAssetsPath + "/Pictures";
LoadThis();
}
/// <summary>
/// 加载图片逻辑
/// </summary>
void LoadThis()
{
string imgType = "*.BMP|*.GIF|*.JPG|*.PNG";
string[] ImageType = imgType.Split('|');
for (int i = 0; i < ImageType.Length; i++)
{
//获取文件夹下所有图片的路径
string[] dirs = Directory.GetFiles(@"" + LAN, ImageType[i]);
FileInfo[] arrFi = new FileInfo[dirs.Length];
for (int j = 0; j < dirs.Length; j++)
{
arrFi[j] = new FileInfo(dirs[j]);
}
SortAsFileCreationTime(ref arrFi);
for (int k = 0; k < arrFi.Length; k++)
{
filePaths.Add(arrFi[k].FullName);
}
}
}
/// <summary>
/// C#创建时间排序(倒序)
/// </summary>
/// <param name="arrFi">待排序数组</param>
private void SortAsFileCreationTime(ref FileInfo[] arrFi)
{
Array.Sort(arrFi, delegate (FileInfo x, FileInfo y) { return y.CreationTime.CompareTo(x.CreationTime); });
}
}
}
4.编写ShowImage.cs脚本,用来将获取到的图片加载到Image组件上显示出来,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI;
namespace IoadImages
{
public class ShowImage : MonoBehaviour
{
//读取图片脚本实例化
LoadImage loadImage;
//图片制作成精灵组件
public List<Sprite> sprites = new List<Sprite>();
//显示图片
public Image showImage;
//截图的下标
int index = 0;
private void Start()
{
loadImage = transform.GetComponent<LoadImage>();
ToShowThisImage();
}
/// <summary>
/// 展示加载图片方法
/// </summary>
void ToShowThisImage()
{
StartCoroutine(ToShowImage());
}
/// <summary>
/// 展示图片协程
/// </summary>
/// <returns></returns>
IEnumerator ToShowImage()
{
yield return new WaitForSeconds(0.1f);
ShowThisPhoto();
}
/// <summary>
/// 展示图片
/// </summary>
void ShowThisPhoto()
{
for (int i = 0;i < loadImage.filePaths.Count;i++)
{
LoadByIo(loadImage.filePaths[i]);
showImage.sprite = sprites[index];
}
}
/// <summary>
/// 以IO方式进行加载
/// </summary>
/// <param name="imagePath"></param>
private void LoadByIo(string imagePath)
{
double startTime = (double)Time.deltaTime;
//创建文件数据流
FileStream fileStream = new FileStream(imagePath,FileMode.Open,FileAccess.Read);
fileStream.Seek(0,SeekOrigin.Begin);
//创建文件长度缓充区
byte[] bytes = new byte[fileStream.Length];
//读取文件
fileStream.Read(bytes,0,(int)fileStream.Length);
//释放文件读取流
fileStream.Close();
fileStream.Dispose();
fileStream = null;
//创建Texture
int width = 400;
int height = 960;
Texture2D texture = new Texture2D(width,height);
texture.LoadImage(bytes);
Sprite sprite = Sprite.Create(texture,new Rect(0,0,texture.width,texture.height),new Vector2(0.5f,0.5f));
sprites.Add(sprite);
}
}
}
5.将这两个脚本挂载到场景中的物体上,将相关组件拖拽到相关物体上,如下图所示:
6.点击运行项目,发现Picture里的图片已经加载显示了出来,如下图所示:
7.将Picture文件夹中的图片替换一张,再次运行项目,发现图片也显示了出来,功能完成。