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"改為自定義名,暫未實現;

 

 

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM