unity spine动态换肤
在unity导入spine后,spine中是有一个换肤的函数的
public void SetSkin(Skin newSkin) {if (newSkin == skin)return;if (newSkin != null) {if (skin != null)newSkin.AttachAll(this, skin);else {ExposedList slots = this.slots;for (int i = 0, n = slots.Count; i < n; i++) {Slot slot = slots.Items[i];string name = slot.data.attachmentName;if (name != null) {Attachment attachment = newSkin.GetAttachment(i, name);if (attachment != null)slot.Attachment = attachment;}}}}skin = newSkin;UpdateCache();}
但这函数仅支持一套一套的换肤, 例如一个角色有默认皮肤,红色皮肤,蓝色皮肤,绿色皮肤,用自带的方法,我们只能从这4个皮肤里面选择一个。
如果当我们想要红色的头发,蓝色的衣服,绿色的裤子,自带的方法是不支持的。
实现办法
new 一个newskin皮肤,然后通过获得红色皮肤的头发部位,然后把次部分的数据,应用到newskin上,同理获取蓝色皮肤的衣服,绿色皮肤的裤子,同时应用到newskin上。
这一系列操作有点像少年包青天里面,干尸案里面的移花接木。
代码如下
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Spine;
using Spine.Unity;
using Spine.Unity.AttachmentTools;
using UnityEngine;public class SkinCtrl : MonoBehaviour {// Start is called before the first frame updateprivate SkeletonAnimation _skeletonAnimation;private Skeleton _skeleton;public void Start() {_skeletonAnimation = GetComponent();_skeleton = _skeletonAnimation.skeleton;UpdateSkin(SkinShop.GetMySkinData());}Dictionary testSkin = new Dictionary() { //{ SKinSlot.hair, 1 }, //{ SKinSlot.cloth, 2 }, //{ SKinSlot.trousers, 4 },};static List skinNames = new List() {"Normal","1","2","3","4",};//含有换肤的slotstatic List slotNames = new List() {"hair","shirt","sleeve_L","sleeve_R","leg_L","leg_R"};static List attachNames = new List() {"S_Hair","S_Shirt","S_Sleeve_L","S_Sleeve_R","S_leg_L","S_leg_R"};//attack对应的皮肤部位static Dictionary attach2SkinSlotDict = new Dictionary { //{ "S_Hair", SKinSlot.hair },{ "S_Shirt", SKinSlot.cloth },{ "S_Sleeve_L", SKinSlot.cloth },{ "S_Sleeve_R", SKinSlot.cloth },{ "S_leg_L", SKinSlot.trousers },{ "S_leg_R", SKinSlot.trousers },};Skin dynamicSkin = null;public void UpdateSkin(Dictionary skinData) {if (dynamicSkin == null) {dynamicSkin = new Skin("dynamicSkin");}dynamicSkin.AddAttachments(_skeleton.Data.DefaultSkin);string targetSkinName = skinNames[0];string targetSlotName = "";string targetAttachName = "";int skinID = 0;SKinSlot skSlot = SKinSlot.hair;if (dynamicSkin != null) {ExposedList slots = _skeleton.Slots;for (int k = 0; k < slotNames.Count; k++) {targetSlotName = slotNames[k];targetAttachName = attachNames[k];skSlot = GetAttackSkinSlot(targetAttachName);skinID = skinData[skSlot];targetSkinName = skinNames[skinID];for (int i = 0, n = slots.Count; i < n; i++) {Slot slot = slots.Items[i];if (slot.Data.Name != targetSlotName)continue;string attachName = slot.Data.AttachmentName;if (attachName != null) {Attachment attachment;if (attachName == targetAttachName) {attachment = GetAttachment(i, targetAttachName, targetSkinName); // 重写L GetdynamicSkin.SetAttachment(i, targetAttachName, attachment);if (attachment != null) {slot.Attachment = attachment;}} else {}}}}_skeleton.Skin = dynamicSkin;_skeleton.UpdateCache();}}public static SKinSlot GetAttackSkinSlot(string attachName) {if (attach2SkinSlotDict.ContainsKey(attachName)) {return attach2SkinSlotDict[attachName];} else {return SKinSlot.hair;}}public Attachment GetAttachment(int slotIndex, string slotName, string skinName) {var targetSkin = _skeleton.Data.FindSkin(skinName);Attachment attachment;attachment = targetSkin.GetAttachment(slotIndex, slotName);return attachment;}}public enum SKinSlot {hair,cloth,trousers
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
