public static GameObject buildSceleton( string name, SpineData data, int pixelsPerUnit, float zStep, out Dictionary<string, GameObject> boneGOByName, out Dictionary<string, Slot> slotByName )
        {
            float ratio = 1.0f / (float)pixelsPerUnit;
            boneGOByName = new Dictionary<string, GameObject>();
            slotByName = new Dictionary<string, Slot>();
            GameObject rootGO = new GameObject(name);
            foreach(SpineBone bone in data.bones){
                GameObject go = new GameObject(bone.name);
                boneGOByName.Add(bone.name, go);
            }

            foreach(SpineBone bone in data.bones){
                GameObject go = boneGOByName[bone.name];
                if (bone.parent == null)
                    go.transform.parent = rootGO.transform;
                else
                    go.transform.parent = boneGOByName[bone.parent].transform;

                Vector3    position = new Vector3((float)bone.x * ratio, (float)bone.y * ratio, 0.0f);
                Vector3    scale    = new Vector3((float)bone.scaleX, (float)bone.scaleY, 1.0f);
                Quaternion rotation = Quaternion.Euler(0, 0, (float)bone.rotation);
                go.transform.localPosition = position;
                go.transform.localScale    = scale;
                go.transform.localRotation = rotation;
            }

            foreach(SpineSlot spineSlot in data.slots){
                GameObject go = new GameObject(getSlotGOName(spineSlot.name));
                go.transform.parent = boneGOByName[spineSlot.bone].transform;
                resetLocalTRS(go);
                int drawOrder = data.slotOrder[ spineSlot.name ];
                go.transform.localPosition = new Vector3( 0, 0, (- drawOrder ) * zStep );
                Slot slot = new Slot();
                slot.bone = spineSlot.bone;
                slot.name = spineSlot.name;
                slot.color = hexStringToColor32(spineSlot.color);
                slot.gameObject = go;
                slot.defaultAttachmentName = spineSlot.attachment;
                slotByName.Add(slot.name, slot);
            }
            return rootGO;
        }
        public static SkinController addSkinController(GameObject gameObject, SpineData spineData, List<Skin> allSkins, Dictionary<string, Slot> slotByName)
        {
            SkinController sk = gameObject.AddComponent<SkinController>();
            List<Skin> skins = new List<Skin>();
            Skin defaultSkin = null;
            foreach(Skin skin in allSkins){
                if (skin.name.Equals("default")){
                    defaultSkin = skin;
                } else {
                    skins.Add(skin);
                }
            }
            sk.defaultSkin = defaultSkin;
            sk.skins = skins.ToArray();

            Slot[] slots = new Slot[slotByName.Count];
            slotByName.Values.CopyTo(slots,0);
            sk.slots = slots;
            return sk;
        }