【Unity技巧】自定义消息框(弹出框)
写在前面
准备工作
插件和工具
- 既然是界面,那么就离不开NGUI。确保你的项目里有NGUI插件,以及必要的图集来制作消息框的背景(为了省事你可以直接只用NGUI例子中的Atlas)。如果你需要中文显示,那么还需要用NGUI制作一个中文字体。网络上有很多教程。
- 单例脚本。这里需要单例模式主要是为了实现那种无需在面板中(指的是除消息框以外的其他对象)引用任何资源,这样你看起来就像是在VS2010下调用MessageBox.Show一样。
- iTween插件。这个插件是免费的,而且非常小巧。使用它主要是为了美化消息框的弹出效果,例如放大弹出、从上向下弹出等等。本例使用的是从上向下弹出。
本地化文本
- 创建一个纯文本文件,例如cn.txt,里面将定义所有用到的字符串。
Confirm = 确定
Cancel = 取消 QuitConfirmTitle = 退出确认
QuitConfirmContent = 继续将退出游戏。\n确定退出?对于我们的弹出框,只用到上述四个文本。等号左边的名字相当于这个字符串的ID,等号右边是内容。
- 制作一个Localization Prefab。这点和NGUI例子很相似,就是为了方便以后修改。对于我们的教程,如果你不制作成一个Prefab也是可以的,但是还是不建议,还是那句话,这种思维还是很重要的。制作好的prefab如下:
细心的你可能发现除了上述提到的脚本,还有一个脚本:DontDestroyOnLoad.cs。代码如下:using UnityEngine;
using System.Collections; public class DontDestroyOnLoad : MonoBehaviour { // Use this for initialization
void Start () {
DontDestroyOnLoad(this.gameObject);
}
}它的作用显而易见,就是为了不让我们的本地化文本在场景切换时被销毁。这样就不用每一个场景都实例化一个Localization Prefab,而只需要在游戏的第一个场景中包含一个Localization Prefab即可。
- 新建一个场景,并把之前的Localization Prefab拖进去。
实现
测试功能:检测退出按钮
using UnityEngine;
using System.Collections; public class KeyDetecter : MonoBehaviour { private CommonUIManager m_CommonUIManager = null; void Start() {
m_CommonUIManager = Singleton.getInstance("CommonUIManager") as CommonUIManager;
} // Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.Escape) && m_CommonUIManager != null) {
m_CommonUIManager.ShowMessageBox(
Localization.instance.Get("QuitConfirmTitle"),
Localization.instance.Get("QuitConfirmContent"),
MessageBox.Style.OKAndCancel,
OnReceiveQuitConfirmResult);
} } void OnReceiveQuitConfirmResult(MessageBox.Result result) {
if (result == MessageBox.Result.OK) {
Application.Quit();
}
}
}
界面
using UnityEngine;
using System.Collections; public class CommonUIDetail : MonoBehaviour { public TweenPosition messageBoxTween;
public UILabel messageBoxTitle;
public UILabel messageBoxContent;
public GameObject[] buttonGroups = new GameObject[(int)MessageBox.Style.eNumCount]; public System.Action messageBoxConfirmCallback = null;
public System.Action messageBoxCancelCallback = null; void OnConfirm() {
if (messageBoxConfirmCallback != null) {
messageBoxConfirmCallback();
}
} void OnCancel() {
if (messageBoxCancelCallback != null) {
messageBoxCancelCallback();
}
}
}
并把该脚本添加到CommonUIRoot上,并给面板上的各个变量赋值:
单例脚本
using UnityEngine;
using System.Collections; public class MessageBox {
public delegate void OnReceiveMessageBoxResult(MessageBox.Result result); public enum Style {
OnlyOK,
OKAndCancel,
eNumCount
} public enum Result {
OK,
Cancel,
eNumCount
}
} public class CommonUIManager : MonoBehaviour { public GameObject commonUIPrefab = null; public GameObject root;
public TweenPosition messageBoxTween;
public UILabel messageBoxTitle;
public UILabel messageBoxContent;
public GameObject[] buttonGroups = new GameObject[(int)MessageBox.Style.eNumCount]; private MessageBox.OnReceiveMessageBoxResult messageBoxCallback = null; // Use this for initialization
void Start () { } // Update is called once per frame
void Update () { } public void ShowMessageBox(string title, string content, MessageBox.Style style,
MessageBox.OnReceiveMessageBoxResult callback) {
if (root == null) {
commonUIPrefab = Resources.Load("CommonUIRoot") as GameObject;
root = GameObject.Instantiate(commonUIPrefab) as GameObject;
root.transform.parent = this.transform; CommonUIDetail uiDetail = root.GetComponent<CommonUIDetail>();
messageBoxTween = uiDetail.messageBoxTween;
messageBoxTitle = uiDetail.messageBoxTitle;
messageBoxContent = uiDetail.messageBoxContent;
buttonGroups[(int)MessageBox.Style.OnlyOK] = uiDetail.buttonGroups[(int)MessageBox.Style.OnlyOK];
buttonGroups[(int)MessageBox.Style.OKAndCancel] = uiDetail.buttonGroups[(int)MessageBox.Style.OKAndCancel]; uiDetail.messageBoxConfirmCallback = OnConfirm;
uiDetail.messageBoxCancelCallback = OnCancel;
} messageBoxTitle.text = title;
messageBoxContent.text = content;
messageBoxCallback = callback; switch ((int)style) {
case (int)MessageBox.Style.OnlyOK:
buttonGroups[(int)MessageBox.Style.OnlyOK].SetActive(true);
buttonGroups[(int)MessageBox.Style.OKAndCancel].SetActive(false);
break;
case (int)MessageBox.Style.OKAndCancel:
buttonGroups[(int)MessageBox.Style.OnlyOK].SetActive(false);
buttonGroups[(int)MessageBox.Style.OKAndCancel].SetActive(true);
break;
} messageBoxTween.Play(true);
} void OnConfirm() {
if (messageBoxCallback != null) {
messageBoxCallback(MessageBox.Result.OK);
messageBoxCallback = null;
} messageBoxTween.Play(false);
} void OnCancel() {
if (messageBoxCallback != null) {
messageBoxCallback(MessageBox.Result.Cancel);
messageBoxCallback = null;
} messageBoxTween.Play(false);
}
}
效果
结束语
【Unity技巧】自定义消息框(弹出框)的更多相关文章
- ⒁bootstrap组件 工具提示框 弹出框 警告框 基础案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 玩转EasyUi弹出框
这两天在搞EasyUi的弹出框,弹出框之前也搞过很多个版本,总是觉得不那么完美,刚好最近有时间,就往多处想了想,功能基本上达到我的预期,并且在开发过程中遇到很多小技巧,特撰文如下. 走起:在EasyU ...
- 通过jquery获得某个元素的位置, 透明div, 弹出框, 然后在旁边显示toggle子级联菜单-hover的bug解决
jquery的"筛选选择器", 都是用冒号开头的, 即, 冒号选择器就是 筛选选择器.如: :first, :last, :eq(index), :first-child,...等 ...
- Bootstrap 弹出框和警告框插件
一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的容器. //基本用法 <button class="btn btn-lg btn-danger" type=" ...
- vue--vant组件库Dialog弹出框
安装vant UI框架: cnpm install vant –-save-dev 导入组件-在main.js里: import Vant from 'vant'; import'vant/lib/v ...
- 第二百四十六节,Bootstrap弹出框和警告框插件
Bootstrap弹出框和警告框插件 学习要点: 1.弹出框 2.警告框 本节课我们主要学习一下 Bootstrap 中的弹出框和警告框插件. 一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的 ...
- 【cocos2dx 小技巧】半透明屏蔽罩和弹出框的实现
今天介绍一下,弹出框的和屏蔽罩的小实现~ 弹出框主要用到了cocos2dx生命周期里面的OnEnter()函数,就是当Layer被addChild的时候会调用的函数(所以假设把OnEnter的代码加到 ...
- unity 之 自定义弹出框
一.弹出框的搭建: 布局如图:Message为整个父物体,并且添加UiMessage代码.panel为遮罩. MessageBox为整个提示框,Panel为标题,ok为确定按钮,cancel为取消按钮 ...
- 四种常见的提示弹出框(success,warning,error,loading)原生JavaScript和jQuery分别实现
原文:四种常见的提示弹出框(success,warning,error,loading)原生JavaScript和jQuery分别实现 虽然说现在官方的自带插件已经有很多了,但是有时候往往不能满足我们 ...
随机推荐
- HTTPS介绍
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...
- 实现string类
/* 实现string类 */ class String { public: String(const char *str=NULL); //构造函数 S ...
- DS4700磁盘阵列的控制器微码升级操作记录(收录百度文库)
DS4700磁盘阵列的控制器微码升级操作记录 项目介绍: 于10年3月,XX地市区/州XX分公司相继反映生产读取数据速度较之前变得非常慢,表现在:日常报表抽取数据速度明显变慢,客户打开前台页面速度 ...
- jquery选择器选取class
- STM32 基DMA的DAC波形发生器
DAC是STM32系列的一个基本外设,可以将数字信号转化成模拟信号,这次我将使用DAC来输出一个特定波形. 首先确定工作方法,由于我目前在做的简易示波器在输出波形的同时还需要显示输入信号,所以不能占用 ...
- JPA 的 CascadeType 属性 和 FetchType属性 和 各种映射关系
代码地址:https://gitee.com/a247292980/lgp20151222 CascadeType CascadeType.PERSIST级联新增(又称级联保存): CascadeTy ...
- JVM Class详解之一
首先看Class中包含哪些信息简单的说所有Java文件中有的信息class文件都有,编译器帮我们将java文件转化成了JVM能看懂的class格式而已 Class 概述 Class文件是一组以8位字节 ...
- 46. Permutations(medium, backtrack, 重要)
Given a collection of distinct numbers, return all possible permutations. For example, [1,2,3] have ...
- 深入理解null的原理
--null的原理 --oracle一直将null和空字符串''<长度为0>同等对待<如'' is null是true,''=null为false,如果声明a varchar2:=' ...
- CSharpGL(48)用ShadowVolume画模型的影子
CSharpGL(48)用ShadowVolume画模型的影子 在Per-Fragment Operations & Tests阶段,有一个步骤是模版测试(Stencil Test).依靠这一 ...