此程序设计时使用了单例以及工程模式的设计想法;
此代码的作用是设计一个类 可以创建图片,并且动态的给图片添加一些点击事情 。代码如下:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.Video;
public class CreatImage
{
private static CreatImage instance;
public static CreatImage Instance
{
get
{
if (instance == null)
{
instance = new CreatImage();
}
return instance;
}
}
Sprite[] sprites ;
Transform parents;
List<Texture2D> allTex2d = new List<Texture2D>();
public static int i;
GameObject game;
public VideoPlayer [] video;
public void Initial()
{
// sprites = Resources.LoadAll<Sprite>("Mul");
load();
parents = GameObject.FindGameObjectWithTag("Based").transform;
}
public GameObject CreatGameObject(int indexs, Vector3 pos,string name)
{
game = new GameObject();
game.transform.parent = parents;
// game.transform.localPosition = pos; new的GameObject 创建的位置
// game.transform.localScale = game.transform.localScale * 10; new的GameObject 创建的大小
game.transform.SetAsFirstSibling(); //始终创建在最上端
game.gameObject.name = name;// 游戏对象在面上上的名称
Image tmpImage = game.AddComponent<Image>();//添加图片
switch (name)
{
//给不同的名称的图片绑定不同的点击事情 、此处有待优化 扩展性不高
case "0":
AddTriggersListener(game, EventTriggerType.PointerClick, click01);
break;
case "1":
AddTriggersListener(game, EventTriggerType.PointerClick, click02);
break;
default:
break;
}
indexs = indexs % sprites.Length; //防止下标越界
tmpImage.sprite = sprites[indexs];
return game;
}
void load()
{
DirectoryInfo direction = new DirectoryInfo(Application.persistentDataPath);
FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);
Debug.Log(files.Length);
sprites = new Sprite[files.Length];
for (int i = 0; i < files.Length; i++)
{
//过滤掉临时文件 此处若是把资源放在SteamingAssets下 需要 若是在 persistentDataPath路径下 可以不用
if (files[i].Name.EndsWith(".meta"))
{
continue;
}
string name = Path.GetFileNameWithoutExtension(files[i].ToString());
Debug.Log(name);
Texture2D tx = new Texture2D(100, 100);
tx.LoadImage(getImageByte(Application.persistentDataPath + "/"+name+".jpg"));
Debug.Log(Application.persistentDataPath + "/" + name + ".jpg");
// allTex2d.Add(tx);
//给Sprite赋值,奖tex2D转成精灵图片
sprites[i]= Sprite.Create(tx, new Rect(0, 0, tx.width, tx.height),new Vector2(0.5f,0.5f));
}
// i = files.Length ;
//给对应的播放器赋值 此处其实也可以动态生成。因时间关系。故在面板中直接创建了
video = new VideoPlayer[files.Length];
for (int i = 0; i < video.Length; i++)
{
//赋值
video[i] = GameObject.FindGameObjectsWithTag("Video")[i].GetComponent<VideoPlayer>();
Debug.Log(video[i].name);
}
for (int i = 0; i < video.Length; i++)
{
video[i].gameObject.SetActive(false);
}
}
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;
}
//给UI 添加事情
private void AddTriggersListener(GameObject obj, EventTriggerType eventID, UnityAction<BaseEventData> action)
{
EventTrigger trigger = obj.GetComponent<EventTrigger>();
if (trigger == null)
{
trigger = obj.AddComponent<EventTrigger>();
}
if (trigger.triggers.Count == 0)
{
trigger.triggers = new List<EventTrigger.Entry>();
}
UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(action);
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = eventID;
entry.callback.AddListener(callback);
trigger.triggers.Add(entry);
}
//回调的方法 此处应该可以继续优化
void click01(BaseEventData data)
{
// Debug.Log("哈哈哈哈我是第一张图");
video[0].gameObject.SetActive(true);
video[0].transform.DOMoveX(960,2);
}
void click02(BaseEventData data)
{
video[1].gameObject.SetActive(true);
video[1].transform.DOMoveX(960, 2);
Debug.Log("哈哈哈哈我是第一张图");
}
void click03(BaseEventData data)
{
Debug.Log("哈哈哈哈我是第一张图");
}
}