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

效果演示:


五、设备性能测试

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

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

Unity TouchScript大屏相关推荐

  1. unity 大屏 展示_团结波士顿,展示Unity阵容

    unity 大屏 展示 Unite Boston is right around the corner and for the first time, we're hosting a Made wit ...

  2. Unity触控——单指、双指、Windows大屏多人触控

    前段时间做了个Windows系统的大屏触控程序,最多同时支持十点触控,并且在各自的小窗口中要分别处理,即每个小窗口中的触点为一个处理组,判断其单点或多点操作.按以往移动端程序的触屏事件Input.Ge ...

  3. 大屏设计的视觉统一_视觉设计中的统一

    大屏设计的视觉统一 视觉设计的统一性是什么? (What is unity in visual design?) The concept of unity in visual design means ...

  4. 堪称暴力美学的可视化大屏是怎么做的?附无代码硬核教程

    前些日子在和别人交流的过程中发现,现在市场变化太快,不仅用Excel做报表已经落后了,就连最后的数据都要以美观.直接.酷炫的方式展现出来. 那到底怎样呈现数据才是你们所说的美观酷炫,能让人赏心悦目?通 ...

  5. 实际工作中,一个完整的可视化大屏项目有哪些步骤?

    这两年数据可视化大屏成为了各家公司的网红,老板动不动开口就要"酷炫大屏",大屏的应用场景确实很多,不仅能实时监控重点数据,提高决策效率,放在公司会议室,展台等地方,还能提升公司形象 ...

  6. 怎么做数据可视化大屏?从设计到上线,一般用这3类工具

    数据可视化大屏成为了这两年很火爆的一个需求. 一方面,不少甲方都想做这么酷炫的大屏,用于公司展厅.日常经营监控,还有些特殊行业如交通.运输.工厂制造,会做更高级的3D建模等. 另一方面,市面上可提供做 ...

  7. 3D大屏制作方法论终于来了!快码

    从远古时代的结绳记事,到报表的兴起,再到现在多维.VR技术的繁荣,人们在数据可视化的道路上一直马不停蹄.如今,3D技术的广泛应用使人们观感世界变得更加绚丽多姿. SM公司大屏惊现"滔天巨浪& ...

  8. 3D可视化大屏是如何实现的?

    3D可视化是指拥有3D效果的数据可视化,对于所要展示的数据可视化内容还原出真实场景,并实时接入数据,在面对复杂操作时灵活应对,使得整个场景在大屏上的展示更具立体.更具科技感.更具易用性. 物联网时代, ...

  9. 国人造「人镜分离望远镜」,手机大屏能拍照、能录像…500mm长焦距,月坑都能看清楚...千元入...

    ©程序员严选 丨为您甄选全球好物 如果我问你宇宙是什么?你会怎么回答我- 答:宇宙泛指物质和时空. 大约在138亿年前,整个宇宙包括物质.能量.物理定律和时间从大爆炸中产生. 从那一刻开始,宇宙就以非 ...

最新文章

  1. Golang反射机制的实现分析——reflect.Type类型名称
  2. suse linux mysql_SUSE Linux 下 MySQL集群配置
  3. 计算机无法同步时间,为什么在Win7中无法同步计算机时间?
  4. 为什么铺天盖地都是Python的广告,它真的是无所不能吗?
  5. 代码质量度量标准_Google研发度量改进实践
  6. 【Unity】第5章 3D坐标系和天空盒
  7. win10 悬浮日历_win10系统桌面添加日历,天气,时钟等小工具的操作方法
  8. 林子雨-2.3 面向对象编程基础
  9. 【iOS逆向与安全】frida-trace入门
  10. java怎么求最大值和最小值,java求最大值和最小值
  11. safari显示找不到服务器,苹果自带浏览器找不到服务器是什么问题
  12. 2021年口碑超好旗舰:蓝牙耳机排行榜10强推荐
  13. android monkey,Android Monkey搭建 你不用了解的
  14. 为河南小伙恩辉舍己救人点赞<原创>
  15. 我决定切换到 Vue.js,不再使用 React!
  16. 客官,来看看AspNetCore的身份验证吧
  17. xilinx芯片的 IOB 以及 IOB = false
  18. Permute mac版 v3.7.2 文件格式转换器
  19. 感光器尺寸 面积 转换 计算
  20. python交通调查数据处理_GitHub - unlimitbladeworks/traffic-monitor: 基于高德地图的交通数据分析...

热门文章

  1. 一条语句完成微信、支付宝支付,生成支付二维码
  2. Ubuntu与arm开发板之间构建NFS数据通道
  3. Error: Socket descriptor not found. Hint: the problem might be solved applying the following:
  4. 如何在 XMind 中输入数学方程?LaTeX 简易入门
  5. EPICS驱动Newport XPS-Q8控制器
  6. 数值分析matlab最小二乘法,数值分析 最小二乘 matlab
  7. OneDrive登录问题
  8. 失眠 我们该怎么办?
  9. 七夕节微信表白墙小程序源码/基于Laravel的表白墙微信小程序源码
  10. 游戏引擎编程需要哪些基本数学知识?