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;
}
}
}
代码解释
变量定义:
_sprite_name:存储表示数字 0 - 9 的 Sprite 名称。_skill_is_cd:用于标记技能是否处于 CD 状态。_cd_time:技能的 CD 时间。_cd_sprite:CD 阴影效果的 Sprite 组件。_altas:UI 图集。_skill_btn:技能按钮的 GameObject。
Start 方法:
- 初始化 CD 时间。
- 加载 UI 图集。
- 查找并获取 CD 阴影效果的 Sprite 组件和技能按钮的 GameObject。
Update 方法:
- 当技能处于 CD 状态时,计算剩余时间并调用
UpdateCDSprite方法更新 CD 和 CD 时间的 Sprite。
- 当技能处于 CD 状态时,计算剩余时间并调用
OnClick 方法:
- 处理技能按钮的点击事件。
- 如果技能处于 CD 状态,输出日志。
- 如果技能不在 CD 状态,输出日志,开始 CD,并在按钮下面创建表示 CD 时间的 Sprite。
UpdateCDSprite 方法:
- 根据剩余时间更新 CD 阴影效果的填充量。
- 根据剩余时间显示对应的表示 CD 时间的 Sprite。
- 如果剩余时间大于 0,返回
true,表示技能还处于 CD 状态;否则返回false,表示技能 CD 结束。
通过以上代码,我们可以在 Unity 中实现动态生成 Sprite 来显示技能的 CD 时间。