Unity 动态载入Panel并实现淡入淡出
unity版本:4.5 NGUI版本:3.6.5
参考链接:http://tieba.baidu.com/p/3206366700,作者:百度贴吧 水岸上
动态载入NGUI控件,这里用Panel为例说明。
1、如何创建NGUI控件的预设:
在要保存prefab文件的目录下鼠标右键Create Prefab,保存预设名字,然后直接把Hierarchy中的控件拖到预设中即可;
2、实现Panel淡入淡出的代码,在预设Panel中添加下述代码的脚本组件:

代码如下:
using UnityEngine;
using System.Collections; public class PanelFade : MonoBehaviour
{
// 表示Panel正在打开
public bool _opening;
// 表示Panel正在关闭
public bool _closing; void Start()
{
// 初始时_opening设为true,实现打开时淡入效果
_opening = true;
_closing = false; // alpha设为0,为全透明
gameObject.transform.GetComponent<UIPanel>().alpha = ;
} // Update is called once per frame
void Update()
{
// 处于打开状态,alpha随时间增加
if (_opening == true)
{
// 找到Panel的alpha的值,随时间增加,实现淡入效果
gameObject.transform.GetComponent<UIPanel>().alpha += Time.deltaTime * 4f; // 当alpha>=1时,打开状态结束,_opening设置false
if (gameObject.transform.GetComponent<UIPanel>().alpha >= )
_opening = false;
} if (_closing == true)
{
// 处于关闭状态,alpha随时间减少
gameObject.transform.GetComponent<UIPanel>().alpha -= Time.deltaTime * 4f; // alpha小于0,关闭状态结束,_closing设为false,并且在UI Root下删除该Panel
if (gameObject.transform.GetComponent<UIPanel>().alpha <= )
{
_closing = false;
NGUITools.Destroy(gameObject);
}
}
}
}
上诉代码,在start函数中把 _opening 赋值为true,创建预设时,将该代码添加到Panel组件中,在panel创建时自动实现淡入效果,淡入效果的调整则调节alpha随时间减少部分的代码;
2、淡出效果:
我们在要创建预设的Panel下创建一个按钮,点击可关闭panel并且实现关闭时淡出效果:

代码如下:
using UnityEngine;
using System.Collections; public class DeletePanelPrefab : MonoBehaviour
{
void OnClick()
{
// 找到该按钮要关闭的Panel对象中的PanelFade脚本
PanelFade _panelfade_script = gameObject.GetComponentInParent<PanelFade>();
// 把脚本中对应关闭状态的_closing设为true
_panelfade_script._closing = true;
}
}
代码中实现了对按钮点击事件的监听,监测到点击按钮时,找到Panel下的脚本,把_closing值赋为true,即表示panel正在关闭;
上述1、2两步骤即完成了预设的创建、panel的淡入淡出效和预设的删除;
3、用NGUI创建一个按钮来测试上面功能是否能实现:
创建一个按钮并为其添加脚本,代码如下:
using UnityEngine;
using System.Collections; public class CeeatePanelByPrefab : MonoBehaviour
{
// panel的预设
public GameObject _panel_prefab;
// NGUI的UI Root
public GameObject _uiroot; void OnClick()
{
// 为_uiroot对象添加子对象
GameObject panel = NGUITools.AddChild(_uiroot, _panel_prefab);
// panel的位置调整
panel.transform.localPosition= new Vector3(-,,);
}
}
拖动相关对象为代码中的_panel_prefab和_uiroot赋值,如下图:

点击按钮就可以实现动态创建panel,点击panel中的按钮可实现删除panel,并在panel的出现和消失时附有淡入淡出效果。
重写了相关部分的代码,可以自己设置淡入淡出的时间以及淡出后删除本面板的功能:
using UnityEngine;
using System.Collections; public class PanelFade : MonoBehaviour
{
// 表示Panel正在打开
private bool _opening;
// 表示Panel正在关闭
private bool _closing; // 相关时间
public float _open_delay_time = ;
public float _close_delay_time = ;
public float _open_time = 0.08f;
public float _close_time = 0.08f;
public float _invoke_time = 0.01f; // 设置淡入的延迟时间(即几秒后开始淡入)
public float OpenDelayTime
{
get
{
return this._open_delay_time;
}
set
{
this._open_delay_time = value;
}
} // 设置淡出的延迟时间
public float CloseDelayTime
{
get
{
return this._close_delay_time;
}
set
{
this._close_delay_time = value;
}
} // 淡出时间
public float CloseTime
{
get
{
return this._close_time;
}
set
{
this._close_time = value;
}
} // 淡入时间
public float OpenTime
{
get
{
return this._open_time;
}
set
{
this._open_time = value;
}
} // 每次刷新的时间
public float InvokeTime
{
get
{
return this._invoke_time;
}
set
{
this._invoke_time = value;
}
} // 设置面板的打开状态,true表示正在打开
public bool PanelOpen
{
set
{
if (this._opening == false && value == true)
{
this._opening = value;
InvokeRepeating("OpenFade", this._open_delay_time, this._invoke_time);
}
}
} // 面板关闭并删除该面板
public bool PanelCloseAndDestory
{
set
{
if (this._closing == false && value == true)
{
this._closing = value;
InvokeRepeating("DesrotyFade", this._close_delay_time, this._invoke_time);
}
}
} // 面板的关闭状态,true表示正在关闭
public bool PanelClose
{
set
{
if (this._closing == false && value == true)
{
this._closing = value;
InvokeRepeating("CloseFade", this._close_delay_time, this._invoke_time);
}
}
} void Start()
{
// 初始时淡入
this.PanelOpen = true;
} // 实现打开时淡入的功能函数
void OpenFade()
{
gameObject.transform.GetComponent<UIPanel>().alpha += this._invoke_time / this._open_time; if (gameObject.transform.GetComponent<UIPanel>().alpha >= )
{
this._opening = false;
CancelInvoke("OpenFade");
}
} // 关闭时淡出的函数
void CloseFade()
{
gameObject.transform.GetComponent<UIPanel>().alpha -= this._invoke_time / this._close_time; if (gameObject.transform.GetComponent<UIPanel>().alpha <= )
{
this._closing = false;
CancelInvoke("CloseFade");
}
} // 面板删除淡出的函数
void DesrotyFade()
{
gameObject.transform.GetComponent<UIPanel>().alpha -= this._invoke_time / this._close_time; if (gameObject.transform.GetComponent<UIPanel>().alpha <= )
{
this._closing = false;
CancelInvoke("DestoryFade");
NGUITools.Destroy(gameObject);
}
}
}
PanelFade
Unity 动态载入Panel并实现淡入淡出的更多相关文章
- Unity 阴影淡入淡出效果中Shader常量 unity_ShadowFadeCenterAndType和_LightShadowData的问题
由于Universal Render Pipeline目前(2020年4月1日)把阴影淡入淡出这个功能竟然给取消了…我自己拿片元位置到相机位置的距离进行了一个淡化,但是阴影边缘老是被裁切…后来研究了一 ...
- Unity 启动画面淡入淡出
前几天在玩我叫MT 2游戏的时候发现打开他们应用的时候发现他们Logo淡入淡出的效果做的挺好的,例如第一张是运营商腾讯的logo第二张是他们公司的游戏logo.我们也来模仿一下: 第一张图片:运营商的 ...
- [unity基础教程]Unity3D实现动态载入游戏资源(转)
用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态载入.比方想载入一个大场景的资源,不应该在游戏的開始让用户长时间等待全部资源的载入完成.应该优先载入用户附近的场景资源.在游 ...
- Unity3D 4.61 实现淡入淡出的场景过渡方法。
还在学习过程中,如果有大大看到请指点. orz原来官方就有了更好的处理方法的教程,具体查看下面视屏. [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(五) 屏幕渐变效 ...
- jQuery淡入淡出瀑布流效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Jquery小例子:全选按钮、加事件、挂事件;parent()语法;slideToggle()语法;animate()语法;元素的淡入淡出效果:fadeIn() 、fadeOut()、fadeToggle() 、fadeTo();function(e):e包括事件源和时间数据;append() 方法
function(e): 事件包括事件源和事件数据,事件源是指是谁触发的这个事件,谁就是事件源(div,按钮,span都可以是事件源),时间数据是指比如点击鼠标的事件中,事件数据就是指点击鼠标的左建或 ...
- JQuery: JQuery效果(隐藏、显示、切换,滑动,淡入淡出,以及动画)
JQuery:效果 JQuery效果有很多,包括隐藏.显示.切换,滑动,淡入淡出,以及动画等.隐藏:JQuery hide() 显示:JQuery show() 切换:JQuery toggle() ...
- 【Android Developers Training】 69. 视图切换的淡入淡出效果
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Axure实现淡入淡出效果
小伙伴们有可能在各大网站看到淡入淡出效果的动画,比如淘宝.京东,淘宝每天会把各种打折促销.今日推荐.限时抢购等做成淡入淡入或者向右活动等类似翻页的效果放在首页,吸引顾客的眼球,那么如何使用Axure来 ...
随机推荐
- Qt 学习之路:QStringListModel
上一章我们已经了解到有关 list.table 和 tree 三个最常用的视图类的便捷类的使用.前面也提到过,由于这些类仅仅是提供方便,功能.实现自然不如真正的 model/view 强大.从本章起, ...
- IDL计算儒略日
遥感数据还有一些文章中使用数据的时候,经常使用儒略日(Julian day),即计算该天是一年中的第几天.正好有时间,就用IDL写了段儿小代码,方便使用. ;+ ; :Author: caoz ...
- hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)
对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待. 一对一(主键关联,和单向的外键关 ...
- xpath 操作XML
1.xpath 操作XML,底下部分代码被注释了,但是是完整功能,去除注释是正常使用的(有写命名和其他冲突,所以注释了) 总体有:完整读取xml,对xml的增删改查,对xml的特定操作 using S ...
- 用于显示上个月和下个月_PHP
/** * 用于显示上个月和下个月 * @param int $sign 1:表示上个月 0:表示下个月 * @return string */ function GetMonth($sign=&qu ...
- JS入门笔记
DOM有四种节点: 1. 元素节点:即标签2. 属性节点:写在标签里的属性3. 文本节点:嵌在元素节点里展示出来的文本4. 文档节点:document 获取元素节点的三种常用方法: 1.ById 2. ...
- 运用BeanUtils构建通用的查询 更新方法(个人拙作,不喜勿喷)
------------------------------------更新方法----------------------------------- public void update(Strin ...
- 在CentOS 6.3中安装与配置JDK-7
在CentOS 6.3中安装与配置JDK-7 来源:互联网 作者:佚名 时间:02-07 16:28:33 [大 中 小] 在CentOS-6.3中安装与配置JDK-7,有需要的朋友可以参考下 安装说 ...
- centos6.5安装vsftp服务并配置虚拟账户ftp
当我们的用户量越来越大时,继续创建更多的系统用户是不明智的,这时就需要为vsftpd创建虚拟账户,但vsftpd虚拟账户的数据库要保存在Berkeley DB格式的数据文件中,所以需要安装db4- ...
- zTree异步生成数据时无法获取到子节点的选中状态
最近在项目中遇到一个问题,需求如下: 根据选中不同的人员(ID)向后台发送ajax请求,通过返回的数据来生成该人员的权限访问树,该树目录最少为3级目录,在生成的时候会自动勾选上次保存过的选中状态,点击 ...