/// <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)); }
/// <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"; } }); }
/// <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); } } }
/// <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); } }
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); } } }