こんにちは、ハラルドさん。
お返事が大変遅くなってすみません。
多くの検証を行ったのですが、上記2つの方法で問題に直面してしまいました。
になりました。
===========================================================
■Slotカラーを変更する方法
What I should have suggested instead is using the UpdateComplete callback,
public class _TestSpine : MonoBehaviour
{
SkeletonAnimation skeletonAnimation;
private Slot slotTorso;
private void Start()
{
skeletonAnimation = GetComponent<SkeletonAnimation>();
// I'm just changing it to goblin skin for the video, so I'll skip it on code.
SetSKin();
// Spineアニメの見た目がアップデートされた後に呼び出されるコールバック
skeletonAnimation.UpdateComplete += UpdateComplete;
slotTorso = skeletonAnimation.skeleton.FindSlot("M45_/torso");
}
private void UpdateComplete(ISkeletonAnimation anim)
{
Debug.Log($"<color=#3dffff> Updated</color>");
Color skinColor = new Color(0.7744197f, 0.8427672f, 0.7129068f, 1f);
// It turns psychedelic colors.
Color mixColor = new Color(skinColor.r + slotTorso.GetColor().r, skinColor.g + slotTorso.GetColor().g, skinColor.b + slotTorso.GetColor().b, slotTorso.GetColor().a);
slotTorso.SetColor(mixColor);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha0))
{
Debug.Log("TestKey:0");
skeletonAnimation.AnimationState.SetAnimation(0,"TestSlotColor1",true);
}
if (Input.GetKeyDown(KeyCode.Alpha1))
{
Debug.Log("TestKey:1");
skeletonAnimation.UpdateComplete -= UpdateComplete;
slotTorso.SetColor( new Color(1,1,1,1f));
Color skinColor = new Color(1,1,1,1f);
Color OnSpineAnimColor = new Color(0,0,0,1f);
Color mixColor = new Color(skinColor.r + OnSpineAnimColor.r, skinColor.g + OnSpineAnimColor.g, skinColor.b + OnSpineAnimColor.b, OnSpineAnimColor.a);
slotTorso.SetColor(mixColor);
// mixColor == Color:(1,1,1,1) However, black is expected.
}
}
}
skinColorをゴブリンの肌色として定義します。
ご提案いただいたSlotカラーを変更する方法では、毎フレーム「緑の肌色+アニメで指定したSlotカラー」を計算する必要があります。しかしその方法が分かりません。
■1.取得方法
コードではアルファ値を除いて、「指定の肌色+Slotの色」を代入しています。
ご覧のようにサイケデリックな色が点滅しています。
FindSlotでは「現在のSlot色」を取得するため、2フレーム以降は「指定の肌色+1フレーム前で混合済みのSlot色」になってしまうようです。
Spineアニメ上のSlotカラーだけを取得する方法が必要ですが可能ですか?
■2.計算方法
また、単純に
Color SkinColor;
Color OnAnimSlotColor;
Color MixColor = SkinColor + OnAnimSlotColor;
という計算は不適切です
なぜなら白(1,1,1,1)+ 黒(0,0,0,1)を単純に加算すると白になってしまうからです。
これは肌色をUnity上で加算しないほとんどのキャラがSpineアニメ上でSlotColorを真っ黒にすることができなくなります。
そのため、Spineエディタ上で確認できるAttachmentカラー + Slotカラーのような色を再現できる計算が必要です。
■3.パフォーマンス
また、少し気になったのがパフォーマンスです。
Slotカラーの変更は負荷は高いですか?
この方法だと沢山のSlotをキャラクターの数だけ、毎フレーム色変えするため気になりました。
===========================================================
■アタッチメントカラーの変更をインスタンスごとに適用する方法
Slot slot;
slot.Attachment = slot.Attachment.Copy();
こちらの方法では、Spineアニメ上で別のAttachment切り替えが発生すると、Copyではない元々のアタッチメントが表示されることがわかりました。
おそらく、上記のコードはSlotの現在表示するアタッチメントを、Copyしたものに一時的に切り替えているだけのように見えます
また、SetSlotsToSetupPose()を使用すると元々のAttachmentに変わってしまうため、Attachmentからアプローチする方法は難しいと感じました。
ここまで読んでくださってありがとうございます!
何卒ご助言を頂ければ幸いです