Unity NGUI中动态添加和删除sprite

转自:http://www.cnblogs.com/vitah/p/3897664.html

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

  参考链接: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 = 1;

            // 在按钮下面创建sprite
            UISprite time_sprite = NGUITools.AddSprite(_skill_btn, _altas, _sprite_name[(int)_cd_time+1]);
            time_sprite.height = 25;
            time_sprite.width = 18;
        }
    }

    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 > 0)
        {
            if ((int)time_left < time_left)
                sprite.spriteName = _sprite_name[(int)time_left + 1];
            else
                sprite.spriteName = _sprite_name[(int)time_left];

            return true;
        }
        else
        {
            // 删除CD时间sprite
            Destroy(btn.transform.Find("Sprite").gameObject);
            cd_sprite.fillAmount = 0;
            return false;
        }
    }
}

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

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

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

Github上代码

总结:

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

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

  

时间: 2024-10-20 08:28:27

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

用NGUI动态添加和删除Sprite

using UnityEngine;using System.Collections; public class NGUI_button : MonoBehaviour { public UIButton button1;       public UIButton button2; void Start () {                    UIButton exe1=button1.GetComponent<UIButton>();//获取组件的方式    UIButton ex

hadoop集群 动态添加或删除节点

在运行中的ambari hadoop集中中动态添加或删除节点 1. 下线hdfs节点 1) 下线datanode namenode节点上dfs.exclude文件,看配置文件怎么配置的,里每行添加一个服务器名,如我要下线server7,server8,server9,则如下: server7 server8 备注: 如果hdfs-site.xml没有找到dfs.hosts.exclude,那么就手动把下面内容加入到hdfs-site.xml中,然后把需要Decommission的机器写到文件/e

RecyclerView动态添加、删除及点击事件

上一节讲解了RecyclerView的三种显示方式,本节将主要研究一下RecyclerView的动态添加.删除及其单击和长按事件的处理.我们在上一节代码的基础上进行相关操作. 一.修改适配器类MyAdapter,加入添加和删除这两个方法: public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private Context context; private List<String>

一个Spring Scheduler (Quartz) 动态添加,删除,修改任务的例子

要求 根据任务清单执行不定数量,不定频率的定时任务.并且需要动态添加,删除,修改任务. 代码 public class JobExample {      public static void main(String[] args) throws Exception {         // Job的配置信息,可以从数据库或配置文件中获取         List<JobParameter> list = new ArrayList<JobParameter>();        

jQuery如何动态添加具有删除按钮的行

jQuery如何动态添加具有删除按钮的行:在实际用中,如果要操作表格的话,那最多的莫过于添加和删除行的操作,一般情况下,动态添加的行也可以动态删除,下面就简单介绍一下如何实现此操作,虽然比较简单,但是还是希望能够或多或少能够给需要的朋友带来一定的帮助.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author"

js动态添加和删除标签

html代码 <h1>动态添加和删除标签</h1> <div id="addTagTest"> <table> <thead><tr><th>姓名</th><th>年薪</th><th>操作</th></tr></thead> <tbody id="info"> </tbody>

vue中动态添加div

知识点:vue中动态添加div节点,点击添加,动态生成div,点击删除,删除对应的div,其中数组的长度是动态改变的,如在from表单中应用,直接在提交方法中,获得list,获取所填的元素即可 效果: 核心代码说明(样式代码可自行修改,详细代码请参照源码): <div v-for="(v,i) in list"> <div class="form-group m-form__group row" style="padding-top: 1

android 在布局中动态添加控件

第一步 Java代码 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 Java代码 final LinearLayout lin = (LinearLayout) findViewById(R.id.LinearLayout01); 第三步:获取需要添加的布局(控件) Java代码 LinearLayout layout = (LinearLayout) inflater.inflate( R

Android 在布局容器中动态添加控件

这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉已有的控件 3.使用,来个小demo就明白了 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save