1.Spine元素主要包含皮肤(Skin)、骨骼(Bone)、插槽(Slot)、附件(Attachment)、及附件下的图片。

2.而皮肤(Skin)包含了插槽信息、附件信息,如果我们有两套相同构成的皮肤,原理上就可以通过拼装皮肤上的插槽实现局部换肤功能。

3.创建新的Skin 替换槽点下的附件的Sprite,实现动态换皮。

4.Spine 换皮代码:

using System;
using Spine;
using Spine.Unity;
using Spine.Unity.AttachmentTools;
using UnityEngine;/// <summary>
/// 换皮测试
/// </summary>
public class SpineChangeSkin : MonoBehaviour
{private SkeletonAnimation skeletonAnimation;private SkeletonDataAsset skeletonDataAsset;private Material sourceMaterial;private SkeletonData skeletonData;private bool applyPma = true;[SpineSkin] private string templateSkinName;//模板皮肤名称(初始)private Skin equipsSkin;private Skin collectedSkin;#region 优化皮肤用private Material runtimeMaterial;private Texture2D runtimeAtlas;#endregion#region ChangeShin需要的 外部可显示 选择//[SpineSlot] public string slot1; //骨骼槽点//[SpineSkin] public string templateSkin;//[SpineAttachment(skinField: "templateSkin")]//public string templateAttachment;#endregionvoid Start(){skeletonAnimation = GetComponent<SkeletonAnimation>();skeletonDataAsset = skeletonAnimation.SkeletonDataAsset;sourceMaterial = skeletonDataAsset.atlasAssets[0].PrimaryMaterial;skeletonData = skeletonAnimation.Skeleton.Data;ReSetSkin();}private void ReSetSkin(){var skeleton = skeletonAnimation.skeleton;var skin = skeleton.Skin;if (skin == null)templateSkinName = "default";elsetemplateSkinName = skin.Name;equipsSkin = new Skin("Equips");var tSkin = skeletonData.FindSkin(templateSkinName);if (tSkin != null)equipsSkin.AddAttachments(tSkin);skeletonAnimation.Skeleton.Skin = equipsSkin;RefreshSkeletonAttachments();}/// <summary>/// 局部换皮/// </summary>/// <param name="slot">骨骼槽点昵称</param>/// <param name="attachmentName">SpineAttachment 类型 一般和slot名称相同</param>/// <param name="sprite">要更改的贴图[需要开启读写功能]</param>public void ChangeShin(string slot, string attachmentName,Sprite sprite){int slotIndex = skeletonData.FindSlot(slot).Index;//根据骨骼槽点 找到槽点索引Attachment attachment = GenerateAttachment(slotIndex, templateSkinName, attachmentName, sprite);if (attachment == null)return;equipsSkin.SetAttachment(slotIndex, attachmentName, attachment);skeletonAnimation.Skeleton.SetSkin(equipsSkin);RefreshSkeletonAttachments();OptimizeSkin();}private Attachment GenerateAttachment(int slotIndex, string tSkinName, string attachmentName,Sprite sprite){var sData = skeletonDataAsset.GetSkeletonData(true);var tSkin = sData.FindSkin(tSkinName);Attachment tAttachment = tSkin.GetAttachment(slotIndex, attachmentName);if (tAttachment == null){Debug.LogError($"skin {tSkinName} slotIndex {slotIndex} attachmentName {attachmentName} ==》attachment=null");return null;}var attachment = tAttachment?.GetRemappedClone(sprite, sourceMaterial, premultiplyAlpha: this.applyPma);return attachment;}/// <summary>/// 刷新皮肤/// </summary>void RefreshSkeletonAttachments(){skeletonAnimation.Skeleton.SetSlotsToSetupPose();skeletonAnimation.AnimationState.Apply(skeletonAnimation.Skeleton); //skeletonAnimation.Update(0);}/// <summary>/// 优化皮肤 将换过皮肤的贴图 整合到一张贴图中 [人物贴图需要开启读写功能]/// </summary>public void OptimizeSkin(){try{// 1. 收集所有活动皮肤的所有附件。collectedSkin = collectedSkin ?? new Skin("Collected skin");collectedSkin.Clear();collectedSkin.AddAttachments(skeletonAnimation.Skeleton.Data.DefaultSkin);collectedSkin.AddAttachments(equipsSkin);// 2. 创造一个重新包装的皮肤。// 注意:GetRepackedSkin()返回的材质和纹理行为类似于'new Texture2D()',需要销毁if (runtimeMaterial)Destroy(runtimeMaterial);if (runtimeAtlas)Destroy(runtimeAtlas);var repackedSkin = collectedSkin.GetRepackedSkin("Repacked skin",sourceMaterial, out runtimeMaterial,out runtimeAtlas);collectedSkin.Clear();// 3.使用重新包装的皮肤。skeletonAnimation.Skeleton.Skin = repackedSkin;RefreshSkeletonAttachments();}catch (Exception e){Debug.LogError($"OptimizeSkin 异常:{e.Message}");}}
}

5.测试代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;public class Test : MonoBehaviour
{public SpineSkinDate[] array;//换局部皮的Spriteprivate SpineChangeSkin spineChangeSkin;private int index = 0;private void Start(){spineChangeSkin = GetComponent<SpineChangeSkin>();}private void Update(){if (Input.GetKeyDown(KeyCode.A)){if (array == null || array.Length < 1) return;if (index >= array.Length)index = 0;var skinData = array[index];index++;spineChangeSkin?.ChangeShin(skinData.slotName, skinData.attachmentName, skinData.sprite);}}
}
[Serializable]
public struct SpineSkinDate
{public string slotName;public string attachmentName;public Sprite sprite;
}

Unity Spine 局部换皮相关推荐

  1. cocoscreator 中 spine局部换皮

    1 多attachment切换 let goblingirl = this.spine2.findSlot("left-arm");let attachment = gobling ...

  2. cocoscreator中spine局部换皮的探索

    1.需求情况 书之国中需要一个人物捏脸系统,要求可以让用户自由选择身体不同部位的形象,比如头发.眼睛.眉毛.上衣.裤子等.已经支持RegionAttacment和MeshAttachment,而且在r ...

  3. spine 动态换皮功能

    前言: cocos2dx 中spine 的换皮功能是一种静态的方法,也就是在创建 spine 动画的时候就必须将所有的皮肤全部加载,然后在代码中直接换皮,并且这种换皮是整体的切换,对于我们实际开发中这 ...

  4. Spine动画局部换装(切换武器)

    最近在用spine动画做微信小游戏,涉及到角色的武器升级后会切换到另一形态,就研究了一下spine的换装,搜了一些资料发现专门介绍的资料有点少,而且spine官网上说的也不太清楚,好在最后搞出来了,记 ...

  5. laya龙骨换装_分享:Dragonbones/Spine的换肤操作

    目前LayaAir下支持龙骨的局部换肤(根据插槽索引换肤.根据插槽name换肤.纹理换肤.网格换肤).全局换肤 需注意: 1.Dragonbones不支持全局换肤,Spine支持全局换肤 2.使用到I ...

  6. 鸿蒙就是安卓换皮_被喷换皮安卓?华为手机鸿蒙OS Beta版今日上线

    戳上面的蓝字关注我们哦! 千呼万唤始出来,今日(12月16日),华为正式面向开发者发布鸿蒙OS 2.0手机版Beta系统,首批可参加测试的设备有华为P40.P40 Pro.Mate30.Mate30 ...

  7. Egret之龙骨卡槽(slot)换皮

    龙骨的图片是绑定在卡槽上的.并且是一对一的关系.所以可以通过对骨架的卡槽上绑定的图片的更换来实现另一种换皮的效果. 换皮的核心代码: //针对slot设置其新内容private setNewSlot( ...

  8. 木兰编程语言python_国产编程语言木兰换皮Python 中科院重罚当事人

    最近打着中科院计算所出品.完全自主开发旗号的国产编程语言"木兰"引发广泛关注,但很快被发现是基于Python语言套壳.换皮而来的产物.面对质疑,中科院计算所编译实验室员工.&quo ...

  9. 华为鸿蒙被扒出来安卓,华为鸿蒙被“实锤”,操作界面曝光,为何被吐槽是换皮安卓?...

    4月已经进入尾声,但鸿蒙系统的消息最近却变少了,记得此前发布Mate X2的时候,余承东表示要在4月份开始推送鸿蒙系统,Mate X2会成为首批升级机型. 然而目前有不少用户吐槽称,依然还没有等到鸿蒙 ...

最新文章

  1. 数据库MYSQL学习系列二
  2. 简单的尝试Supersampling
  3. java学习(4)--oracle
  4. 携手长江天成转型 谋定·农业大健康-林裕豪:升级山茶油农产品
  5. servlet和jsp中间的交互
  6. python爬虫框架怎么安装_celery如何在python爬虫中安装?
  7. 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机
  8. axi4协议的乱序_一篇文章读懂读透FPGA AXI4 总线协议
  9. [转载] python模块的分类有哪些_整理了一份清单,常见Python问题的快速解答包
  10. 案例分享:巧用工具提升无源码系统的性能和稳定性
  11. python:sklearn 标签编码(LabelEncoder)
  12. 数据权限设计研究-行数据权限
  13. linux面试基础考题
  14. c++ 编译添加dll_通达信DLL编程(三)
  15. 第一章 马克思主义哲学是科学的世界观和方法论
  16. 基于AD7705的32路AD采集
  17. 实现LAYERED窗口
  18. pythonwhile冒泡排序_python冒泡排序
  19. POS打印机设置字体大小
  20. Base64转换成图片

热门文章

  1. 智和网管平台打造“海量接入 智慧监控”的统一运维监控中心
  2. 包机制(无规矩不成方圆)
  3. 100道java面试题
  4. 使用Beetle简单构建高性能Socket tpc应用
  5. 如何赢得朋友并影响他人
  6. Linux工具-串口工具 cutecom
  7. linux ext3 ext4 查看,技术|Linux 中管理 EXT2、 EXT3 和 EXT4 健康状况的 4 个工具
  8. 如何在线查看Android源码自带学习文档
  9. 麦昆PLUS V2-适合中小学STEAM教学的机器人套件
  10. 机器人社社长事迹_【青春榜样】佳木斯大学十佳科技创新创新标兵事迹——黄鹏...