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并实现淡入淡出的更多相关文章

  1. Unity 阴影淡入淡出效果中Shader常量 unity_ShadowFadeCenterAndType和_LightShadowData的问题

    由于Universal Render Pipeline目前(2020年4月1日)把阴影淡入淡出这个功能竟然给取消了…我自己拿片元位置到相机位置的距离进行了一个淡化,但是阴影边缘老是被裁切…后来研究了一 ...

  2. Unity 启动画面淡入淡出

    前几天在玩我叫MT 2游戏的时候发现打开他们应用的时候发现他们Logo淡入淡出的效果做的挺好的,例如第一张是运营商腾讯的logo第二张是他们公司的游戏logo.我们也来模仿一下: 第一张图片:运营商的 ...

  3. [unity基础教程]Unity3D实现动态载入游戏资源(转)

    用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态载入.比方想载入一个大场景的资源,不应该在游戏的開始让用户长时间等待全部资源的载入完成.应该优先载入用户附近的场景资源.在游 ...

  4. Unity3D 4.61 实现淡入淡出的场景过渡方法。

    还在学习过程中,如果有大大看到请指点. orz原来官方就有了更好的处理方法的教程,具体查看下面视屏. [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(五) 屏幕渐变效 ...

  5. jQuery淡入淡出瀑布流效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Jquery小例子:全选按钮、加事件、挂事件;parent()语法;slideToggle()语法;animate()语法;元素的淡入淡出效果:fadeIn() 、fadeOut()、fadeToggle() 、fadeTo();function(e):e包括事件源和时间数据;append() 方法

    function(e): 事件包括事件源和事件数据,事件源是指是谁触发的这个事件,谁就是事件源(div,按钮,span都可以是事件源),时间数据是指比如点击鼠标的事件中,事件数据就是指点击鼠标的左建或 ...

  7. JQuery: JQuery效果(隐藏、显示、切换,滑动,淡入淡出,以及动画)

    JQuery:效果 JQuery效果有很多,包括隐藏.显示.切换,滑动,淡入淡出,以及动画等.隐藏:JQuery hide() 显示:JQuery show() 切换:JQuery toggle() ...

  8. 【Android Developers Training】 69. 视图切换的淡入淡出效果

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Axure实现淡入淡出效果

    小伙伴们有可能在各大网站看到淡入淡出效果的动画,比如淘宝.京东,淘宝每天会把各种打折促销.今日推荐.限时抢购等做成淡入淡入或者向右活动等类似翻页的效果放在首页,吸引顾客的眼球,那么如何使用Axure来 ...

随机推荐

  1. block代码块介绍

    关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的 ...

  2. asp.net 的脚本

    asp.net的 Web 控件有时会包装一些用户端脚本 (client-side scripting),在控件被绘制时输出到用户端,这些脚本多数被包装在 DLL 的资源档中,并由 ScriptReso ...

  3. SQL Server 事务、异常

    转自: http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html   事务 在数据库中有时候需要把多个步骤的指令当作一个整 ...

  4. C++ 简单的入门语法

    入门的hello world using namespace std; 是使用命名空间,有点像java里面的引入包main 方法和java一样是主入口,有且只有一个,因为是int ,所以还必须返回一个 ...

  5. 传统的log4j实战

    /** * */ package log4j; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator ...

  6. Building Local Unit Tests

    If your unit test has no dependencies or only has simple dependencies on Android, you should run you ...

  7. SQL Server 的远程连接(转载)

    SQL Server默认是不允许远程连接的,如果想要在本地用SSMS连接远程服务器上的SQLServer2012数据库,需要确认以下环节: 1)如果是工作组环境,则需要使用SQL Server身份验证 ...

  8. php验证是否为手机端还是PC

    <?php $forasp = strtolower($_SERVER['HTTP_USER_AGENT']); if(strpos($forasp,'mobile')==true) { ech ...

  9. cas的url中去掉jsessionid

    Servlet3.0规范中的<tracking-mode>允许你定义JSESSIONID是存储在cookie中还是URL参数中.如果会话ID存储在URL中,那么它可能会被无意的存储 在多个 ...

  10. 【POJ2266】【树状数组+离散化】Ultra-QuickSort

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...