NGUI支持TexturePacker导出有旋转的Sprite,无需Transform旋转版本
2016-10-18 15:49
736 查看
在 ulua&tolua技术交流群①中群号 341746602,有位大神分析了一份让NGUI图集支持旋转sprite的技术帖子。
传送门:http://www.maosongliang.com/archives/324?bsh_bid=1506423853
近几天潜心研究了下,发现一个很蛋疼问题。第一点sprite渲染出来不是旋转好的,虽然大神写了自动旋转的代码,但是遇到旋转之后的Sprite当一个旋转节点的子节点的时候,出了各种问题。同时遇到Anchor自适应的时候也是各种搞。
于是想到一个解决方案,基于绘制区域的选择,而不是基于transform
贴上c#代码(利用ulua群中毛松亮大神的代码之处仍然保留其注释)
读取配置部分
UISpriteData.cs
UIBasicSprite.cs
UISprite.cs
传送门:http://www.maosongliang.com/archives/324?bsh_bid=1506423853
近几天潜心研究了下,发现一个很蛋疼问题。第一点sprite渲染出来不是旋转好的,虽然大神写了自动旋转的代码,但是遇到旋转之后的Sprite当一个旋转节点的子节点的时候,出了各种问题。同时遇到Anchor自适应的时候也是各种搞。
于是想到一个解决方案,基于绘制区域的选择,而不是基于transform
贴上c#代码(利用ulua群中毛松亮大神的代码之处仍然保留其注释)
读取配置部分
UISpriteData.cs
// [Modify] by maosongliang, begin public bool rotated = false; // [Modify] by maosongliang, endNGUIJson.cs
static void LoadSpriteData (UIAtlas atlas, Hashtable decodedHash) { if (decodedHash == null || atlas == null) return; List<UISpriteData> oldSprites = atlas.spriteList; atlas.spriteList = new List<UISpriteData>(); Hashtable frames = (Hashtable)decodedHash["frames"]; foreach (System.Collections.DictionaryEntry item in frames) { UISpriteData newSprite = new UISpriteData(); newSprite.name = item.Key.ToString(); bool exists = false; // Check to see if this sprite exists foreach (UISpriteData oldSprite in oldSprites) { if (oldSprite.name.Equals(newSprite.name, StringComparison.OrdinalIgnoreCase)) { exists = true; break; } } // Get rid of the extension if the sprite doesn't exist // The extension is kept for backwards compatibility so it's still possible to update older atlases. if (!exists) { newSprite.name = newSprite.name.Replace(".png", ""); newSprite.name = newSprite.name.Replace(".tga", ""); } // Extract the info we need from the TexturePacker json file, mainly uvRect and size Hashtable table = (Hashtable)item.Value; Hashtable frame = (Hashtable)table["frame"]; int frameX = int.Parse(frame["x"].ToString()); int frameY = int.Parse(frame["y"].ToString()); int frameW = int.Parse(frame["w"].ToString()); int frameH = int.Parse(frame["h"].ToString()); // [Modify] by maosongliang, begin // Read the rotation value newSprite.rotated = (bool)table["rotated"]; // [Modify] by maosongliang, end newSprite.x = frameX; newSprite.y = frameY; newSprite.width = frameW; newSprite.height = frameH; // Support for trimmed sprites Hashtable sourceSize = (Hashtable)table["sourceSize"]; Hashtable spriteSize = (Hashtable)table["spriteSourceSize"]; if (spriteSize != null && sourceSize != null) { // TODO: Account for rotated sprites if (frameW > 0) { int spriteX = int.Parse(spriteSize["x"].ToString()); int spriteW = int.Parse(spriteSize["w"].ToString()); int sourceW = int.Parse(sourceSize["w"].ToString()); newSprite.paddingLeft = spriteX; newSprite.paddingRight = sourceW - (spriteX + spriteW); } if (frameH > 0) { int spriteY = int.Parse(spriteSize["y"].ToString()); int spriteH = int.Parse(spriteSize["h"].ToString()); int sourceH = int.Parse(sourceSize["h"].ToString()); newSprite.paddingTop = spriteY; newSprite.paddingBottom = sourceH - (spriteY + spriteH); } } // [Modify] by maosongliang, begin if (newSprite.rotated) { int temp = newSprite.width; newSprite.width = newSprite.height; newSprite.height = temp; temp = newSprite.paddingLeft; newSprite.paddingLeft = newSprite.paddingTop; newSprite.paddingTop = temp; temp = newSprite.paddingRight; newSprite.paddingRight = newSprite.paddingBottom; newSprite.paddingBottom = temp; } // [Modify] by maosongliang, end // If the sprite was present before, see if we can copy its inner rect foreach (UISpriteData oldSprite in oldSprites) { if (oldSprite.name.Equals(newSprite.name, StringComparison.OrdinalIgnoreCase)) { newSprite.borderLeft = oldSprite.borderLeft; newSprite.borderRight = oldSprite.borderRight; newSprite.borderBottom = oldSprite.borderBottom; newSprite.borderTop = oldSprite.borderTop; } } // Add this new sprite atlas.spriteList.Add(newSprite); } // Sort imported sprites alphabetically atlas.spriteList.Sort(CompareSprites); Debug.Log("Imported " + atlas.spriteList.Count + " sprites"); }
UIBasicSprite.cs
//modify by Amumu begin private Quaternion vertsAngle = Quaternion.Euler(0, 180, -90); protected bool rotated = false; //modify by Amumu end protected void Fill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols, Rect outer, Rect inner) { mOuterUV = outer; mInnerUV = inner; switch (type) { case Type.Simple: SimpleFill(verts, uvs, cols); break; case Type.Sliced: SlicedFill(verts, uvs, cols); break; case Type.Filled: FilledFill(verts, uvs, cols); break; case Type.Tiled: TiledFill(verts, uvs, cols); break; case Type.Advanced: AdvancedFill(verts, uvs, cols); break; } //modify by Amumu begin if (rotated) { Vector4 v = drawingDimensions; float centerX = v.x + v.z; float centerY = v.y + v.w; for (int i = 0; i < verts.size; i++) { Vector3 vert = vertsAngle * verts[i]; vert.x += centerY; vert.y += centerX; verts[i] = vert; } } //modify by Amumu end }
UISprite.cs
public override Vector4 drawingDimensions { get { ..... //modify by Amumu begin if(rotated){ return new Vector4(vw, vx, vy, vz); } else{ return new Vector4(vx, vy, vz, vw); } //modify by Amumu end } } protected void SetAtlasSprite (UISpriteData sp) { mChanged = true; mSpriteSet = true; if (sp != null) { mSprite = sp; mSpriteName = mSprite.name; //modify by Amumu begin rotated = mSprite.rotated; //modify by Amumu end } else { mSpriteName = (mSprite != null) ? mSprite.name : ""; mSprite = sp; } } public override void MakePixelPerfect () { if (!isValid) return; base.MakePixelPerfect(); if (mType == Type.Tiled) return; UISpriteData sp = GetAtlasSprite(); if (sp == null) return; Texture tex = mainTexture; if (tex == null) return; if (mType == Type.Simple || mType == Type.Filled || !sp.hasBorder) { if (tex != null) { int x = Mathf.RoundToInt(pixelSize * (sp.width + sp.paddingLeft + sp.paddingRight)); int y = Mathf.RoundToInt(pixelSize * (sp.height + sp.paddingTop + sp.paddingBottom)); if ((x & 1) == 1) ++x; if ((y & 1) == 1) ++y; //modify by Amumu begin if (mSprite != null && mSprite.rotated) { int tmp = x; x = y; y = tmp; } //modify by Amumu end width = x; height = y; } } }
相关文章推荐
- 【原创作品】爱博QQ邮件搜索机 增强补丁V2.1 (包括试用版邮箱导出补丁) 支持最新版本的 Ver 2.4.0 Build 029
- 1.在cocos2d里面如何使用texture-packer和像素格式来优化spritesheet.html
- IHS配置安全漏洞: 支持不推荐使用的 SSL 版本、在降级的旧加密上填充 Oracle、检测到 RC4 密码套件、支持弱 SSL 密码套件、 重构 RSA 导出键(又称为 FREAK)
- U3D 代码中旋转NGUI中texture
- 让C# Excel导入导出,支持不同版本的Office
- p-unit-0.12版本支持运行JUnit 4.x的test case,无需改动任何代码
- 让C# Excel导入导出,支持不同版本的Office
- 拒绝IE8-,CSS3 transform rotate旋转动画效果(支持IE9+/chrome/firefox)
- 拒绝IE8-,CSS3 transform rotate旋转动画效果(支持IE9+/chrome/firefox)
- texture packer导出的图片程序中拼接有黑边的问题
- Cocos2dx使用 TexturePacker导出的.plist
- Unity插件之NGUI学习(2)—— 创建Texture和Sprite
- Unity3d NGUI的使用(四)(TexturePacker与UIAtlas生成prefabs)
- Java程序实现导出Excel的方法(支持IE低版本)
- [Unity基础]将sprite导出为texture
- 【原创作品】爱博QQ邮件搜索机 注册机 增强补丁V2.2 (包括试用版邮箱导出补丁) 支持最新版本的 Ver 2.5.2 Build 036
- Unity3d NGUI的使用(四)(TexturePacker与UIAtlas生成prefabs)
- Cocos2dx使用 TexturePacker导出的.plist
- 让C# Excel导入导出,支持不同版本的Office
- java利用POI实现Excel导入导出详解-支持97-2013版本以及2017版本