Unity TouchScript大屏

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()
    {
    
     
        
    }
}

效果演示:

在这里插入图片描述
五、设备性能测试
在这里插入图片描述
这一个简易的大屏展示系统便是写完了,在此基础上,此系统可以玩很多花样,例如不同的展示图片轨迹、实时拍照上传展示、在大屏内编辑图片保存,实时下载网络图片展示等

如果有需要源码的请私聊,免费提供

猜你喜欢

转载自blog.csdn.net/weixin_43541308/article/details/121650370
今日推荐