zoukankan      html  css  js  c++  java
  • Unity NGUI中动态添加和删除sprite

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

      参考链接: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"改为自定义名,暂未实现;

      

      

  • 相关阅读:
    IIS下 多站点 利用虚拟目录 访问共用(图片)文件夹
    [转]Prevent opening multiple windows in ASP.NET
    [转]使用 WebForms ReportViewer 控件
    ALTER TABLE ADD 增加多个字段 外键约束
    获取数据库内某时间点后修改的存储过程
    SQL Server 示例数据库 AdventureWorks 数据字典
    [转]MVC 3.0 在各个版本IIS中的部署
    [转]使用jQuery.ajax傳送物件陣列給ASP.NET MVC
    [转]报表统计(sql面试题)
    扑克游戏 – 打联手
  • 原文地址:https://www.cnblogs.com/vitah/p/3897664.html
Copyright © 2011-2022 走看看