最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
NGUI 制作动态图集
2015年01月16日 10:04
0 点赞
0 评论
更新于 2025-11-21 14:31
下面将放出使用 NGUI 制作动态图集的详细源码。
// 初始化纹理列表
List<Texture2D> textures = new List<Texture2D>();
// 初始化精灵列表
List<UIAtlas.Sprite> sprits = new List<UIAtlas.Sprite>();
// 循环处理每一批次的纹理
for (int i = batch * batchQuantity; i < batchQuantity * (batch + 1); ++i)
{
// 检查是否超出 itemGos 列表的范围
if (i == itemGos.Count)
{
Logger.log("i = " + i + " itemGos = " + itemGos.Count);
break;
}
// 获取 UIFriendItem 组件
UIFriendItem fi = itemGos[i].GetComponent<UIFriendItem>();
// 构建图片的 URL
string tempUrl = facebookGraphURL + "/" + fi.firendId + "/picture?access_token=" + FacebookCenter.instance.GetAccessToken();
// 检查图片是否已缓存
if (WebTextureCache.InstantiateGlobal().ImageCache.ContainsKey(tempUrl))
{
// 检查缓存图片的宽度是否为 50
if (WebTextureCache.InstantiateGlobal().ImageCache[tempUrl].width == 50)
{
// 将缓存的纹理添加到纹理列表中
textures.Add(WebTextureCache.InstantiateGlobal().ImageCache[tempUrl]);
// 创建一个新的精灵
UIAtlas.Sprite sp = new UIAtlas.Sprite();
// 设置精灵的名称
sp.name = fi.firendId;
// 将精灵添加到精灵列表中
sprits.Add(sp);
}
}
}
// 如果纹理列表中有纹理
if (textures.Count > 0)
{
// 加载并添加相框纹理
textures.Add((Texture2D)Resources.Load("Others/photoFrame"));
// 创建相框精灵
UIAtlas.Sprite sp = new UIAtlas.Sprite();
sp.name = "photoFrame";
sprits.Add(sp);
// 创建一个新的图集纹理
Texture2D atlas = new Texture2D(2048, 2048);
// 打包纹理
Rect[] rects = atlas.PackTextures((Texture2D[])textures.ToArray(), 0, 2048);
Logger.log("the length is " + rects.Length);
// 检查纹理矩形数量和精灵数量是否匹配
if (rects.Length != sprits.Count)
{
Logger.log("error!! length not match ");
}
// 处理每个纹理矩形
for (int i = 0; i < rects.Length; ++i)
{
// 将矩形转换为像素坐标
rects[i] = NGUIMath.ConvertToPixels(rects[i], atlas.width, atlas.height, true);
// 设置精灵的内部和外部矩形
sprits[i].inner = rects[i];
sprits[i].outer = rects[i];
}
// 创建一个新的材质
Material mat = new Material(Shader.Find("Unlit/Transparent Colored"));
mat.name = "atlasMat" + batch.ToString();
if (mat.shader == null)
{
Logger.logError("shader is null");
}
// 设置材质的主纹理
mat.mainTexture = atlas;
// 创建一个新的游戏对象
var gameobject = new GameObject("atlasBatch" + batch.ToString());
// 添加 UIAtlas 组件
UIAtlas newAtlas = gameobject.AddComponent<UIAtlas>();
// 设置图集的精灵列表
newAtlas.spriteList = sprits;
// 设置图集的材质
newAtlas.spriteMaterial = mat;
// newAtlas.coordinates = UIAtlas.Coordinates.TexCoords;
Logger.log("successfully build atlas for batch " + batch.ToString());
// Logger.log(newAtlas.spriteMaterial.ToString());
// 将创建的图集添加到已创建图集列表中
createdAtlas.Add(batch, newAtlas);
// 标记该批次已完成
batchCompleted.Add(batch);
// 从处理中的批次列表中移除该批次
batchProcessing.Remove(batch);
}
else
{
// 从处理中的批次列表中移除该批次
batchProcessing.Remove(batch);
Logger.log("picture download failed " + batch.ToString());
}
以上代码实现了使用 NGUI 制作动态图集的功能。首先,代码会从缓存中获取图片纹理,并将其添加到纹理列表中。然后,会加载一个相框纹理并添加到纹理列表。接着,将所有纹理打包到一个大的图集中,并为每个纹理创建对应的精灵。最后,创建一个新的材质和游戏对象,并将图集信息设置到 UIAtlas 组件中。如果纹理下载失败,则会输出相应的错误信息。