Unity Toast插件(UGUI版)
简介
介于自己之前经历的一些开发过程,非常希望unity能有类似Toast的功能用于一些简单的信息显示。但是找来找去找了半天,都木有发现,实在是憋不住了,自己写了个,感觉还可以用,发出来共享一下。。。
原理
原理嘛,就是先做一个Toast的prefeb,然后通过一个Manager将Toast生成出来,显示到Canvas。
然后出于性能考虑,由于反复Instantiate和Destroy对性能消耗巨大,所以内部使用了一个简单的Queue对生成出来的Toast进行了一个缓存。
使用方法
将prefeb中的ToastManager拖入到场景中
像这样
然后设置prefeb的参数:
第一个是可以用于显示的Canvas
第二个是Toast的对象池的大小
第三个是Toast的prefeb(可以在Res/Prefebs文件夹下找到)
代码调用方法:
简单的调用方法,默认的位置和颜色
public void ShowTopToast(string str)
{
LTToastManager.Instance.ShowToast(str);
}
可以自定义的调用方法,手动设置颜色,显示时间以及位置
public void ShowBottomToast(string str)
{
LTToast tempToast = LTToastManager.Instance.GetToast();
tempToast.SetColor(Color.green, Color.red);
tempToast.SetDuring(LTToast.DURING_LONG);
tempToast.SetText(str);
tempToast.SetPositionAndSize(LTToast.Position.Bottom);
tempToast.Show();
}
实际效果
代码
Toast类
using UnityEngine;
using UnityEngine.UI;
// 该类与LTToastManager强调用耦合
// PS:本来是想写成参数传递进入的,但是想了想这两块代码本就是一个模块
// 能不能算在内聚里面 O(∩_∩)O~
public class LTToast : MonoBehaviour
{
public enum Position
{
Bottom, Top, Custom
}
public Image background;
public Text toastStr;
public const float DURING_LONG = 1f;
public const float DURING_SHOR = 0.5f;
private const string ENTER_KEY = "enter";
private const string EXIT_KEY = "exit";
#region Top位置固定参数
private static Vector2 TopAnchorMin = new Vector2(0, 1);
private static Vector2 TopAnchorMax = new Vector2(1, 1);
private static Vector2 TopPivot = new Vector2(0.5f, 1);
private static Vector3 TopAnchoredPosition3D = new Vector3(0, 0, 0);
private static Vector2 TopSizeDelta = new Vector3(0, 50);
#endregion
#region Bottom位置固定参数
private static Vector2 BottomAnchorMin = new Vector2(0, 0);
private static Vector2 BottomAnchorMax = new Vector2(1, 0);
private static Vector2 BottomPivot = new Vector2(0.5f, 0);
private static Vector3 BottomAnchoredPosition3D = new Vector3(0, 0, 0);
private static Vector2 BottomSizeDelta = new Vector3(0, 50);
#endregion
#region 自定义位置参数
private Vector2 customAnchorMin = new Vector2(0, 0);
private Vector2 customAnchorMax = new Vector2(1, 0);
private Vector2 customPivot = new Vector2(0.5f, 0);
private Vector3 customAnchoredPosition3D = new Vector3(0, 0, 0);
private Vector2 customSizeDelta = new Vector3(0, 50);
#endregion
private RectTransform rectTransform;
private Animator mAnimator;
private float duringTime = DURING_SHOR;
private Position showPosition = Position.Top;
private bool isExit = false;
void Awake()
{
rectTransform = this.GetComponent<RectTransform>();
mAnimator = this.GetComponent<Animator>();
}
public void SetColor(Color backColor, Color textColor)
{
background.color = backColor;
toastStr.color = textColor;
}
public void SetDuring(float duringTime)
{
this.duringTime = duringTime;
}
public void SetText(string str)
{
toastStr.text = str;
}
public void SetPositionAndSize(Position showPosition)
{
this.showPosition = showPosition;
}
public void SetPositionAndSize(Vector2 min, Vector2 max, Vector2 pivot, Vector3 anchoredPosition, Vector2 size)
{
showPosition = Position.Custom;
customAnchorMin = min;
customAnchorMax = max;
customPivot = pivot;
customAnchoredPosition3D = anchoredPosition;
customSizeDelta = size;
}
private void SetPositionAndSize()
{
if (showPosition == Position.Top)
{
rectTransform.anchorMin = TopAnchorMin;
rectTransform.anchorMax = TopAnchorMax;
rectTransform.pivot = TopPivot;
rectTransform.anchoredPosition3D = TopAnchoredPosition3D;
rectTransform.sizeDelta = TopSizeDelta;
}
else if (showPosition == Position.Bottom)
{
rectTransform.anchorMin = BottomAnchorMin;
rectTransform.anchorMax = BottomAnchorMax;
rectTransform.pivot = BottomPivot;
rectTransform.anchoredPosition3D = BottomAnchoredPosition3D;
rectTransform.sizeDelta = BottomSizeDelta;
}
else if (showPosition == Position.Custom)
{
rectTransform.anchorMin = customAnchorMin;
rectTransform.anchorMax = customAnchorMax;
rectTransform.pivot = customPivot;
rectTransform.anchoredPosition3D = customAnchoredPosition3D;
rectTransform.sizeDelta = customSizeDelta;
}
else
{
Debug.LogError("检测到未定义位置,采用默认位置");
rectTransform.anchorMin = TopAnchorMin;
rectTransform.anchorMax = TopAnchorMax;
rectTransform.pivot = TopPivot;
rectTransform.anchoredPosition3D = TopAnchoredPosition3D;
rectTransform.sizeDelta = TopSizeDelta;
}
}
public void Show()
{
isExit = false;
// 强耦合
transform.SetParent(LTToastManager.Instance._ShowCanvas.transform);
// 设置位置及缩放的代码建议放在SetParent之后,防止蛋疼
transform.localScale = Vector3.one;
SetPositionAndSize();
mAnimator.Play(ENTER_KEY);
}
public void Cancel()
{
if (isExit)
{
return;
}
mAnimator.Play(EXIT_KEY);
isExit = true;
}
// UI帧调用,请勿更改
void EnterDone()
{
Invoke("Cancel", duringTime);
}
// UI帧调用,请勿更改
void ExitDone()
{
// 强耦合
transform.SetParent(LTToastManager.Instance.transform);
LTToastManager.Instance.ReturnToast(this);
}
}
ToastManager类
using UnityEngine;
using System.Collections.Generic;
public class LTToastManager : MonoBehaviour
{
private static LTToastManager mInstance;
public static LTToastManager Instance
{
get
{
return mInstance;
}
}
public Canvas _ShowCanvas;
public int _ToastPoolSize = 5;
public GameObject _PreToast;
private int currentIndex = 0;
private Queue<LTToast> toastPool;
void Awake()
{
mInstance = this;
toastPool = new Queue<LTToast>();
Init();
}
private void Init()
{
if (null == _ShowCanvas)
{
throw new System.Exception("未绑定Canvas");
}
if (null == _PreToast)
{
throw new System.Exception("未绑定Toast");
}
// 清除已有的,保持Manager目录清洁(没什么卵用,纯粹洁癖)
LTGame.LTUtils.ClearChildren(transform);
// 让对象池里面拥有一个Toast对象,提高第一次调用的效率
ReturnToast(GetToast());
}
public void ReturnToast(LTToast tempToast)
{
if (toastPool.Count < _ToastPoolSize)
{
toastPool.Enqueue(tempToast);
}
else
{
// 如果超出Toast池的最大大小则销毁
Destroy(tempToast.gameObject);
}
}
public LTToast GetToast()
{
if (toastPool.Count > 0)
{
return toastPool.Dequeue();
}
else
{
LTToast tempToast = Instantiate(_PreToast).GetComponent<LTToast>();
// 将新生成的对象放置到Manager目录下。
// PS:其实这段代码不应该放在这里,但是暂时木有找到更好的地方咯~~
tempToast.transform.SetParent(transform);
return tempToast;
}
}
public LTToast ShowToast(string str)
{
return ShowToast(str, LTToast.DURING_SHOR);
}
public LTToast ShowToast(string str, float duringTime)
{
return ShowToast(str, Color.black, Color.white, duringTime);
}
public LTToast ShowToast(string str, Color backColor, Color textColor)
{
return ShowToast(str, backColor, textColor, LTToast.DURING_SHOR);
}
public LTToast ShowToast(string str, Color backColor, Color textColor, float duringTime)
{
LTToast result = GetToast();
result.SetColor(backColor, textColor);
result.SetText(str);
result.SetDuring(duringTime);
result.SetPositionAndSize(LTToast.Position.Top);
result.Show();
return result;
}
}
总结
也没啥好总结的,先用着吧,哪里不对再改~~~
Unity Toast插件(UGUI版)的更多相关文章
- Unity NGUI和UGUI与模型、特效的层级关系
目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...
- 在Unity中使用UGUI修改Mesh绘制几何图形
在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...
- (转)Unity Cinemachine插件,实现单目标和多目标之间切换
Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换*版本要求Unity2017.1及以上. 参考资料: [官方] Unity 2017.1正式版发布 Cinemachine插件 ...
- 第三方登录插件.NET版XY.OAuth-CSharp
XY.OAuth-CSharp GitHub:XY.OAuth-CSharp OSChina:XY.OAuth-CSharp 第三方登录插件.NET版 使用 首先,从NuGet上安装"XY. ...
- 开发unity DLL插件
最近开发一款设备的SDK,想着要开发unity版本,怎么做呢?首先想到的就是在外部编写相关的驱动程序然后集成成几个dll作为unity的SDK使用了.So,我就开始了unity外部插件的研究之旅了. ...
- VS Code C# 插件离线版 1.6.2
VS Code C# 插件离线版,目前最新稳定版为:1.6.2 . 由于在扩展中下载C#插件总是缓慢,或者容易出现错误,特制作离线版本共享出来. 本离线版本为Windows版本,其他系统请在扩展中下载 ...
- jquery toast插件
插件描述:Toaster.js是一款Material Design风格jquery toast插件.Toaster.js提供5种主题,以及众多配置参数,用于显示toast类型的消息提示框.兼容性如下: ...
- Chrome插件-网页版BusHound
Chrome插件-网页版BusHound
随机推荐
- [模拟赛FJOI Easy Round #2][T1 sign] (模拟+求字符串重复字串)
[题目描述] 小Z在无意中发现了一个神奇的OJ,这个OJ有一个神奇的功能:每日签到,并且会通过某种玄学的算法计算出今日的运势.在多次试验之后,小Z发现自己的运势按照一定的周期循环,现在他找到了你,请通 ...
- Git——跟踪或取消跟踪文件
在Git是用过程中,可能遇到以下情况: 1.被跟踪文件里面有不想跟踪的文件. 2.每次用git status查看状态时总是列出未被跟踪的文件. 解决方法: 1.当被跟踪的文件里面有不想跟踪的文件时,使 ...
- [luoguP1736] 创意吃鱼法(DP)
传送门 f[i][j][0] 表示从右下角到左上角,以(i,j)为起点能延伸的最大值 f[i][j][1] 表示从左下角到右上角,以(i,j)为起点能延伸的最大值 up[i][j] 表示(i,j)上面 ...
- [luoguP1879] [USACO06NOV]玉米田Corn Fields(DP)
传送门 说要统计方案,感觉就是个 Σ 而矩阵中只有 01 ,可以用二进制表示 这样,预处理出每一个每一行所有可能的状态 s 然后初始化第一行所有状态的方案数为 1 f[i][j] = Σf[i - 1 ...
- 回文质数 USACO
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 15 ...
- LSN
http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html
- vijos- P1383盗窃-黑珍珠 (python + 代码优化)
P1383盗窃-黑珍珠 Accepted 标签:怪盗基德 VS OIBH[显示标签] 背景 怪盗基德 VS OIBH 第二话 描写叙述 今次怪盗基德再次对阵OIBH,目标是Black Star!基德已 ...
- CocoaPods pod instal慢、卡住解决方法
CocoaPods pod install慢.卡住解决方法 近期使用CocoaPods来加入第三方类库,不管是运行pod install还是pod update都卡在了Analyzing depend ...
- Bitmap通过getWidth和getHeight获取尺寸不符
在使用BitmapFactory载入图片时,常会出现这样的情况,返回的图片尺寸与实际尺寸不符.这是因为我们把图片资源放到res/drawable文件路径下时,选择的文件不同所致.不同的目录会有不同的缩 ...
- 尊重百度的api语音合成规则
屏幕显示字幕内容与形式 和 字幕的播放时长分离 : 去除标点符号的影响 # 设置分句的标志符号:可以根据实际需要进行修改 # cutlist = ".!?".decode('ut ...