kenjizenki

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

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

・髪
・上着
・ズボン

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

髪を決めると、他のスキンが非表示になってしまい、全裸になってしまいます。
Unity上で髪、上着、ズボンをすべて表示させる方法ございますでしょうか。
Unity上設定.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
kenjizenki
  • Сообщения: 18

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
  • Сообщения: 1054

kenjizenki

お忙しい中、返信ありがとうございます!
頂いたサンプルもわかりやすく、とても助かります!
ご返信ありがとうございました!
Аватара пользователя
kenjizenki
  • Сообщения: 18

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
  • Сообщения: 1054


Вернуться в 日本のSpine ユーザー