【Unity技巧】自定义消息框(弹出框)
写在前面
准备工作
插件和工具
- 既然是界面,那么就离不开NGUI。确保你的项目里有NGUI插件,以及必要的图集来制作消息框的背景(为了省事你可以直接只用NGUI例子中的Atlas)。如果你需要中文显示,那么还需要用NGUI制作一个中文字体。网络上有很多教程。
- 单例脚本。这里需要单例模式主要是为了实现那种无需在面板中(指的是除消息框以外的其他对象)引用任何资源,这样你看起来就像是在VS2010下调用MessageBox.Show一样。
- iTween插件。这个插件是免费的,而且非常小巧。使用它主要是为了美化消息框的弹出效果,例如放大弹出、从上向下弹出等等。本例使用的是从上向下弹出。
本地化文本
- 创建一个纯文本文件,例如cn.txt,里面将定义所有用到的字符串。
- Confirm = 确定
- Cancel = 取消
- QuitConfirmTitle = 退出确认
- QuitConfirmContent = 继续将退出游戏。\n确定退出?
对于我们的弹出框,只用到上述四个文本。等号左边的名字相当于这个字符串的ID,等号右边是内容。
- Confirm = 确定
- 制作一个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即可。
- using UnityEngine;
- 新建一个场景,并把之前的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分别实现 虽然说现在官方的自带插件已经有很多了,但是有时候往往不能满足我们 ...
随机推荐
- bootstrap插件fileinput.js 出现出现$("#xxxx").fileinput({}); 不生效的情况解决
如果出现$("#xxxx").fileinput({}); 不生效的情况请将fileinput.js中最后几行注释掉: /* $(document).ready(function ...
- css3部分整理
1.css弹性盒子属性 父级元素属性的设置 #father{ width: 800px; height: 300px; background-color: darkgray; /*定义父级元素为弹性元 ...
- easing--缓动函数--贝塞尔函数--圆盘转动抽奖应用
http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js http://www.robertpenner.com/easing/penn ...
- git遇到的问题
push代码时出现的问题: ! [remote rejected] HEAD -> (unpacker error)) 解决办法: $ git push --no-thin origin rel ...
- SpringMVC之简单的增删改查示例(SSM整合)
本篇文章主要介绍了SpringMVC之简单的增删改查示例(SSM整合),这个例子是基于SpringMVC+Spring+Mybatis实现的.有兴趣的可以了解一下. 虽然已经在做关于SpringMVC ...
- Python中迭代输出(index,value)的几种方法
需求如下:迭代输出序列的索引(index)和索引值(value). 1.创建测试列表: >>> lst = [1,2,3,4,5] 2.实现方法如下: #方法1:range()+le ...
- jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
前言 目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5 ...
- Dynamics CRM2016 在实体命名时需要注意的事项
在使用web api的过程中遇到个很无语的设置,体现在对实体名的设置上,之前看到accounts以为只是在实体名上加个s,也没往深处看,但真正进入项目实施了问题就来了,city直接变成了cities不 ...
- [CSDN_Markdown] 使用CSDN Markdown编辑器
简介 最近CSDN支持Markdown语法写博客了,甚是欢喜.前几天写了一篇实验了下,感觉不错.准备写几篇文章介绍一下如何使用CSDN的Markdown编辑器写博客,不求全面,但求够用,望大家批评指正 ...
- 两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。
#include <iostream> using namespace std; /*函数作用:取待排序序列中low.mid.high三个位置上数据,选取他们中间的那个数据作为枢轴*/ i ...