(以后,参考链接和作者将在文章首部给出,转载请保留此部分内容)

  参考链接:http://www.narkii.com/club/thread-299977-1.html,作者:纳金网 比巴卜;

  参考链接:http://game.ceeger.com/forum/read.php?tid=2852,作者:Unity圣典论坛 kuku小夭

  动态添加和删除Sprite可以在很多地方用到,这里以实现显示技能CD时间来为例,CD的时间是以sprite来显示的,当然CD时间以文本显示更为合理,这里只是作为例子说明。

1、使用NGUI创建一个按钮,按钮的显示样子的修改可以参考:http://www.cnblogs.com/vitah/p/3855982.html,效果如下:

  其中CDSprite是用来实现技能CD时技能阴影效果的sprite,可以参考:http://www.cnblogs.com/vitah/p/3861031.html

2、接下来通过动态添加sprite实现技能的CD时间的显示:

  首先把显示的数字图片导入到Altas中,新建了一个altas,可以在右下角看到导入的数字图片:

3、点击按钮时动态添加数字的sprite,代码如下:

using UnityEngine;
using System.Collections; public class SkillCDTimeSprite : MonoBehaviour
{
public string[] _sprite_name = {
"num_0","num_1", "num_2", "num_3", "num_4",
"num_5", "num_6", "num_7", "num_8", "num_9"
}; // 技能是否處於CD狀態
public bool _skill_is_cd;
public float _cd_time ; UISprite _cd_sprite;
UIAtlas _altas;
GameObject _skill_btn; // Use this for initialization
void Start()
{
// cd时间初始化
_cd_time = 3f; // 找到对应的altas
_altas = (UIAtlas)Resources.Load("Prefabs/MyTest", typeof(UIAtlas)); // CD阴影效果sprite初始化
_cd_sprite = GameObject.Find("UI Root/Camera/SkillButton/CDSprite").GetComponent<UISprite>();
// 按钮初始化
_skill_btn = GameObject.Find("UI Root/Camera/SkillButton");
} // Update is called once per frame
void Update()
{
if ( _skill_is_cd )
{
float time = _cd_time * _cd_sprite.fillAmount;
time -= Time.deltaTime; // 更新cd和cd时间的sprite
_skill_is_cd = UpdateCDSprite(_cd_time, time, _skill_btn, "CDSprite");
}
} void OnClick()
{
if (_skill_is_cd)
{
Debug.Log("技能CD");
}
else
{
Debug.Log("施放技能");
_skill_is_cd = true;
_cd_sprite.fillAmount = ; // 在按钮下面创建sprite
UISprite time_sprite = NGUITools.AddSprite(_skill_btn, _altas, _sprite_name[(int)_cd_time+]);
time_sprite.height = ;
time_sprite.width = ;
}
} bool UpdateCDSprite(float cd_time, float time_left, GameObject btn, string sprite_name)
{
// 获取btn按钮下cd的sprite
UISprite cd_sprite = btn.transform.Find(sprite_name).GetComponent<UISprite>();
cd_sprite.fillAmount = time_left / cd_time; // 按钮下的cd时间sprite
UISprite sprite = btn.transform.Find("Sprite").GetComponent<UISprite>(); // 处理剩余时间,显示对应的sprite
if (time_left > )
{
if ((int)time_left < time_left)
sprite.spriteName = _sprite_name[(int)time_left + ];
else
sprite.spriteName = _sprite_name[(int)time_left]; return true;
}
else
{
// 删除CD时间sprite
Destroy(btn.transform.Find("Sprite").gameObject);
cd_sprite.fillAmount = ;
return false;
}
}
}

  代码中都有相应注释,找到关键代码即可轻松实现。

  代码中的_sprite_name字符串数组对应在altas中的各个名称,如下图所示:

4、可以看下运行效果,在技能CD时会显示CD时间的sprite,结束后会自动删除该sprite:

Github上代码

总结:

  1、代码中的按钮和CD阴影的sprite都用代码的方式找寻,其实可以直接在Unity中拖动相应对象到public成员变量,效率应该会更高;

  2、在技能CD状态时,上述代码会在按钮下也就是SkillButton下创建一个名为"Sprite"的sprite,用于显示CD时间,如果把"Sprite"改为自定义名,暂未实现;

  

  

Unity NGUI中动态添加和删除sprite的更多相关文章

  1. JS实现动态添加和删除div

    实现方式一:只在最后一个数据中动态添加或者删除 | 背景需要做一个页面,页面可以输入参数,点击确认按钮可以发请求给某接口.但是接口的某个字段是数组类型,所以在页面上需要实现添加或者删除元素的功能. | ...

  2. Hyperledger Fabric节点的动态添加和删除

    前言 在Hyperledger Fabric组织的动态添加和删除中,我们已经完成了在运行着的网络中动态添加和删除组织.本文将在其基础上,详细介绍了如何在 soft 组织上添加新的 peer2 节点,并 ...

  3. [Flex] Accordion系列-动态添加或删除Accordion容器中项目

    <?xml version="1.0" encoding="utf-8"?> <!--Flex中如何使用addChild()和removeCh ...

  4. 在页面上绘制一张表格,使用 DOM 节点的动态添加和删除向表格中插入数据,点击表格每行后的“删除”超链接

    查看本章节 查看作业目录 需求说明: 在页面上绘制一张表格,使用 DOM 节点的动态添加和删除向表格中插入数据,点击表格每行后的"删除"超链接,使用 DOM 节点的删除操作将对应的 ...

  5. Lua中如何实现类似gdb的断点调试—09支持动态添加和删除断点

    前面已经支持了几种不同的方式添加断点,但是必须事先在代码中添加断点,在使用上不是那么灵活方便.本文将支持动态增删断点,只需要开一开始引入调试库即可,后续可以在调试过程中动态的添加和删除断点.事不宜迟, ...

  6. 插件~使用ECharts动态在地图上标识点~动态添加和删除标识点

    之前写过一个Echarts的文章,没有基础的同学可以先看这<上一篇>,对于一个地图和说,我们在初始化之后,你可能被在地图上标识出一些点,当然这根据你的业务去标识,而如果每次更新数据都加载全 ...

  7. Android 在程序中动态添加 View 布局或控件

    有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...

  8. VC中动态添加控件

    VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...

  9. jquery 动态添加和删除 ul li列表

    今天需要实现一个jquery动态添加和删除  ul li列表中的li行,自己简单的实现乐一个,分享一下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

随机推荐

  1. QTableWidget的使用和美工总结

    基本外观设置 FriendTable->setFrameShape(QFrame::NoFrame);  //设置边框 FriendTable->setHorizontalHeaderLa ...

  2. jQuery日期联动插件

    此版本为网上的日期联动插件修改版,加入了修改后事件 /* * jQuery Date Selector Plugin * 日期联动选择插件 * * Demo: $("#calendar&qu ...

  3. iOS获取健康步数从加速计到healthkit

    计步模块接触了一年多,最近又改需求了,所以又换了全新的统计步数的方法,整理一下吧. 在iPhone5s以前机型因为没有陀螺仪的存在,所以需要用加速度传感器来采集加速度值信息,然后根据震动幅度让其加入踩 ...

  4. RHEL7安装配置TigerVNC

    TigerVNC使用非加密的链接,默认会被firewalld blocked 掉,想要 vnc正常工作就需要让firewalld开放相应的端口才行. vnc默认的端口号为5900,而每个vnc win ...

  5. [原创] SQLite数据库使用清单(下)

    上文两章对SQLite的功能.语法.和操作进行了介绍,本文讲解SQLite的一些高级语法和操作. 3.

  6. .NET 4.6

    http://referencesource.microsoft.com/ DownLoad 下载原代码

  7. 那些常用的eclipse快捷键

    用了很久的eclipse了,有些快捷键常用,有的偶尔使用,现在记下常用的快捷键,以便大家和自己查用(持续更新) 这些快捷键都可以在[window]-[preferences]-[general]-[k ...

  8. 九、C# 合式类型

    本章要描述如何最终完善类型声明.   1.重写Ojbect中的成员   重写ToString() 默认情况下,在任何对象上调用 ToString()会返回类的完全限定名称,所以有时候需要重载这个函数, ...

  9. VC++读取资源中文件

    //查找目标资源 HRSRC hResource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MAINPROG), TEXT(& ...

  10. POJ 3468.A Simple Problem with Integers 解题报告

    用树状数组和线段树会比较简单,这里用这道题来学习Splay. 第一次写,代码比较丑 /* 初始化添加一个key值足够大的结点 保证每个需要的结点都有后继 */ #include <iostrea ...