こんにちは、
Hello,
解決策は、ベーススキン(フルセットを提供)と追加の部分装備スキン(一部のアタッチメントのみをオーバーライドし、全部はオーバーライドしない)からなる、組み合わせスキンをプログラム的に作成することです。
The solution is to create a combined skin programmatically, consisting of a base skin (providing the full set) and additive partial equipment skins (overriding only some attachments, but not all).
例として次のUnity C#コードを見ることができます、それはまた部分的なスキンの除去をカバーします。
You can take the following Unity C# code as an example, it also covers removal of partial skins.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Spine.Unity.Modules.AttachmentTools;
public class EquipPartialSkinDemo : MonoBehaviour {
Spine.Unity.SkeletonAnimation skeletonAnimation;
Spine.Skin templateBaseSkin;
List<Spine.Skin> addedPartialSkins = new List<Spine.Skin>();
Spine.Skin combinedSkin;
void Awake() {
skeletonAnimation = this.GetComponent<Spine.Unity.SkeletonAnimation>();
combinedSkin = new Spine.Skin("CombinedSkin");
}
IEnumerator Start() {
EquipBaseSkin("base"); // 人のためのベーススキン
EquipPartialSkin("hair"); // 髪
yield return new WaitForSeconds(3);
Debug.Log("adding jacket"); // "ジャケットの追加"
EquipPartialSkin("jacket"); // 上着
yield return new WaitForSeconds(3);
Debug.Log("removing jacket"); // ジャケットの取り外し
UnequipPartialSkin("jacket"); // 上着
}
void EquipBaseSkin(string skinName) {
templateBaseSkin = skeletonAnimation.Skeleton.Data.FindSkin(skinName);
RefreshSkin();
}
void EquipPartialSkin(string skinName) {
var templatePartialSkin = skeletonAnimation.Skeleton.Data.FindSkin(skinName);
if (templatePartialSkin != null)
addedPartialSkins.Add(templatePartialSkin);
RefreshSkin();
}
void UnequipPartialSkin(string skinName) {
for (int i = 0; i < addedPartialSkins.Count; ++i) {
if (addedPartialSkins[i].Name == skinName) {
addedPartialSkins.RemoveAt(i);
break;
}
}
RefreshSkin();
}
void RefreshSkin() {
RecombineSkin();
skeletonAnimation.Skeleton.Skin = combinedSkin;
RefreshSkeletonAttachments();
}
void RecombineSkin() {
combinedSkin = new Spine.Skin("CombinedSkin");
combinedSkin.AddAttachments(templateBaseSkin);
foreach (var partialSkin in addedPartialSkins) {
combinedSkin.AddAttachments(partialSkin);
}
}
void RefreshSkeletonAttachments() {
skeletonAnimation.Skeleton.SetSlotsToSetupPose();
skeletonAnimation.AnimationState.Apply(skeletonAnimation.Skeleton);
}
}