/// <summary>
 /// 初始化角色的插槽和附件信息
 /// </summary>
 /// <param name="successfulCallBack">Successful call back.</param>
 /// <param name="failCallBack">Fail call back.</param>
 public void SpineInitRoleSlotAttachment(RoleAnaimationData animationData, SkeletonAnimation skeletonAnim, RoleEquipmentData tempData, CombineTextureData combineTextureData, Dictionary <int, List <string> > TempSlotAttachmentDic, List <Texture2D> destoryTextureList, Action <bool> setRoleStatus, bool isTP, bool isHide, Action <string> failCallBack = null)
 {
     if (null != setRoleStatus && isHide)
     {
         setRoleStatus.Invoke(false);
     }
     if (null != combineTextureData.initRoleCoroutine)
     {
         GameManager.Instance.StopCoroutine(combineTextureData.initRoleCoroutine);
     }
     combineTextureData.initRoleCoroutine = GameManager.Instance.StartCoroutine(spineChangeCoreLogic.InitRoleEquipment(animationData, skeletonAnim, tempData, combineTextureData, TempSlotAttachmentDic, destoryTextureList, setRoleStatus, failCallBack, isTP));
 }
Ejemplo n.º 2
0
 /// <summary>
 /// 初始化角色的插槽附件
 /// </summary>
 /// <returns><c>true</c>, if role slot attachment info was inited, <c>false</c> otherwise.</returns>
 public System.Collections.IEnumerator InitRoleEquipment(RoleAnaimationData animationData, SkeletonAnimation skeletonAnim, RoleEquipmentData tempData, CombineTextureData combineTextureData, Dictionary <int, List <string> > TempSlotAttachmentDic, List <Texture2D> destoryTextureList, Action <bool> setRoleStatus, Action <string> failCallBack, bool isTP)
 {
     if (skeletonAnim == null)
     {
         if (null != failCallBack)
         {
             failCallBack.Invoke("<-初始化角色的插槽和附件信息失败->");
         }
         yield break;
     }
     System.DateTime time1 = System.DateTime.Now;
     for (int i = 0; i < tempData.RoleEquipmentItems.Count; i++)
     {
         // if(tempData.RoleEquipmentItems[i].EquipmentType == RoleEquipmentType.RoleHat || tempData.RoleEquipmentItems[i].EquipmentType == RoleEquipmentType.RoleGlasses)
         //     continue;
         EquipmentRes res = SpineChangeDataLogic.Instance.GetRoleEquipmentObject(tempData.RoleEquipmentItems[i], null);
         while (!res.isDone)
         {
             yield return(null);
         }
         combineTextureData.changeRoleCoroutine = GameManager.Instance.StartCoroutine(Change(animationData, skeletonAnim, combineTextureData, TempSlotAttachmentDic, res.GetRes(), isTP, destoryTextureList, setRoleStatus, failCallBack, true));
         yield return(combineTextureData.changeRoleCoroutine);
     }
     System.DateTime time2 = System.DateTime.Now;
     if (null != GameObject.FindObjectOfType <ChangeTest> ())
     {
         GameObject.FindObjectOfType <ChangeTest> ().text.text += "创建角色并初始化用时:" + (time2 - time1).TotalMilliseconds + "\n";
     }
     if (null != roleObject)
     {
         setRoleStatus.Invoke(true);
     }
     if (isTP)
     {
         //需要合图集
         UpdateRoleEquipment(skeletonAnim, combineTextureData);
     }
     else
     {
         DestroyResources(combineTextureData);
     }
 }
 /// <summary>
 /// 角色换装
 /// </summary>
 /// <param name="slotStr">Slot string.</param>
 /// <param name="texture2D">Texture2 d.</param>
 /// <param name="successfulCallBack">Successful call back.</param>
 /// <param name="failCallBack">Fail call back.</param>
 public void SpineRoleChange(RoleAnaimationData animationData, SkeletonAnimation skeletonAnim, CombineTextureData combineTextureData, Dictionary <int, List <string> > slotAttachmentDic, RoleEquipmentData equipmentData, RoleEquipmentItem equipmentItem, bool isTexturePackaged, List <Texture2D> destoryTextureList, Action <bool> setRoleStatus, Action <string> failCallBack = null)
 {
     if (null != setRoleStatus)
     {
         setRoleStatus.Invoke(false);
     }
     System.DateTime time1 = System.DateTime.Now;
     SpineChangeDataLogic.Instance.GetRoleEquipmentObject(equipmentItem, (UnityEngine.Object o) => {
         //SpineChangeDataLogic.Instance.SaveRoleEquipmentToServerAndLocal (equipmentData, equipmentItem);
         if (null != combineTextureData.changeRoleCoroutine)
         {
             GameManager.Instance.StopCoroutine(combineTextureData.changeRoleCoroutine);
         }
         combineTextureData.changeRoleCoroutine = GameManager.Instance.StartCoroutine(spineChangeCoreLogic.Change(animationData, skeletonAnim, combineTextureData, slotAttachmentDic, o as EquipmentObject, isTexturePackaged, destoryTextureList, setRoleStatus, failCallBack));
         System.DateTime time2 = System.DateTime.Now;
         if (null != GameObject.FindObjectOfType <ChangeTest> ())
         {
             GameObject.FindObjectOfType <ChangeTest> ().text.text += "加载AB用时:" + (time2 - time1).TotalMilliseconds + "\n";
         }
     });
 }
Ejemplo n.º 4
0
        /// <summary>
        /// 换装
        /// </summary>
        /// <returns>The change.</returns>
        /// <param name="item">装备数据</param>
        public System.Collections.IEnumerator Change(RoleAnaimationData animationData, SkeletonAnimation skeletonAnim, CombineTextureData combineTextureData, Dictionary <int, List <string> > slotAttachmentDic, EquipmentObject eo, bool isTexturePackage, List <Texture2D> destoryTextureList, Action <bool> setRoleStatus, Action <string> failCallBack, bool isCreateInit = false)
        {
            #if UNITY_ANDROID
            destoryTextureList.Add(eo.equipmentTexture_Alpha);
            destoryTextureList.Add(eo.equipmentTexture_RGB);
            #elif UNITY_IPHONE || UNITY_EDITOR
            destoryTextureList.Add(eo.equipmentTexture);
            #endif
            SpineReadJsonDataLogic.Instance.GetSpineJsonObjectDic(eo.equipmentJsonAsset);
            List <AtlasRegion>     regions = SpineChangeDataLogic.Instance.GetEquipmentAtlasRegions(eo, SpineChangeDataLogic.Instance.GetEquipmentMaterial());
            List <string>          slotAttachmentNameList = new List <string> ();
            List <AtlasRegionData> sortData = SpineCreateAttachment.Instance.GetSortRegionList(skeletonAnim, regions, slotAttachmentDic);
            //更换皮肤数据里面的Attachment字典KeyValuePair<Skin.AttachmentKeyTuple, Attachment >(换成我们自己创建的)
            for (int i = 0; i < sortData.Count; i++)
            {
                // List<int> slotIndexList = GetSlotListForSlotAttachmentDic (slotAttachmentDic, regions[i].name);
                // for (int j = 0; j < slotIndexList.Count; j++) {
                //     Attachment tempattachment = GetAttachmentByType (skeletonAnim, SpineChangeDataLogic.Instance.GetAttachmentType (skeletonAnim, slotIndexList[j] + "|" + regions[i].name), slotIndexList[j] + "|" + regions[i].name, regions[i]);
                //     if (null == tempattachment) {
                //         yield return null;
                //     }
                //     skeletonAnim.Skeleton.Data.DefaultSkin.AddAttachment (slotIndexList[j], regions[i].name, tempattachment);
                //     slotAttachmentNameList.Add (SpineChangeCoreLogic.Instance.GetSlotNameBySlotIndex (skeletonAnim, slotIndexList[j]) + "$" + tempattachment.Name);
                // }
                Attachment tempattachment = GetAttachmentByType(skeletonAnim, sortData[i].type, sortData[i].allName, sortData[i].region);
                if (null == tempattachment)
                {
                    yield return(null);
                }
                skeletonAnim.Skeleton.Data.DefaultSkin.AddAttachment(SpineChangeDataLogic.Instance.GetSlotIndexFromAllAttachmentName(sortData[i].allName), SpineChangeDataLogic.Instance.GetAttachmentFromAllAttachmnetName(sortData[i].allName), tempattachment);
                slotAttachmentNameList.Add(SpineChangeCoreLogic.Instance.GetSlotNameBySlotIndex(skeletonAnim, SpineChangeDataLogic.Instance.GetSlotIndexFromAllAttachmentName(sortData[i].allName)) + "$" + tempattachment.Name);
            }
            //替换完附件之后刷新(有的附件可以不用刷新)
            if (null == skeletonAnim)
            {
                yield break;
            }
            skeletonAnim.Skeleton.SetToSetupPose();
            System.DateTime time1 = System.DateTime.Now;
            //重组Json
            yield return(GameManager.Instance.StartCoroutine(SpineReadJsonDataLogic.Instance.CreateNewRoleJsonDic(animationData, eo.equipmentJsonAsset, slotAttachmentNameList, skeletonAnim, setRoleStatus)));

            yield return(null);

            System.DateTime time2 = System.DateTime.Now;
            if (null != GameObject.FindObjectOfType <ChangeTest> ())
            {
                GameObject.FindObjectOfType <ChangeTest> ().text.text += "重组Json的时间:" + (time2 - time1).TotalMilliseconds + "\n";
            }
            //当不是创建时change的话就判断是否合图集
            if (!isCreateInit)
            {
                if (null != roleObject)
                {
                    setRoleStatus.Invoke(true);
                }
                if (isTexturePackage)
                {
                    UpdateRoleEquipment(skeletonAnim, combineTextureData);
                }
                else
                {
                    DestroyResources(combineTextureData);
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 通过skeletonDataAsset创建角色
        /// </summary>
        /// <returns><c>true</c>, if spine role was created, <c>false</c> otherwise.</returns>
        /// <param name="skeletonDataAsset">Skeleton data asset.</param>
        /// <param name="animationName">Animation name.</param>
        /// <param name="skinName">Skin name.</param>
        /// <param name="pos">Position.</param>
        private System.Collections.IEnumerator Create(SpineAvatarType avatarType, EquipmentObject eo, SkeletonDataAsset skeletonDataAsset, string roleGameObjectName, string animationName, string skinName, bool loop, RoleEquipmentData data, Action <Avatar> createSucCallBack, Action <string> failCallBack, Action <bool> createQueueCallBack, bool isTP)
        {
            if (skeletonDataAsset == null)
            {
                if (failCallBack != null)
                {
                    failCallBack.Invoke("<-创建角色失败->");
                }
                yield break;
            }
            GameObject roleSpine = new GameObject {
                name = roleGameObjectName
            };

            roleObject        = roleSpine;
            skeletonAnimation = SkeletonAnimation.AddToGameObject(roleSpine, skeletonDataAsset);
            skeletonAnimation.Initialize(false);
            skeletonAnimation.Skeleton.SetSkin(skinName);
            skeletonAnimation.state.SetAnimation(SpineConstValue.TrackIndex, animationName, loop);
            CreateSlotAttachmentDic(skeletonAnimation.Skeleton.Data.DefaultSkin.Attachments);
            if (null == data)
            {
                equipmentData = new RoleEquipmentData();
                equipmentData.RoleEquipmentItems = new List <RoleEquipmentItem> ();
            }
            else
            {
                equipmentData = data;
            }
            CombineTextureData combineTextureData = new CombineTextureData();

            combineTextureData.resultData = new CombineFinishedData();
            RoleAnaimationData rad = new RoleAnaimationData {
                roleJsonStr = eo.equipmentJsonAsset.text
            };
            Avatar avatar = new SpineAvatar(equipmentData, skeletonAnimation, slotAttachmentDic, rad, combineTextureData, avatarType, roleObject, eo.equipmentJsonAsset.text);

            combineTextureData.resultData.self = avatar;
            if (createSucCallBack != null)
            {
                if (null != roleSpine)
                {
                    roleSpine.SetActive(false);
                    createSucCallBack.Invoke(avatar);
                }
            }
            //初始化角色的所有服装信息
            if (equipmentData.RoleEquipmentItems.Count > 0)
            {
                if (null != combineTextureData.initRoleCoroutine)
                {
                    GameManager.Instance.StopCoroutine(combineTextureData.initRoleCoroutine);
                }
                combineTextureData.initRoleCoroutine = GameManager.Instance.StartCoroutine(InitRoleEquipment(rad, skeletonAnimation, equipmentData, combineTextureData, slotAttachmentDic, avatar.GetDestoryTextureList, roleSpine.SetActive, null, isTP));
                yield return(combineTextureData.initRoleCoroutine);
            }
            else
            {
                roleSpine.SetActive(true);
            }
            if (null != createQueueCallBack)
            {
                createQueueCallBack.Invoke(true);
            }
        }
Ejemplo n.º 6
0
 public System.Collections.IEnumerator CreateNewRoleJsonDic(RoleAnaimationData animationData, UnityEngine.TextAsset equipmentJson, List <string> slotAttachmentNameList, Spine.Unity.SkeletonAnimation skeletonAnim, Action <bool> setRoleStatus, bool isCreateNewJson = false)
 {
     if (isCreateNewJson)
     {
         #region 注释掉了
         // //重新绑定引用(更换attachment之后顶点动画引用丢失的情况)
         // //1.把当前装备所替换的attachment保存起来,再分别找到各个attachment在当前装备json中的顶点动画数据。
         // //2.把各个attachment的顶点动画数据复制到roleJson中。
         // //3.利用新的roleJson生成新的动画并和新的attachment进行绑定。(可以用litjson插件替换json里面的数据)
         // Dictionary<string, JsonData> dic = new Dictionary<string, JsonData> ();
         // JsonData allDataFromEquipment = JsonMapper.ToObject (equipmentJson.text);
         // JsonData animDataFromEquipment = allDataFromEquipment.TryGetData ("animations");
         // string[] animNamesFromEquipment = new string[animDataFromEquipment.Count];
         // animDataFromEquipment.Keys.CopyTo (animNamesFromEquipment, 0);
         // //1.先从当前装备的json中拿出来
         // for (int i = 0; i < slotAttachmentNameList.Count; i++) {
         //     for (int j = 0; j < animDataFromEquipment.Count; j++) {
         //         JsonData deformData = animDataFromEquipment[j].TryGetData ("deform");
         //         if (null != deformData) {
         //             JsonData slotData = deformData.TryGetData (SpineConstValue.defaultSkinName).TryGetData (slotAttachmentNameList[i].Split ('$') [0]);
         //             if (null != slotData) {
         //                 JsonData attachmentData = slotData.TryGetData (slotAttachmentNameList[i].Split ('$') [1]);
         //                 dic.Add (animNamesFromEquipment[j] + "$deform$" + SpineConstValue.defaultSkinName + "$" + slotAttachmentNameList[i].Split ('$') [0] + "$" + slotAttachmentNameList[i].Split ('$') [1], attachmentData);
         //             }
         //         }
         //         yield return null;
         //     }
         // }
         // //2.重新组装到roleJson中
         // JsonData allDataFromRoleJson = JsonMapper.ToObject (animationData.roleJsonStr);
         // foreach (KeyValuePair<string, JsonData> keyValue in dic) {
         //     JsonData animsData = allDataFromRoleJson.TryGetData ("animations");
         //     string[] keys = keyValue.Key.Split ('$');
         //     int length = keys.Length;
         //     if (null != animsData) {
         //         for (int i = 0; i < length; i++) {
         //             animsData = animsData.TryGetData (keys[i]);
         //             if (null != animsData) {
         //                 if (i >= length - 1) {
         //                     string newJsonStr = keyValue.Value.ToJson ().Substring (1, keyValue.Value.ToJson ().Length - 2);
         //                     animsData.Add (JsonMapper.ToObject (newJsonStr));
         //                     yield return null;
         //                 }
         //                 continue;
         //             } else {
         //                 break;
         //             }
         //         }
         //     }
         // }
         // //3.刷新json
         // animationData.roleJsonStr = allDataFromRoleJson.ToJson ().ToString ();
         #endregion
         skeletonAnim.skeleton.data.animations.Clear(true);
         this.animationData          = animationData;
         this.equipmentJson          = equipmentJson.text;
         this.slotAttachmentNameList = slotAttachmentNameList;
         this.skeletonAnim           = skeletonAnim;
         this.setRoleStatus          = setRoleStatus;
         thread = new System.Threading.Thread(new System.Threading.ThreadStart(CopyJsonData));
         thread.IsBackground = false;
         thread.Start();
         while (!isFinshedThread)
         {
             yield return(null);
         }
         var input = new StringReader(this.animationData.roleJsonStr);
         Dictionary <String, System.Object> tempDic = GetDictionaryTypeObject((Json.Deserialize(input) as Dictionary <String, Object>) ["animations"]);
         if (null != tempDic)
         {
             foreach (KeyValuePair <string, System.Object> entry in tempDic)
             {
                 try {
                     SpineCreateAttachment.Instance.ReadAnimation((Dictionary <string, System.Object>)entry.Value, entry.Key, skeletonAnim.Skeleton.Data);
                 } catch (Exception e) {
                     throw new Exception("Error reading animation: " + entry.Key, e);
                 }
             }
             skeletonAnim.AnimationState.SetAnimation(SpineConstValue.TrackIndex, skeletonAnim.AnimationState.GetCurrent(SpineConstValue.TrackIndex).animation.name, true);
         }
     }
 }