- Edited
Unityでの3.7から追加されたスキンの組み合わせ機能について
こんにちわ、いつも制作に利用させていただいております。
今回3.7にて追加された機能にスキンの組み合わせ機能というのがあったかと思うのですが、こちらのUnity上での設定方法を伺いたく思います。
・髪
・上着
・ズボン
とパターンを用意して、組み合わせようと思ったのですが、Unity上の
「Skeleton Animation」の「InitialSkin」をいじっても上手く設定できません。
髪を決めると、他のスキンが非表示になってしまい、全裸になってしまいます。
Unity上で髪、上着、ズボンをすべて表示させる方法ございますでしょうか。
こんにちは、
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);
}
}
お忙しい中、返信ありがとうございます!
頂いたサンプルもわかりやすく、とても助かります!
ご返信ありがとうございました!
お返事ありがとうございます!
それが助けてくれて嬉しいです。 初めに問題があったことを残念に思うが、それがより使いやすいように私達は含まれた例およびドキュメンテーションを将来改良する。
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.
すみません、こちら、現在の最新版でコード記載するとどのようになりますでしょうか。
using Spine.Unity.Modules.AttachmentTools;
→using Spine.Unity.AttachmentTools;
になり、変わったと思うのですがよろしければご教示いただけますと幸いです。
また、スキンの部分的差し替えのサンプルシーンなどありましたらそちらも教えていただけますと幸いです。
spine-unityランタイムでのスキンの組み合わせのサンプルシーンは以下にあります
Spine Examples/Other Examples/Mix and Match Skins
こちらのシーンで使用されているMixAndMatchSkinsExample.cs
をご確認いただければusing Spine.Unity.AttachmentTools;
を記述したコードサンプルをご確認いただけます。
ありがとうございます。
参考にさせていただき、無事、スキンの組み換えができるようになりました。
助かりました!
無事スキンの組み替えが実装できたとのことで良かったです!