【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分别实现 虽然说现在官方的自带插件已经有很多了,但是有时候往往不能满足我们 ...
随机推荐
- 如何导入python中的模块
作为一名新手Python程序员,你首先需要学习的内容之一就是如何导入模块或包.但是我注意到,那些许多年来不时使用Python的人并不是都知道Python的导入机制其实非常灵活.在本文中,我们将探讨以下 ...
- SSH(struts2+hibernate+spring)总结
1 前三个文章 是我对ssh的具体实现 虽然没有真的写一个ssh的例子出来 但是 意思应该传达到了 主要还是注解注入的ssh太模块化了 感觉写出来意义不大 个人水平有限 说不清 2 我一开是写的是st ...
- VMWare 虚拟机 共享文件夹
1.不能拷贝和直接拖拽文件至虚拟机系统中 解决办法: 通过共享文件夹的方式进行文件共享. (Win7 32位 10.0版本的虚拟机). ①:选择虚拟机 虚拟机 → 设置 如下图: ②: ...
- south 命令学习
south 命令学习 概述 在django某个版本之前,django自身提供一个创建数据库的命令-syncdb,它会根据model来创建相应的表,但是这个命令不好的地方在于,如果想要对model进行更 ...
- LintCode题解之比较字符串
使用标记的方式,先遍历一遍B,出现一次就记录一次出现次数,然后遍历A,将记录的B的出现次数消去,最后检查一下记录的标记位是不是都消去了,总共需要检查三次,即进行三次O(n)的遍历. 然后总结出规律如果 ...
- JS基础速成(一)
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.JS的变量 1.变量的声明 var num=1;//使用var生命的变 ...
- Maven之(六)setting.xml配置文件详解
setting.xml配置文件 maven的配置文件settings.xml存在于两个地方: 1.安装的地方:${M2_HOME}/conf/settings.xml 2.用户的目录:${user.h ...
- shiro自定义Realm
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...
- app控件唯一相对Xpath自动生成(增强版uiautomatorviewer)
作者:cryanimal QQ:164166060 工具由来 前面的一篇博文较详细地介绍了uiautomatorviewer:扫描和分析Android应用程序的UI控件的工具. 熟悉控件获取的同学都知 ...
- JavaMail API 概述
JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序. JavaMail API提供了一组抽象类定义构成一个邮件系统的对象.它是阅读,撰写和发送电子信息的可选包(标准扩 ...