void Start() { atlas = atlasAsset.GetAtlas(); this.skeletonRenderer = GetComponent <SkeletonRenderer>(); AtlasAttachmentLoader loader = new AtlasAttachmentLoader(atlas); float scaleMultiplier = skeletonRenderer.skeletonDataAsset.scale; var enumerator = attachments.GetEnumerator(); while (enumerator.MoveNext()) { var entry = (SlotRegionPair)enumerator.Current; var regionAttachment = loader.NewRegionAttachment(null, entry.region, entry.region); regionAttachment.Width = regionAttachment.RegionOriginalWidth * scaleMultiplier; regionAttachment.Height = regionAttachment.RegionOriginalHeight * scaleMultiplier; regionAttachment.SetColor(new Color(1, 1, 1, 1)); regionAttachment.UpdateOffset(); var slot = this.skeletonRenderer.skeleton.FindSlot(entry.slot); slot.Attachment = regionAttachment; } }
public void ChangeWeapon(AtlasAsset atlasAsset, SkeletonRenderer skeletonRenderer, string slotname, string spritename) { AtlasAttachmentLoader loader = new AtlasAttachmentLoader(atlasAsset.GetAtlas()); float scaleMultiplier = skeletonRenderer.skeletonDataAsset.scale; var regionAttachment = loader.NewRegionAttachment(null, slotname, spritename); regionAttachment.Width = regionAttachment.RegionOriginalWidth * scaleMultiplier; regionAttachment.Height = regionAttachment.RegionOriginalHeight * scaleMultiplier; regionAttachment.SetColor(new Color(1, 1, 1, 1)); regionAttachment.UpdateOffset(); var slot = skeletonRenderer.skeleton.FindSlot(slotname); slot.Attachment = regionAttachment; }
static void Main(string[] args) { #region Copy With Args Console.WriteLine("Spine Binary to Json Start."); if (args.Length > 0) { _BoneName = args[0]; Console.WriteLine(args[0]); } else { Console.WriteLine("Default: 22 "); } Console.ReadKey(); #endregion // Creat SkelData SkeletonData skeletonData; try { TextureLoader textureLoader = new DemoLoader(); Atlas atlas = new Atlas(_BoneName + ".atlas", textureLoader); AtlasAttachmentLoader attachmentLoader = new AtlasAttachmentLoader(atlas); SkeletonBinary skeletonBinary = new SkeletonBinary(attachmentLoader); skeletonData = skeletonBinary.ReadSkeletonData(_BoneName + ".skel"); }catch (Exception) { Console.WriteLine("File Read Error."); Console.ReadKey(); return; } // Test the SkelData. Console.WriteLine("The spine version: \t" + skeletonData.Version); Console.WriteLine("The bones name: \t" + skeletonData.Name); Console.WriteLine("Find the Animation: \t" + skeletonData.FindAnimation("attack").Name); #region JSON File Create // Takes the skeletonData and converts it into a serializable object Dictionary <string, object> jsonFile = SkelDataConverter.FromSkeletonData(skeletonData); //convert object to json string for storing JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); string json = jsonSerializer.Serialize(jsonFile); File.WriteAllText(_BoneName + ".json", json); #endregion Console.WriteLine("Json File Create Successfully."); Console.ReadKey(); }
void LoadSkeleton(string spine_path, string atlas_path) { var spineFullPath = System.IO.Path.GetFullPath(spine_path); var atlasFullPath = System.IO.Path.GetFullPath(atlas_path); var aLoader = new ResourceTextureLoader(); atlas = new Atlas(atlasFullPath, aLoader); //var mLoader = new ResourceAttachmentLoader(atlas); var mLoader = new AtlasAttachmentLoader(atlas); //SkeletonData mSkeletonData; if (spineFullPath.ToLower().EndsWith(".skel") || spineFullPath.ToLower().EndsWith(".skel.txt")) { var skel = new SkeletonBinary(mLoader); mSkeletonData = skel.ReadSkeletonData(spineFullPath); } else { var json = new SkeletonJson(mLoader); mSkeletonData = json.ReadSkeletonData(spineFullPath); } skeleton = new Skeleton(mSkeletonData); skeletonAnimation = new AnimationState(new AnimationStateData(mSkeletonData)); skeletonAnimation.SetAnimation(0, mSkeletonData.Animations.ElementAt(0), true); skeleton.SetToSetupPose(); /* Add animation list */ toolStripDropDownButton1.DropDownItems.Clear(); foreach (var a in mSkeletonData.Animations) { var item = toolStripDropDownButton1.DropDownItems.Add(a.Name); item.Click += OnSelectAnimation; } /* Update 30 fps */ timer1.Interval = 1000 / 30; timer1.Start(); Center = new Point(Width / 2, Height / 2); this.Text = "Spine Runtime Windows Forms - " + mSkeletonData.Version; }
private void OpenFileBtn_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog() { DefaultExt = "skel", Filter = "Spine二进制模型文件|*.skel", CheckFileExists = true, Title = "选择文件", RestoreDirectory = true }; if (ofd.ShowDialog() == DialogResult.OK) { string[] tmp = ofd.FileName.Replace(".skel", "").Split('\\'); fileName = ofd.FileName; fileNameArray = ofd.FileName.Split('\\'); if (ofd.FileName.IndexOf(":") < 0) { return; } Label1.Text = $"选择了: {fileName}"; Label2.Text = "正在加载文件信息"; } else { MessageBox.Show("未选择文件,退出修改", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } try { TextureLoader textureLoader = new Empty(); Atlas atlas = new Atlas(fileName.Replace(".skel", "") + ".atlas", textureLoader); AtlasAttachmentLoader attachmentLoader = new AtlasAttachmentLoader(atlas); SkeletonBinary skeletonBinary = new SkeletonBinary(attachmentLoader); skeletonData = skeletonBinary.ReadSkeletonData(fileName); } catch (Exception er) { MessageBox.Show(er.ToString(), "出错了", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Label2.Text = $"模型名: {skeletonData.Name}, \n版本: {skeletonData.Version}, \n宽: {skeletonData.Width}, \n高: {skeletonData.Height}\n骨骼数: {skeletonData.Bones.Count}\n动画数: {skeletonData.Animations.Count}"; ExportBtn.Enabled = true; }
private void Apply(SkeletonRenderer skeletonRenderer) { this.atlas = this.atlasAsset.GetAtlas(); AtlasAttachmentLoader atlasAttachmentLoader = new AtlasAttachmentLoader(new Atlas[] { this.atlas }); float scale = skeletonRenderer.skeletonDataAsset.scale; foreach (object obj in this.attachments) { SlotRegionPair slotRegionPair = (SlotRegionPair)obj; RegionAttachment regionAttachment = atlasAttachmentLoader.NewRegionAttachment(null, slotRegionPair.region, slotRegionPair.region); regionAttachment.Width = regionAttachment.RegionOriginalWidth * scale; regionAttachment.Height = regionAttachment.RegionOriginalHeight * scale; regionAttachment.SetColor(new Color(1f, 1f, 1f, 1f)); regionAttachment.UpdateOffset(); Slot slot = skeletonRenderer.skeleton.FindSlot(slotRegionPair.slot); slot.Attachment = regionAttachment; } }
private void Apply(SkeletonRenderer skeletonRenderer) { this.atlas = this.atlasAsset.GetAtlas(); AtlasAttachmentLoader atlasAttachmentLoader = new AtlasAttachmentLoader(new Atlas[] { this.atlas }); float scale = skeletonRenderer.skeletonDataAsset.scale; IEnumerator enumerator = this.attachments.GetEnumerator(); while (enumerator.MoveNext()) { AtlasRegionAttacher.SlotRegionPair slotRegionPair = (AtlasRegionAttacher.SlotRegionPair)enumerator.get_Current(); RegionAttachment regionAttachment = atlasAttachmentLoader.NewRegionAttachment(null, slotRegionPair.region, slotRegionPair.region); regionAttachment.Width = regionAttachment.RegionOriginalWidth * scale; regionAttachment.Height = regionAttachment.RegionOriginalHeight * scale; regionAttachment.SetColor(new Color(1f, 1f, 1f, 1f)); regionAttachment.UpdateOffset(); Slot slot = skeletonRenderer.skeleton.FindSlot(slotRegionPair.slot); slot.Attachment = regionAttachment; } }
public SkeletonData GetSkeletonData(bool quiet) { if (skeletonJSON == null) { if (!quiet) { UnityEngine.Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + base.name, this); } Clear(); return(null); } if (skeletonData != null) { return(skeletonData); } Atlas[] atlasArray = GetAtlasArray(); AttachmentLoader attachmentLoader = new AtlasAttachmentLoader(atlasArray); float num = scale; bool flag = skeletonJSON.name.ToLower().Contains(".skel"); SkeletonData sd; try { sd = ((!flag) ? ReadSkeletonData(skeletonJSON.text, attachmentLoader, num) : ReadSkeletonData(skeletonJSON.bytes, attachmentLoader, num)); } catch (Exception ex) { if (!quiet) { UnityEngine.Debug.LogError("Error reading skeleton JSON file for SkeletonData asset: " + base.name + "\n" + ex.Message + "\n" + ex.StackTrace, this); } return(null); } InitializeWithData(sd); return(skeletonData); }
public SkeletonData GetSkeletonData(bool quiet) { if (atlasAssets == null) { atlasAssets = new AtlasAsset[0]; if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } Reset(); return(null); } if (skeletonJSON == null) { if (!quiet) { Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); } Reset(); return(null); } #if !SPINE_TK2D if (atlasAssets.Length == 0) { Reset(); return(null); } #else if (atlasAssets.Length == 0 && spriteCollection == null) { Reset(); return(null); } #endif Atlas[] atlasArr = new Atlas[atlasAssets.Length]; for (int i = 0; i < atlasAssets.Length; i++) { if (atlasAssets[i] == null) { Reset(); return(null); } atlasArr[i] = atlasAssets[i].GetAtlas(); if (atlasArr[i] == null) { Reset(); return(null); } } if (skeletonData != null) { return(skeletonData); } AttachmentLoader attachmentLoader; float skeletonDataScale; #if !SPINE_TK2D attachmentLoader = new AtlasAttachmentLoader(atlasArr); skeletonDataScale = scale; #else if (spriteCollection != null) { attachmentLoader = new Spine.Unity.TK2D.SpriteCollectionAttachmentLoader(spriteCollection); skeletonDataScale = (1.0f / (spriteCollection.invOrthoSize * spriteCollection.halfTargetHeight) * scale); } else { if (atlasArr.Length == 0) { Reset(); if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } return(null); } attachmentLoader = new AtlasAttachmentLoader(atlasArr); skeletonDataScale = scale; } #endif try { //var stopwatch = new System.Diagnostics.Stopwatch(); if (skeletonJSON.name.ToLower().Contains(".skel")) { var input = new MemoryStream(skeletonJSON.bytes); var binary = new SkeletonBinary(attachmentLoader); binary.Scale = skeletonDataScale; //stopwatch.Start(); skeletonData = binary.ReadSkeletonData(input); } else { var input = new StringReader(skeletonJSON.text); var json = new SkeletonJson(attachmentLoader); json.Scale = skeletonDataScale; //stopwatch.Start(); skeletonData = json.ReadSkeletonData(input); } //stopwatch.Stop(); //Debug.Log(stopwatch.Elapsed); } catch (Exception ex) { if (!quiet) { Debug.LogError("Error reading skeleton JSON file for SkeletonData asset: " + name + "\n" + ex.Message + "\n" + ex.StackTrace, this); } return(null); } stateData = new AnimationStateData(skeletonData); FillStateData(); return(skeletonData); }
/// <summary>Loads, caches and returns the SkeletonData from the skeleton data file. Returns the cached SkeletonData after the first time it is called. Pass false to prevent direct errors from being logged.</summary> public SkeletonData GetSkeletonData(bool quiet) { if (skeletonJSON == null) { if (!quiet) { Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); } Clear(); return(null); } // Disabled to support attachmentless/skinless SkeletonData. // if (atlasAssets == null) { // atlasAssets = new AtlasAsset[0]; // if (!quiet) // Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); // Clear(); // return null; // } // #if !SPINE_TK2D // if (atlasAssets.Length == 0) { // Clear(); // return null; // } // #else // if (atlasAssets.Length == 0 && spriteCollection == null) { // Clear(); // return null; // } // #endif if (skeletonData != null) { return(skeletonData); } AttachmentLoader attachmentLoader; float skeletonDataScale; Atlas[] atlasArray = this.GetAtlasArray(); #if !SPINE_TK2D attachmentLoader = (atlasArray.Length == 0) ? (AttachmentLoader) new RegionlessAttachmentLoader() : (AttachmentLoader) new AtlasAttachmentLoader(atlasArray); skeletonDataScale = scale; #else if (spriteCollection != null) { attachmentLoader = new Spine.Unity.TK2D.SpriteCollectionAttachmentLoader(spriteCollection); skeletonDataScale = (1.0f / (spriteCollection.invOrthoSize * spriteCollection.halfTargetHeight) * scale); } else { if (atlasArray.Length == 0) { Reset(); if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } return(null); } attachmentLoader = new AtlasAttachmentLoader(atlasArray); skeletonDataScale = scale; } #endif bool hasBinaryExtension = skeletonJSON.name.ToLower().Contains(".skel"); SkeletonData loadedSkeletonData = null; try { if (hasBinaryExtension) { loadedSkeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.bytes, attachmentLoader, skeletonDataScale); } else { loadedSkeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.text, attachmentLoader, skeletonDataScale); } } catch (Exception ex) { if (!quiet) { Debug.LogError("Error reading skeleton JSON file for SkeletonData asset: " + name + "\n" + ex.Message + "\n" + ex.StackTrace, skeletonJSON); } } #if UNITY_EDITOR if (loadedSkeletonData == null && !quiet && skeletonJSON != null) { string problemDescription = null; bool isSpineSkeletonData; SkeletonDataCompatibility.VersionInfo fileVersion = SkeletonDataCompatibility.GetVersionInfo(skeletonJSON, out isSpineSkeletonData, ref problemDescription); if (problemDescription != null) { if (!quiet) { Debug.LogError(problemDescription, skeletonJSON); } return(null); } CompatibilityProblemInfo compatibilityProblemInfo = SkeletonDataCompatibility.GetCompatibilityProblemInfo(fileVersion); if (compatibilityProblemInfo != null) { SkeletonDataCompatibility.DisplayCompatibilityProblem(compatibilityProblemInfo.DescriptionString(), skeletonJSON); return(null); } } #endif if (loadedSkeletonData == null) { return(null); } if (skeletonDataModifiers != null) { foreach (var modifier in skeletonDataModifiers) { if (modifier != null && !(isUpgradingBlendModeMaterials && modifier is BlendModeMaterialsAsset)) { modifier.Apply(loadedSkeletonData); } } } if (!isUpgradingBlendModeMaterials) { blendModeMaterials.ApplyMaterials(loadedSkeletonData); } this.InitializeWithData(loadedSkeletonData); return(skeletonData); }
public SkeletonData GetSkeletonData(bool quiet) { if (skeletonJSON == null) { if (!quiet) { Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); } Clear(); return(null); } // Support attachmentless/skinless SkeletonData. // if (atlasAssets == null) { // atlasAssets = new AtlasAsset[0]; // if (!quiet) // Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); // Clear(); // return null; // } // #if !SPINE_TK2D // if (atlasAssets.Length == 0) { // Clear(); // return null; // } // #else // if (atlasAssets.Length == 0 && spriteCollection == null) { // Clear(); // return null; // } // #endif if (skeletonData != null) { return(skeletonData); } AttachmentLoader attachmentLoader; float skeletonDataScale; Atlas[] atlasArray = this.GetAtlasArray(); #if !SPINE_TK2D attachmentLoader = new AtlasAttachmentLoader(atlasArray); skeletonDataScale = scale; #else if (spriteCollection != null) { attachmentLoader = new Spine.Unity.TK2D.SpriteCollectionAttachmentLoader(spriteCollection); skeletonDataScale = (1.0f / (spriteCollection.invOrthoSize * spriteCollection.halfTargetHeight) * scale); } else { if (atlasArray.Length == 0) { Reset(); if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } return(null); } attachmentLoader = new AtlasAttachmentLoader(atlasArray); skeletonDataScale = scale; } #endif bool isBinary = skeletonJSON.name.ToLower().Contains(".skel"); SkeletonData loadedSkeletonData; try { if (isBinary) { loadedSkeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.bytes, attachmentLoader, skeletonDataScale); } else { loadedSkeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.text, attachmentLoader, skeletonDataScale); } } catch (Exception ex) { if (!quiet) { Debug.LogError("Error reading skeleton JSON file for SkeletonData asset: " + name + "\n" + ex.Message + "\n" + ex.StackTrace, this); } return(null); } this.InitializeWithData(loadedSkeletonData); return(skeletonData); }
/// <summary> /// 主要逻辑copy SkeletonJson.ReadAttachment /// </summary> /// <param name="sdEX"></param> /// <param name="atlasArray"></param> /// <returns></returns> public Skin GenSkinBySkniDataAsset(SkinDataEx sdEX, Atlas[] atlasArray) { #if SPINE_TK2D throw new NotImplementedException("GenSkinBySkniDataAsset Not Implemented"); #endif float scale = this.skeletonDataAsset.scale; var attachmentLoader = new AtlasAttachmentLoader(atlasArray); var skin = new Skin(sdEX.SkinName); var linkedMeshes = new List <SkeletonJson.LinkedMesh>(); Attachment attachment = null; foreach (var slot in sdEX.AllSlots) { var slotIndex = skeleton.Data.FindSlotIndex(slot.SlotName); foreach (var entry in slot.AllAttachments) { switch (entry.type) { case AttachmentType.Region: { RegionAttachment region = attachmentLoader.NewRegionAttachment(skin, entry.AttachmentName, entry.PathName); if (region == null) { Debug.LogError("RegionAttachment New Fail:" + entry.AttachmentName + "," + entry.PathName); continue; } region.Path = entry.PathName; #region Region数据的填充 CheckRegionData(entry.FloatValues); Single w = 32, h = 32; foreach (var f in entry.FloatValues) { switch (f.Key) { case "x": region.x = f.FloatValue * scale; break; case "y": region.y = f.FloatValue * scale; break; case "scaleX": region.scaleX = f.FloatValue; break; case "scaleY": region.scaleY = f.FloatValue; break; case "rotation": region.rotation = f.FloatValue; break; case "width": w = f.FloatValue; break; case "height": h = f.FloatValue; break; } } region.width = w * scale; region.height = h * scale; if (entry.ColorValues != null && entry.ColorValues.Count > 0) { foreach (var c in entry.ColorValues) { switch (c.Key) { case "color": region.r = c.ColorValue.r; region.g = c.ColorValue.g; region.b = c.ColorValue.b; region.a = c.ColorValue.a; break; } } } #endregion region.UpdateOffset(); attachment = region; } break; case AttachmentType.Boundingbox: { BoundingBoxAttachment box = attachmentLoader.NewBoundingBoxAttachment(skin, entry.AttachmentName); if (box == null) { Debug.LogError("BoundingBoxAttachment New Fail:" + entry.AttachmentName); continue; } #region Box数据填充 Int32 vertexCount = 0; if (entry.IntValues != null && entry.IntValues.Count > 0) { foreach (var i in entry.IntValues) { if (i.Key.Equals("vertexCount")) { vertexCount = i.IntValue; break; } } } foreach (var fs in entry.FloatArrayValues) { if (fs.Key.Equals("vertices")) { ReadVertices(fs, box, vertexCount << 1, scale); break; } } #endregion attachment = box; } break; case AttachmentType.Mesh: case AttachmentType.Linkedmesh: { MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, entry.AttachmentName, entry.PathName); if (mesh == null) { Debug.LogError("MeshAttachment New Fail:" + entry.AttachmentName + "," + entry.PathName); continue; } #region Mesh数据填充 mesh.Path = entry.PathName; if (entry.ColorValues != null && entry.ColorValues.Count > 0) { foreach (var c in entry.ColorValues) { if (c.Key.Equals("color")) { mesh.r = c.ColorValue.r; mesh.g = c.ColorValue.g; mesh.b = c.ColorValue.b; mesh.a = c.ColorValue.a; break; } } } Single w = 0, h = 0; foreach (var f in entry.FloatValues) { switch (f.Key) { case "width": w = f.FloatValue * scale; break; case "height": h = f.FloatValue * scale; break; } } mesh.Width = w; mesh.Height = h; String parentStr = null, skinStr = null; Boolean deform = true; if (entry.StringValues != null && entry.StringValues.Count > 0) { foreach (var ss in entry.StringValues) { switch (ss.Key) { case "parent": parentStr = ss.StringValue; break; case "skin": skinStr = ss.StringValue; break; } } } if (entry.BoolValues != null && entry.BoolValues.Count > 0) { foreach (var b in entry.BoolValues) { if (b.Key.Equals("deform")) { deform = b.BooleanValue; break; } } } if (parentStr != null) { mesh.InheritDeform = deform; linkedMeshes.Add(new SkeletonJson.LinkedMesh(mesh, skinStr, slotIndex, parentStr)); } KeyFloatArrayPair kfap_Vs = new KeyFloatArrayPair(); Single[] uvs = null; foreach (var fs in entry.FloatArrayValues) { switch (fs.Key) { case "vertices": kfap_Vs = fs; break; case "uvs": uvs = fs.FloatArrayValue.ToArray(); break; } } ReadVertices(kfap_Vs, mesh, uvs.Length, scale); Int32[] triangles = null, edges = null; if (entry.IntArrayValues != null && entry.IntArrayValues.Count > 0) { foreach (var i32s in entry.IntArrayValues) { switch (i32s.Key) { case "triangles": triangles = i32s.IntArrayValue.ToArray(); break; case "edges": edges = i32s.IntArrayValue.ToArray(); break; } } } mesh.triangles = triangles; mesh.regionUVs = uvs; mesh.UpdateUVs(); Int32 hull = 0; if (entry.IntValues != null && entry.IntValues.Count > 0) { foreach (var i in entry.IntValues) { if (i.Key.Equals("hull")) { hull = i.IntValue * 2; break; } } } if (hull != 0) { mesh.HullLength = hull; } if (edges != null) { mesh.Edges = edges; } #endregion attachment = mesh; } break; case AttachmentType.Path: { PathAttachment pathAttachment = attachmentLoader.NewPathAttachment(skin, entry.AttachmentName); if (pathAttachment == null) { Debug.LogError("PathAttachment New Fail:" + entry.AttachmentName); continue; } #region Path填充数据 Boolean closed = false, constantSpeed = false; if (entry.BoolValues != null && entry.BoolValues.Count > 0) { foreach (var b in entry.BoolValues) { switch (b.Key) { case "closed": closed = b.BooleanValue; break; case "constantSpeed": constantSpeed = b.BooleanValue; break; } } } pathAttachment.closed = closed; pathAttachment.constantSpeed = constantSpeed; Int32 vertexCount = 0; if (entry.IntValues != null && entry.IntValues.Count > 0) { foreach (var i in entry.IntValues) { if (i.Key.Equals("vertexCount")) { vertexCount = i.IntValue; break; } } } foreach (var fs in entry.FloatArrayValues) { switch (fs.Key) { case "vertices": ReadVertices(fs, pathAttachment, vertexCount << 1, scale); break; case "lengths": var count = fs.FloatArrayValue.Count; pathAttachment.lengths = new Single[count]; for (var idx = 0; idx < count; idx++) { pathAttachment.lengths[idx] = fs.FloatArrayValue[idx] * scale; } break; } } #endregion attachment = pathAttachment; } break; case AttachmentType.Point: { PointAttachment point = attachmentLoader.NewPointAttachment(skin, entry.AttachmentName); if (point == null) { Debug.LogError("PointAttachment New Fail:" + entry.AttachmentName); continue; } #region Point填充数据 Single x = 0, y = 0, r = 0; if (entry.FloatValues != null && entry.FloatValues.Count > 0) { foreach (var f in entry.FloatValues) { switch (f.Key) { case "x": x = f.FloatValue * scale; break; case "y": y = f.FloatValue * scale; break; case "rotation": r = f.FloatValue; break; } } } point.x = x; point.y = y; point.rotation = r; #endregion attachment = point; } break; case AttachmentType.Clipping: { ClippingAttachment clip = attachmentLoader.NewClippingAttachment(skin, entry.AttachmentName); if (clip == null) { Debug.LogError("ClippingAttachment New Fail:" + entry.AttachmentName); continue; } #region Clipping填充数据 String end = null; if (entry.StringValues != null && entry.StringValues.Count > 0) { foreach (var s in entry.StringValues) { if (s.Key.Equals("end")) { end = s.StringValue; break; } } } if (end != null) { SlotData sd = skeleton.Data.FindSlot(end); if (sd == null) { throw new Exception("Clipping end slot not found: " + end); } clip.EndSlot = sd; } Int32 vertexCount = 0; if (entry.IntValues != null && entry.IntValues.Count > 0) { foreach (var i in entry.IntValues) { if (i.Key.Equals("vertexCount")) { vertexCount = i.IntValue; break; } } } foreach (var fs in entry.FloatArrayValues) { if (fs.Key.Equals("vertices")) { ReadVertices(fs, clip, vertexCount << 1, scale); break; } } #endregion attachment = clip; } break; default: break; } skin.SetAttachment(slot.SlotName, entry.AttachmentName, attachment, skeleton); } } // Linked meshes. for (int i = 0, n = linkedMeshes.Count; i < n; i++) { var linkedMesh = linkedMeshes[i]; Skin sk = linkedMesh.skin == null ? skeleton.Data.defaultSkin : skeleton.Data.FindSkin(linkedMesh.skin); if (sk == null) { throw new Exception("Slot not found: " + linkedMesh.skin); } Attachment parent = sk.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent); if (parent == null) { throw new Exception("Parent mesh not found: " + linkedMesh.parent); } linkedMesh.mesh.ParentMesh = (MeshAttachment)parent; linkedMesh.mesh.UpdateUVs(); } skeleton.Data.Skins.Add(skin); return(skin); }
public SkeletonData GetSkeletonData(bool quiet) { if (atlasAssets == null) { atlasAssets = new AtlasAsset[0]; if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } Reset(); return(null); } if (skeletonJSON == null) { if (!quiet) { Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); } Reset(); return(null); } #if !SPINE_TK2D if (atlasAssets.Length == 0) { Reset(); return(null); } #else if (atlasAssets.Length == 0 && spriteCollection == null) { Reset(); return(null); } #endif Atlas[] atlasArr = new Atlas[atlasAssets.Length]; for (int i = 0; i < atlasAssets.Length; i++) { if (atlasAssets[i] == null) { Reset(); return(null); } atlasArr[i] = atlasAssets[i].GetAtlas(); if (atlasArr[i] == null) { Reset(); return(null); } } if (skeletonData != null) { return(skeletonData); } #if UNITY_EDITOR || !RELEASE var stopwatch = System.Diagnostics.Stopwatch.StartNew(); bool isBinary = false; #endif AttachmentLoader attachmentLoader; float skeletonDataScale; #if !SPINE_TK2D attachmentLoader = new AtlasAttachmentLoader(atlasArr); skeletonDataScale = scale; #else if (spriteCollection != null) { attachmentLoader = new SpriteCollectionAttachmentLoader(spriteCollection); skeletonDataScale = (1.0f / (spriteCollection.invOrthoSize * spriteCollection.halfTargetHeight) * scale) * 100f; } else { if (atlasArr.Length == 0) { Reset(); if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } return(null); } attachmentLoader = new AtlasAttachmentLoader(atlasArr); skeletonDataScale = scale; } #endif try { if (skeletonJSON.name.ToLower().Contains(".skel")) { #if UNITY_EDITOR || !RELEASE isBinary = true; #endif var input = new MemoryStream(skeletonJSON.bytes); var binary = new SkeletonBinary(attachmentLoader); binary.Scale = skeletonDataScale; skeletonData = binary.ReadSkeletonData(input); } else { // tsteil - added this error Debug.LogError("Spine animation using json text, it should use binary! " + name); var input = new StringReader(skeletonJSON.text); var json = new SkeletonJson(attachmentLoader); json.Scale = skeletonDataScale; skeletonData = json.ReadSkeletonData(input); } } catch (Exception ex) { if (!quiet) { Debug.LogError("Error reading skeleton JSON file for SkeletonData asset: " + name + "\n" + ex.Message + "\n" + ex.StackTrace, this); } return(null); } stateData = new AnimationStateData(skeletonData); FillStateData(); #if UNITY_EDITOR || !RELEASE // tsteil - added some perf tracking stopwatch.Stop(); if (isBinary == false) { Debug.LogWarning(string.Format("Spine SkeletonDataAsset: {0} ({2}) created in {1:N4} seconds.", name, stopwatch.Elapsed.TotalSeconds, isBinary ? "binary" : "text")); } #endif return(skeletonData); }
public SkeletonData GetSkeletonData(bool quiet) { if (this.atlasAssets == null) { this.atlasAssets = new AtlasAsset[0]; if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + base.get_name(), this); } this.Reset(); return(null); } if (this.skeletonJSON == null) { if (!quiet) { Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + base.get_name(), this); } this.Reset(); return(null); } if (this.atlasAssets.Length == 0) { this.Reset(); return(null); } Atlas[] array = new Atlas[this.atlasAssets.Length]; for (int i = 0; i < this.atlasAssets.Length; i++) { if (this.atlasAssets[i] == null) { this.Reset(); return(null); } array[i] = this.atlasAssets[i].GetAtlas(); if (array[i] == null) { this.Reset(); return(null); } } if (this.skeletonData != null) { return(this.skeletonData); } AttachmentLoader attachmentLoader = new AtlasAttachmentLoader(array); float num = this.scale; try { if (this.skeletonJSON.get_name().ToLower().Contains(".skel")) { MemoryStream input = new MemoryStream(this.skeletonJSON.get_bytes()); this.skeletonData = new SkeletonBinary(attachmentLoader) { Scale = num }.ReadSkeletonData(input); } else { StringReader reader = new StringReader(this.skeletonJSON.get_text()); this.skeletonData = new SkeletonJson(attachmentLoader) { Scale = num }.ReadSkeletonData(reader); } } catch (Exception ex) { if (!quiet) { Debug.LogError(string.Concat(new string[] { "Error reading skeleton JSON file for SkeletonData asset: ", base.get_name(), "\n", ex.get_Message(), "\n", ex.get_StackTrace() }), this); } return(null); } this.stateData = new AnimationStateData(this.skeletonData); this.FillStateData(); return(this.skeletonData); }
public SkeletonData GetSkeletonData(bool quiet) { if (this.atlasAssets == null) { this.atlasAssets = new AtlasAsset[0]; if (!quiet) { } this.Reset(); return(null); } if (this.skeletonJSON == null) { if (!quiet) { } this.Reset(); return(null); } if (this.atlasAssets.Length == 0) { this.Reset(); return(null); } Atlas[] array = new Atlas[this.atlasAssets.Length]; for (int i = 0; i < this.atlasAssets.Length; i++) { if (this.atlasAssets[i] == null) { this.Reset(); return(null); } array[i] = this.atlasAssets[i].GetAtlas(); if (array[i] == null) { this.Reset(); return(null); } } if (this.skeletonData != null) { return(this.skeletonData); } AttachmentLoader attachmentLoader = new AtlasAttachmentLoader(array); float num = this.scale; try { if (this.skeletonJSON.name.ToLower().Contains(".skel")) { MemoryStream input = new MemoryStream(this.skeletonJSON.bytes); this.skeletonData = new SkeletonBinary(attachmentLoader) { Scale = num }.ReadSkeletonData(input); } else { StringReader reader = new StringReader(this.skeletonJSON.text); this.skeletonData = new SkeletonJson(attachmentLoader) { Scale = num }.ReadSkeletonData(reader); } } catch (Exception ex) { if (!quiet) { } return(null); } this.stateData = new AnimationStateData(this.skeletonData); this.FillStateData(); return(this.skeletonData); }
public SkeletonData GetSkeletonData(bool quiet) { if (atlasAssets == null) { atlasAssets = new AtlasAsset[0]; if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } Clear(); return(null); } if (skeletonJSON == null) { if (!quiet) { Debug.LogError("Skeleton JSON file not set for SkeletonData asset: " + name, this); } Clear(); return(null); } #if !SPINE_TK2D if (atlasAssets.Length == 0) { Clear(); return(null); } #else if (atlasAssets.Length == 0 && spriteCollection == null) { Reset(); return(null); } #endif Atlas[] atlasArr = new Atlas[atlasAssets.Length]; for (int i = 0; i < atlasAssets.Length; i++) { if (atlasAssets[i] == null) { Clear(); return(null); } atlasArr[i] = atlasAssets[i].GetAtlas(); if (atlasArr[i] == null) { Clear(); return(null); } } if (skeletonData != null) { return(skeletonData); } AttachmentLoader attachmentLoader; float skeletonDataScale; #if !SPINE_TK2D attachmentLoader = new AtlasAttachmentLoader(atlasArr); skeletonDataScale = scale; #else if (spriteCollection != null) { attachmentLoader = new Spine.Unity.TK2D.SpriteCollectionAttachmentLoader(spriteCollection); skeletonDataScale = (1.0f / (spriteCollection.invOrthoSize * spriteCollection.halfTargetHeight) * scale); } else { if (atlasArr.Length == 0) { Reset(); if (!quiet) { Debug.LogError("Atlas not set for SkeletonData asset: " + name, this); } return(null); } attachmentLoader = new AtlasAttachmentLoader(atlasArr); skeletonDataScale = scale; } #endif bool isBinary = skeletonJSON.name.ToLower().Contains(".skel"); try { if (isBinary) { skeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.bytes, attachmentLoader, skeletonDataScale); } else { skeletonData = SkeletonDataAsset.ReadSkeletonData(skeletonJSON.text, attachmentLoader, skeletonDataScale); } } catch (Exception ex) { if (!quiet) { Debug.LogError("Error reading skeleton JSON file for SkeletonData asset: " + name + "\n" + ex.Message + "\n" + ex.StackTrace, this); } return(null); } stateData = new AnimationStateData(skeletonData); FillStateData(); return(skeletonData); }