TouchScript插件简介与下载
在unity中,TouchScript非常适合做展示类大屏幕的多点触控,在AssetStore也是五星好评,还是免费资源,也可以在GitHub上下载对应的TouchScript。接下来就制作简单的大屏展示系统了。
制作步骤
一、确定需求功能
(1)图片可从StreamingAssets文件夹中自动读取
(2)加载出来的图片需要自动循环移动展示于大屏幕中
(3)可实现图片的多人点击放大、全屏拖拽、自动归位等功能
(4)实现图片放大之后大图周围图片缩小并且围绕大图旋转功能
(5)CPU处理、GPU渲染无压力测试优化
二、准备前期素材
(1)下载并导入相应的插件TouchScript
(2)准备LitJson.dll和System.Drawing.dll(文件流数据读取方式)
(3)创建StreamingAssets并且导入需要展示的图片
三、编程实现
制作过程
一、实现从StreamingAssets文件夹中获取所有图片,具体的代码如下:
List<Texture2D> textureList = new List<Texture2D>();//将获取的图片存于集合中
int texturelistIndex = 0;
string texpath; //获取本地图片的文件夹路径(自定义)
void Start()
{
texpath = Application.streamingAssetsPath + "/testimage";
StartCoroutine(LoadTextureFromFile());//获取对应文件夹的所有文件
}
/// <summary>
/// 使用协程加载文件夹内所有图片文件
/// </summary>
/// <returns></returns>
IEnumerator LoadTextureFromFile()
{
yield return null;
List<FileInfo> fileInfos = GetAllFileFrom(texpath);//获取相应文件夹所有的图片文件流数据
for (int i = 0; i < fileInfos.Count; i++)
{
LoadSingleTexture(fileInfos[i].FullName,fileInfos[i].Name);
}
}
/// <summary>
/// 将集合里的图片取出赋值到需要显示的RawImgae
/// </summary>
/// <returns></returns>
private Texture2D GetTexture()
{
if (textureList.Count>0)
{
Texture2D newTexture2D = textureList[texturelistIndex];
texturelistIndex += 1;
if (texturelistIndex>=textureList.Count)
{
texturelistIndex = 0;
}
return newTexture2D;
}
else
{
return null;
}
}
/// <summary>
/// 加载单张本地图片
/// </summary>
private void LoadSingleTexture(string imagepath,string imagename)
{
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);
System.Drawing.Image image = System.Drawing.Image.FromStream(filestream);
filestream.Close();
filestream.Dispose();
filestream = null;
int imageWidth=image.Width;
int imageheight=image.Height;
Texture2D tex2D = new Texture2D(1920,1080);
tex2D.LoadImage(bytes);
tex2D.name = imagename;
textureList.Add(tex2D);
bytes = null;
filestream = null;
image = null;
tex2D = null;
Resources.UnloadUnusedAssets();
GC.Collect();
}
/// <summary>
/// 得到相应文件夹下的所有文件夹内的所有文件的路径
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
private List<FileInfo> GetAllFileFrom(string filepath)
{
List<FileInfo> filesinfolist = new List<FileInfo>();
DirectoryInfo infoDir = new DirectoryInfo(filepath);
FileInfo[] filesinfo = infoDir.GetFiles("*", SearchOption.AllDirectories);//获取路径内所有文件信息
for (int i = 0; i < filesinfo.Length; i++)
{
if (filesinfo[i].Name.Contains(".meta"))
{
continue;
}
filesinfolist.Add(filesinfo[i]);
}
return filesinfolist;
}
二、加载出图片,并自动循环移动展示于大屏幕
(1)制作移动图片以及点击之后放大图片的预制体,用于接收从文件夹中获取的texture2D赋值以及展示
(2)首先要确定每次生成一列图片时间、的图片的行列数,以及移动的速度、方向,在此项目中我想使得图片每行移动的速度有一定的参差感,所以1,3,5行为一个速度,2,4,6行为一个速度。设置每次生成1,3,5行图片时间为2秒,2,4,6行图片时间为1.35秒,行列数为8行,移动方向为从左到右移动。
相关的代码如下:
int row=8;//图片的行数
float timer1=0;//计时器
float timer2=0;//计时器
float createTime1= 2f;//生成一列图片的时间间隔
float createTime2= 1.35f;//生成一列图片的时间间隔
void FixedUpdate()
{
if (isStartMove)
{
timer1 += Time.deltaTime;
if (timer1>=createTime1)
{
timer1 = 0;
GetNewImageItemObjSingleRow();
}
timer2 += Time.deltaTime;
if (timer2 >= createTime2)
{
timer2 = 0;
GetNewImageItemObjDoubleRow();
}
}
}
/// <summary>
/// //获取单行数小图
/// </summary>
public void GetNewImageItemObjSingleRow()
{
for (int i = 0; i < row; i++)
{
if (i%2!=0)
{
GameObject image = GetNewMoveImageItem(startpos - new Vector3(0, (i - 1) * offset_y));
image.SetActive(true);
AddImageItemCompomemt(image);
image.GetComponent<ImageItem>().currentpos = startpos;
image.GetComponent<ImageItem>().targetTrans = startTran;
float speed = 2f;
image.GetComponent<ImageItem>().OnEnter(startpos - new Vector3(0, (i - 1) * offset_y), speed, GetTexture());
}
}
}
/// <summary>
/// 获取双行数小图
/// </summary>
public void GetNewImageItemObjDoubleRow()
{
for (int i = 0; i < row; i++)
{
if (i % 2 == 0)
{
GameObject image = GetNewMoveImageItem(startpos - new Vector3(0, (i - 1) * offset_y));
image.SetActive(true);
AddImageItemCompomemt(image);
image.GetComponent<ImageItem>().currentpos = startpos;
image.GetComponent<ImageItem>().targetTrans = startTran;
float speed = 3f;
image.GetComponent<ImageItem>().OnEnter(startpos - new Vector3(0, (i - 1) * offset_y), speed, GetTexture());
}
}
}
/// <summary>
/// 获取新的移动小图
/// </summary>
/// <returns></returns>
public GameObject GetNewMoveImageItem(Vector3 pos)
{
GameObject newimageItem;
if (newMoveImageQue.Count > 0)
{
newimageItem = newMoveImageQue.Dequeue();
}
else
{
newimageItem = Instantiate(moveImagePrefab, moveImageParent, false);
newimageItem.transform.localPosition = pos;
}
return newimageItem;
}
/// <summary>
/// 将小图展示于视图
/// </summary>
/// <param name="imageitem"></param>
/// <param name="callback"></param>
public void PushNewMoveImageItem(GameObject imageitem, Action callback)
{
if (newMoveImageQue.Contains(imageitem))
{
return;
}
newMoveImageQue.Enqueue(imageitem);
if (callback != null)
{
callback();
}
}
public void RegisterItem(GameObject obj, ImageType imageType)
{
if (imageType == ImageType.MoveImage)
{
if (!moveimagelist.Contains(obj.GetComponent<ImageItem>()))
{
moveimagelist.Add(obj.GetComponent<ImageItem>());
}
}
else if (imageType == ImageType.BigImage)
{
if (!bigImagelist.Contains(obj.GetComponent<BigImageItem>()))
{
bigImagelist.Add(obj.GetComponent<BigImageItem>());
}
}
}
public void ReleaseItem(GameObject obj, ImageType imageType)
{
if (imageType == ImageType.MoveImage)
{
if (moveimagelist.Contains(obj.GetComponent<ImageItem>()))
{
moveimagelist.Remove(obj.GetComponent<ImageItem>());
}
}
else if (imageType == ImageType.BigImage)
{
if (bigImagelist.Contains(obj.GetComponent<BigImageItem>()))
{
bigImagelist.Remove(obj.GetComponent<BigImageItem>());
}
}
}
三、实现图片的多人点击放大、全屏拖拽、自动归位等功能
/// <summary>
/// 点击获取相应的大图
/// </summary>
public void GetBigImageItem()
{
GameObject bigimage = Instantiate(bigimagePrefab, bigimageparent,false);
bigimage.GetComponent<RawImage>().texture = raw.texture;
bigimage.transform.localPosition = transform.localPosition + new Vector3(0,50,0);
bigimage.AddComponent<BigImageItem>();
bigimage.GetComponent<BigImageItem>().originalPos = this.transform.localPosition + new Vector3(0,50,0);
bigimage.GetComponent<BigImageItem>().targetTrans = targetTrans;
}
/// <summary>
/// 当拖拽大图的手指抬起 大图归位
/// </summary>
private void LerpToOringinPos()
{
if (isCrossPos)
{
transform.localPosition = Vector3.Lerp(transform.localPosition, originalPos, 0.05f);
if (Vector3.Distance(transform.localPosition, originalPos) < 50f)
{
CloseCircle();
}
}
}
四、实现图片放大之后大图周围图片缩小并且围绕大图旋转功能
/// <summary>
/// 判断是否满足环绕条件
/// </summary>
public void Rotation()
{
for (int i = 0; i < moveImageList.Count; i++)
{
if (GameManager.instance.IsInCircle(transform.localPosition, 300f, moveImageList[i].currentpos))
{
//Debug.Log("在环绕条件中");
if (!moveImageList[i].bigImageItemlist.Contains(bigImage))
{
moveImageList[i].bigImageItemlist.Add(bigImage);
moveImageList[i].isInCircle = true;
}
}
else
{
if (moveImageList[i].bigImageItemlist.Contains(bigImage))
{
moveImageList[i].bigImageItemlist.Remove(bigImage);
if (moveImageList[i].bigImageItemlist.Count <= 0)
{
moveImageList[i].isInCircle = false;
}
}
}
}
}
/// <summary>
/// 小图的环绕
/// </summary>
public void CirCleImage()
{
if (isInCircle)
{
Vector3 nor = (currentpos - bigImageItemlist[0].currentPos).normalized;
currentpos = bigImageItemlist[0].currentPos + nor * 300;
if (bigImageItemlist.Count > 0)
{
for (int i = 0; i < bigImageItemlist.Count; i++)
{
if (bigImageItemlist[i] == null)
{
bigImageItemlist.RemoveAt(i);
}
}
float scale = 0;
scale = 1 - bigImageItemlist.Count * 0.5f;
scale = scale >= 0f ? scale : 0f;
targetScale = Vector3.one * scale;
}
}
else
{
offsetpos = Vector3.zero;
targetScale = Vector3.one;
}
}
/// <summary>
/// 判断图片是否围绕大图旋转
/// </summary>
/// <param name="CirClepoint">大图的坐标点</param>
/// <param name="R">图片旋转半径</param>
/// <param name="point">小图的坐标点</param>
/// <returns></returns>
public bool IsInCircle(Vector2 CirClepoint, float R, Vector2 point)
{
float r = Mathf.Sqrt((point.x - CirClepoint.x) * (point.x - CirClepoint.x) + (point.y - CirClepoint.y) * (point.y - CirClepoint.y));
return r <= R;
}
因为是一边写这篇文章一边进行代码的编写,还没有优化代码,以上的功能我把它集中于四个脚本中,如下:
GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI;
using System;
/// <summary>
/// 图片的状态(移动还是被点击放大)
/// </summary>
public enum ImageType
{
Null,
MoveImage,
BigImage
}
public class GameManager : MonoBehaviour {
public static GameManager instance;
void Awake()
{
instance = this;
}
List<Texture2D> textureList = new List<Texture2D>();//将获取的图片存于集合中
int texturelistIndex = 0;
string texpath; //获取本地图片的文件夹路径(自定义)
int row=8;//图片的行数
float timer1=0;//计时器
float timer2=0;//计时器
float createTime1= 2f;//生成一列图片的时间间隔
float createTime2= 1.35f;//生成一列图片的时间间隔
bool isStartMove=false;//是否加载完图片开始移动
Vector3 startpos =new Vector3(-2200, 300);//此位置为第一行生成点,其他行以此类推
float offset_y=120;
Transform startTran;
public List<ImageItem> moveimagelist = new List<ImageItem>(); //移动中的图片集合
public List<BigImageItem> bigImagelist = new List<BigImageItem>();//被点击放大的图片集合
public Queue<GameObject> newMoveImageQue = new Queue<GameObject>(); //加载出来的移动图片存于此集合,以便之后利用
GameObject moveImagePrefab; //移动图片预制体
Transform moveImageParent; //移动图片的父级
void Start()
{
texpath = Application.streamingAssetsPath + "/testimage";
moveImagePrefab = Resources.Load<GameObject>("imageItem");
moveImageParent = GameObject.Find("Canvas/panel").transform;
startTran = GameObject.Find("Canvas/startpos").transform;
StartCoroutine(LoadTextureFromFile());
}
void FixedUpdate()
{
if (isStartMove)
{
timer1 += Time.deltaTime;
if (timer1>=createTime1)
{
timer1 = 0;
GetNewImageItemObjSingleRow();
}
timer2 += Time.deltaTime;
if (timer2 >= createTime2)
{
timer2 = 0;
GetNewImageItemObjDoubleRow();
}
}
}
/// <summary>
/// //获取单行数小图
/// </summary>
public void GetNewImageItemObjSingleRow()
{
for (int i = 0; i < row; i++)
{
if (i%2!=0)
{
GameObject image = GetNewMoveImageItem(startpos - new Vector3(0, (i - 1) * offset_y));
image.SetActive(true);
AddImageItemCompomemt(image);
image.GetComponent<ImageItem>().currentpos = startpos;
image.GetComponent<ImageItem>().targetTrans = startTran;
float speed = 2f;
image.GetComponent<ImageItem>().OnEnter(startpos - new Vector3(0, (i - 1) * offset_y), speed, GetTexture());
}
}
}
/// <summary>
/// 获取双行数小图
/// </summary>
public void GetNewImageItemObjDoubleRow()
{
for (int i = 0; i < row; i++)
{
if (i % 2 == 0)
{
GameObject image = GetNewMoveImageItem(startpos - new Vector3(0, (i - 1) * offset_y));
image.SetActive(true);
AddImageItemCompomemt(image);
image.GetComponent<ImageItem>().currentpos = startpos;
image.GetComponent<ImageItem>().targetTrans = startTran;
float speed = 3f;
image.GetComponent<ImageItem>().OnEnter(startpos - new Vector3(0, (i - 1) * offset_y), speed, GetTexture());
}
}
}
/// <summary>
/// 添加ImageItem脚本
/// </summary>
public void AddImageItemCompomemt(GameObject obj)
{
if (!obj.GetComponent<ImageItem>())
{
ImageItem item=obj.AddComponent<ImageItem>();
moveimagelist.Add(item);
}
else
{
ImageItem item = obj.GetComponent<ImageItem>();
moveimagelist.Add(item);
}
}
/// <summary>
/// 获取新的移动小图
/// </summary>
/// <returns></returns>
public GameObject GetNewMoveImageItem(Vector3 pos)
{
GameObject newimageItem;
if (newMoveImageQue.Count > 0)
{
newimageItem = newMoveImageQue.Dequeue();
}
else
{
newimageItem = Instantiate(moveImagePrefab, moveImageParent, false);
newimageItem.transform.localPosition = pos;
}
return newimageItem;
}
/// <summary>
/// 将小图展示于视图
/// </summary>
/// <param name="imageitem"></param>
/// <param name="callback"></param>
public void PushNewMoveImageItem(GameObject imageitem, Action callback)
{
if (newMoveImageQue.Contains(imageitem))
{
return;
}
newMoveImageQue.Enqueue(imageitem);
if (callback != null)
{
callback();
}
}
public void RegisterItem(GameObject obj, ImageType imageType)
{
if (imageType == ImageType.MoveImage)
{
if (!moveimagelist.Contains(obj.GetComponent<ImageItem>()))
{
moveimagelist.Add(obj.GetComponent<ImageItem>());
}
}
else if (imageType == ImageType.BigImage)
{
if (!bigImagelist.Contains(obj.GetComponent<BigImageItem>()))
{
bigImagelist.Add(obj.GetComponent<BigImageItem>());
}
}
}
public void ReleaseItem(GameObject obj, ImageType imageType)
{
if (imageType == ImageType.MoveImage)
{
if (moveimagelist.Contains(obj.GetComponent<ImageItem>()))
{
moveimagelist.Remove(obj.GetComponent<ImageItem>());
}
}
else if (imageType == ImageType.BigImage)
{
if (bigImagelist.Contains(obj.GetComponent<BigImageItem>()))
{
bigImagelist.Remove(obj.GetComponent<BigImageItem>());
}
}
}
/// <summary>
/// 判断图片是否围绕大图旋转
/// </summary>
/// <param name="CirClepoint">大图的坐标点</param>
/// <param name="R">图片旋转半径</param>
/// <param name="point">小图的坐标点</param>
/// <returns></returns>
public bool IsInCircle(Vector2 CirClepoint, float R, Vector2 point)
{
float r = Mathf.Sqrt((point.x - CirClepoint.x) * (point.x - CirClepoint.x) + (point.y - CirClepoint.y) * (point.y - CirClepoint.y));
return r <= R;
}
/// <summary>
/// 使用协程加载文件夹内所有图片文件
/// </summary>
/// <returns></returns>
IEnumerator LoadTextureFromFile()
{
yield return null;
List<FileInfo> fileInfos = GetAllFileFrom(texpath);//获取相应文件夹所有的图片文件流数据
for (int i = 0; i < fileInfos.Count; i++)
{
LoadSingleTexture(fileInfos[i].FullName,fileInfos[i].Name);
}
yield return new WaitForSeconds(0.2f);
isStartMove = true;
}
/// <summary>
/// 将集合里的图片取出赋值到需要显示的RawImgae
/// </summary>
/// <returns></returns>
private Texture2D GetTexture()
{
if (textureList.Count>0)
{
Texture2D newTexture2D = textureList[texturelistIndex];
texturelistIndex += 1;
if (texturelistIndex>=textureList.Count)
{
texturelistIndex = 0;
}
return newTexture2D;
}
else
{
return null;
}
}
/// <summary>
/// 加载单张本地图片
/// </summary>
private void LoadSingleTexture(string imagepath,string imagename)
{
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);
System.Drawing.Image image = System.Drawing.Image.FromStream(filestream);
filestream.Close();
filestream.Dispose();
filestream = null;
int imageWidth=image.Width;
int imageheight=image.Height;
Texture2D tex2D = new Texture2D(1920,1080);
tex2D.LoadImage(bytes);
tex2D.name = imagename;
textureList.Add(tex2D);
bytes = null;
filestream = null;
image = null;
tex2D = null;
Resources.UnloadUnusedAssets();
GC.Collect();
}
/// <summary>
/// 得到相应文件夹下的所有文件夹内的所有文件的路径
/// </summary>
/// <param name="filepath">文件夹名称</param>
/// <returns></returns>
private List<FileInfo> GetAllFileFrom(string filepath)
{
List<FileInfo> filesinfolist = new List<FileInfo>();
DirectoryInfo infoDir = new DirectoryInfo(filepath);
FileInfo[] filesinfo = infoDir.GetFiles("*", SearchOption.AllDirectories);//获取路径内所有文件信息
for (int i = 0; i < filesinfo.Length; i++)
{
if (filesinfo[i].Name.Contains(".meta"))
{
continue;
}
filesinfolist.Add(filesinfo[i]);
}
return filesinfolist;
}
}
ImageItem.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ImageItem : ImageBase {
public bool isInCircle = false; //是否在围绕大图旋转
public ImageType imageTpye = ImageType.MoveImage; //小图的初始状态
public List<BigImageItem> bigImageItemlist = new List<BigImageItem>(); //将点击放大后的图添加进此集合
public Vector3 currentpos; //实时记录此时小图的位置
public Vector3 targetpos;
GameObject bigimagePrefab; //大图预制体
Transform bigimageparent; //大图的父级
public bool isEnable = false; //是否初始化
Vector3 offsetpos;
Vector3 targetScale = Vector3.one;
int R = 300;
Button self_btn; //点击放大按钮
public RawImage raw;
public float movespeed; //移动速度
public Transform targetTrans;//大图预设出来的位置参考
void Start()
{
self_btn = transform.GetComponent<Button>();
bigimagePrefab = Resources.Load<GameObject>("bigimageItem");
bigimageparent = GameObject.Find("Canvas/bigimagepanel").transform;
self_btn.onClick.AddListener(()=>{
GetBigImageItem();
});
}
/// <summary>
/// 获取相应的大图
/// </summary>
public void GetBigImageItem()
{
GameObject bigimage = Instantiate(bigimagePrefab, bigimageparent,false);
bigimage.GetComponent<RawImage>().texture = raw.texture;
bigimage.transform.localPosition = transform.localPosition + new Vector3(0,50,0);
bigimage.AddComponent<BigImageItem>();
bigimage.GetComponent<BigImageItem>().originalPos = this.transform.localPosition + new Vector3(0,50,0);
bigimage.GetComponent<BigImageItem>().targetTrans = targetTrans;
}
public override void OnEnter(Vector3 pos,float speed,Texture2D intoSprite)
{
//GameManager.instance.RegisterItem(this.gameObject, imageTpye);
movespeed = speed;
isEnable = true;
currentpos = pos;
targetpos = currentpos;
Texture2D newSprite = intoSprite;
if (newSprite!=null)
{
raw = transform.GetComponent<RawImage>();
raw.texture = newSprite;
}
bigImageItemlist.Clear();
transform.localScale = Vector3.one;
targetScale = Vector3.one;
isInCircle = false;
}
private void FixedUpdate()
{
if (isEnable)
{
currentpos += new Vector3(movespeed, 0, 0);
targetpos += new Vector3(movespeed, 0, 0);
if (currentpos.x>2200)
{
OnExit();
}
CirCleImage();
currentpos = Vector3.Lerp(currentpos, targetpos + offsetpos, 0.1f);
transform.localScale = Vector3.Lerp(transform.localScale, targetScale, 0.1f);
transform.localPosition = currentpos;
}
}
/// <summary>
/// 小图的环绕
/// </summary>
public void CirCleImage()
{
if (isInCircle)
{
Vector3 nor = (currentpos - bigImageItemlist[0].currentPos).normalized;
currentpos = bigImageItemlist[0].currentPos + nor * 300;
if (bigImageItemlist.Count > 0)
{
for (int i = 0; i < bigImageItemlist.Count; i++)
{
if (bigImageItemlist[i] == null)
{
bigImageItemlist.RemoveAt(i);
}
}
float scale = 0;
scale = 1 - bigImageItemlist.Count * 0.5f;
scale = scale >= 0f ? scale : 0f;
targetScale = Vector3.one * scale;
}
}
else
{
offsetpos = Vector3.zero;
targetScale = Vector3.one;
}
}
public override void OnExit()
{
GameManager.instance.PushNewMoveImageItem(this.gameObject, () =>
{
gameObject.SetActive(false);
isEnable = false;
});
GameManager.instance.ReleaseItem(this.gameObject,imageTpye);
}
}
BigImageItem.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BigImageItem : MonoBehaviour {
public ImageType imageType = ImageType.BigImage;
public List<ImageItem> moveImageList = new List<ImageItem>();
public Vector3 currentPos;
BigImageItem bigImage;
Button quitButton;
public bool isTouch = true;
public float touchTimer = 0;
float returnTimer = 60;
public Vector3 originalPos;// 初始位置
public Transform targetTrans;//移动范围检测 移出范围 回到原始位置,销毁,不移出范围,指定指定时间后销毁
public bool isCrossPos;//判断是否超出展示边界,超出,归位 销毁
float offset;
Button CheckTouchbtn;
private void Awake()
{
bigImage = this.GetComponent<BigImageItem>();
quitButton = this.transform.Find("Button").GetComponent<Button>();
CheckTouchbtn = this.GetComponent<Button>();
}
private void OnEnable()
{
GameManager.instance.RegisterItem(this.gameObject, imageType);
moveImageList = GameManager.instance.moveimagelist;
isTouch = true;
}
private void Start()
{
quitButton.onClick.AddListener(() => {
CloseCircle();
});
CheckTouchbtn.onClick.AddListener(()=> {
isTouch = true;
offset = 2160f;
if (transform.localPosition.x>(targetTrans.localPosition.x+offset)||transform.localPosition.x>targetTrans.localPosition.x)
{
isCrossPos = true;
}
});
}
private void FixedUpdate()
{
if (isTouch)
{
touchTimer += Time.fixedDeltaTime;
if (touchTimer > returnTimer)
{
CloseCircle();
touchTimer = 0;
isTouch = false;
}
}
Rotation();
currentPos = this.transform.localPosition;
LerpToOringinPos();
}
/// <summary>
/// 判断是否满足环绕条件
/// </summary>
public void Rotation()
{
for (int i = 0; i < moveImageList.Count; i++)
{
if (GameManager.instance.IsInCircle(transform.localPosition, 300f, moveImageList[i].currentpos))
{
//Debug.Log("在环绕条件中");
if (!moveImageList[i].bigImageItemlist.Contains(bigImage))
{
moveImageList[i].bigImageItemlist.Add(bigImage);
moveImageList[i].isInCircle = true;
}
}
else
{
if (moveImageList[i].bigImageItemlist.Contains(bigImage))
{
moveImageList[i].bigImageItemlist.Remove(bigImage);
if (moveImageList[i].bigImageItemlist.Count <= 0)
{
moveImageList[i].isInCircle = false;
}
}
}
}
}
/// <summary>
/// 当拖拽大图的手指抬起 大图归位
/// </summary>
private void LerpToOringinPos()
{
if (isCrossPos)
{
transform.localPosition = Vector3.Lerp(transform.localPosition, originalPos, 0.05f);
if (Vector3.Distance(transform.localPosition, originalPos) < 50f)
{
CloseCircle();
}
}
}
IEnumerator CloseCircleIE()
{
yield return new WaitForSeconds(0.1f);
for (int i = 0; i < moveImageList.Count; i++)
{
if (moveImageList[i].bigImageItemlist.Contains(bigImage))
{
moveImageList[i].bigImageItemlist.Remove(bigImage);
if (moveImageList[i].bigImageItemlist.Count <= 0)
{
moveImageList[i].isInCircle = false;
}
}
}
GameManager.instance.ReleaseItem(this.gameObject, imageType);
Destroy(gameObject);
}
public void CloseCircle()
{
StartCoroutine(CloseCircleIE());
}
private void OnDisable()
{
GameManager.instance.ReleaseItem(this.gameObject, imageType);
}
}
ImageBase.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ImageBase : MonoBehaviour {
public virtual void OnEnter(Vector3 pos,float speed,Texture2D intoSprite)
{
}
public virtual void OnExit()
{
}
}
效果演示:
五、设备性能测试
这一个简易的大屏展示系统便是写完了,在此基础上,此系统可以玩很多花样,例如不同的展示图片轨迹、实时拍照上传展示、在大屏内编辑图片保存,实时下载网络图片展示等
如果有需要源码的请私聊,免费提供