unity 如何动态生成sprite

2015年01月25日 13:49 0 点赞 0 评论 更新于 2020-01-16 15:26

在 Unity 中动态生成 Sprite 是一个常见的需求,下面我们通过具体的代码示例来详细讲解实现过程。

using UnityEngine;
using System.Collections;

public class SkillCDTimeSprite : MonoBehaviour
{
// 定义 Sprite 名称数组,用于表示数字 0 - 9
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;
// 技能 CD 时间
public float _cd_time;
// CD 阴影效果的 Sprite
UISprite _cd_sprite;
// UI 图集
UIAtlas _altas;
// 技能按钮 GameObject
GameObject _skill_btn;

// 初始化方法,在脚本实例被启用时调用
void Start()
{
// 初始化 CD 时间为 3 秒
_cd_time = 3f;
// 从资源中加载指定的 UI 图集
_altas = (UIAtlas)Resources.Load("Prefabs/MyTest", typeof(UIAtlas));
// 查找并获取 CD 阴影效果的 Sprite 组件
_cd_sprite = GameObject.Find("UI Root/Camera/SkillButton/CDSprite").GetComponent<UISprite>();
// 查找并获取技能按钮的 GameObject
_skill_btn = GameObject.Find("UI Root/Camera/SkillButton");
}

// 每帧更新方法
void Update()
{
if (_skill_is_cd)
{
// 计算当前剩余的 CD 时间
float time = _cd_time * _cd_sprite.fillAmount;
time -= Time.deltaTime;
// 更新 CD 和 CD 时间的 Sprite,并获取技能是否还处于 CD 状态
_skill_is_cd = UpdateCDSprite(_cd_time, time, _skill_btn, "CDSprite");
}
}

// 按钮点击事件处理方法
void OnClick()
{
if (_skill_is_cd)
{
// 技能处于 CD 状态时,输出日志
Debug.Log("技能 CD");
}
else
{
// 技能不在 CD 状态时,输出日志并开始 CD
Debug.Log("施放技能");
_skill_is_cd = true;
// 重置 CD 阴影效果的填充量
_cd_sprite.fillAmount = 1;
// 在按钮下面创建表示 CD 时间的 Sprite
UISprite time_sprite = NGUITools.AddSprite(_skill_btn, _altas, _sprite_name[(int)_cd_time + 1]);
// 设置 Sprite 的高度
time_sprite.height = 25;
// 设置 Sprite 的宽度
time_sprite.width = 18;
}
}

// 更新 CD Sprite 的方法
bool UpdateCDSprite(float cd_time, float time_left, GameObject btn, string sprite_name)
{
// 获取按钮下 CD 阴影效果的 Sprite 组件
UISprite cd_sprite = btn.transform.Find(sprite_name).GetComponent<UISprite>();
// 根据剩余时间更新 CD 阴影效果的填充量
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
sprite.spriteName = _sprite_name[(int)time_left + 1];
}
else
{
// 如果剩余时间是整数,显示对应的 Sprite
sprite.spriteName = _sprite_name[(int)time_left];
}
return true;
}
else
{
// 剩余时间为 0,技能 CD 结束
return false;
}
}
}

代码解释

  1. 变量定义

    • _sprite_name:存储表示数字 0 - 9 的 Sprite 名称。
    • _skill_is_cd:用于标记技能是否处于 CD 状态。
    • _cd_time:技能的 CD 时间。
    • _cd_sprite:CD 阴影效果的 Sprite 组件。
    • _altas:UI 图集。
    • _skill_btn:技能按钮的 GameObject。
  2. Start 方法

    • 初始化 CD 时间。
    • 加载 UI 图集。
    • 查找并获取 CD 阴影效果的 Sprite 组件和技能按钮的 GameObject。
  3. Update 方法

    • 当技能处于 CD 状态时,计算剩余时间并调用 UpdateCDSprite 方法更新 CD 和 CD 时间的 Sprite。
  4. OnClick 方法

    • 处理技能按钮的点击事件。
    • 如果技能处于 CD 状态,输出日志。
    • 如果技能不在 CD 状态,输出日志,开始 CD,并在按钮下面创建表示 CD 时间的 Sprite。
  5. UpdateCDSprite 方法

    • 根据剩余时间更新 CD 阴影效果的填充量。
    • 根据剩余时间显示对应的表示 CD 时间的 Sprite。
    • 如果剩余时间大于 0,返回 true,表示技能还处于 CD 状态;否则返回 false,表示技能 CD 结束。

通过以上代码,我们可以在 Unity 中实现动态生成 Sprite 来显示技能的 CD 时间。

作者信息

feifeila

feifeila

共发布了 570 篇文章