kenjizenki

こんにちわ、いつも制作に利用させていただいております。

今回3.7にて追加された機能にスキンの組み合わせ機能というのがあったかと思うのですが、こちらのUnity上での設定方法を伺いたく思います。

・髪
・上着
・ズボン

とパターンを用意して、組み合わせようと思ったのですが、Unity上の
「Skeleton Animation」の「InitialSkin」をいじっても上手く設定できません。

髪を決めると、他のスキンが非表示になってしまい、全裸になってしまいます。
Unity上で髪、上着、ズボンをすべて表示させる方法ございますでしょうか。
Unity上設定.png
이 게시글에 첨부된 파일을 보기위한 권한을 요청할 수 없습니다.
사용자 아바타
kenjizenki
  • 전체글: 54

Harald

こんにちは、
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);
}
}
사용자 아바타
Harald

Harri
  • 전체글: 3457

kenjizenki

お忙しい中、返信ありがとうございます!
頂いたサンプルもわかりやすく、とても助かります!
ご返信ありがとうございました!
사용자 아바타
kenjizenki
  • 전체글: 54

Harald

お返事ありがとうございます!
それが助けてくれて嬉しいです。 初めに問題があったことを残念に思うが、それがより使いやすいように私達は含まれた例およびドキュメンテーションを将来改良する。

Thank you for your reply!
We are glad that it helped. Sorry that you had problems with it at the beginning, we will improve the included examples and documentation in the future so that it is easier to use.
사용자 아바타
Harald

Harri
  • 전체글: 3457

kenjizenki

すみません、こちら、現在の最新版でコード記載するとどのようになりますでしょうか。
using Spine.Unity.Modules.AttachmentTools;
→using Spine.Unity.AttachmentTools;
になり、変わったと思うのですがよろしければご教示いただけますと幸いです。

また、スキンの部分的差し替えのサンプルシーンなどありましたらそちらも教えていただけますと幸いです。
사용자 아바타
kenjizenki
  • 전체글: 54

Misaki

spine-unityランタイムでのスキンの組み合わせのサンプルシーンは以下にあります
Spine Examples/Other Examples/Mix and Match Skins

こちらのシーンで使用されているMixAndMatchSkinsExample.csをご確認いただければusing Spine.Unity.AttachmentTools;を記述したコードサンプルをご確認いただけます。
이 게시글에 첨부된 파일을 보기위한 권한을 요청할 수 없습니다.
사용자 아바타
Misaki

Misaki
  • 전체글: 236

kenjizenki

ありがとうございます。
参考にさせていただき、無事、スキンの組み換えができるようになりました。
助かりました!
사용자 아바타
kenjizenki
  • 전체글: 54

Misaki

無事スキンの組み替えが実装できたとのことで良かったです! :)
사용자 아바타
Misaki

Misaki
  • 전체글: 236


다시 돌아감: 日本のSpine ユーザー