natsue

失礼いたします、初めて質問いたします。
件名の件でお尋ねいたします。

①spine_Ver4.0.56 でrootボーンの直下にスロットのboundingboxを作ります。
②スロット下に、boundingboxを作ります。
③その状態でバイナリ出力をします。
※root直下に他のボーンやスロット、アタッチメントなど混在させておりますが、そちらは問題なく出力されているので本問題とは無関係かと思われます
④unity_Ver2019.4.6f1 で、上記バイナリを読み込みます。
⑤boundingboxの値(ワールド座標XY)が認識されておりません。

上記⑤の結果となるので、困っております。
ちなみに、SpineVer3.8.57からの出力では、認識されるようです。
こちらがSpineVer4.0.56からの出力でも正常に認識できるようにしたいのですが、何かヒントをつかめたらと思いましてご質問しました。
何か手掛かりを掴めたらと思いますので、どうか宜しくお願いします。

また、本現象の詳細を以下文章と添付(4.0出力時の値と3.8.57出力時の値)でお伝えいたします。
-------------------------------------------------------------------------------------------------------------
unityで
ワールド空間の座標に変換する計算がこんな感じで行われています。
ワールド座標x = 頂点のx座標 * a + 頂点のy座標 * b + ボーンのx座標;
ワールド座標y = 頂点のx座標 * c + 頂点のy座標 * d + ボーンのy座標;
a~dの値が、画像に貼ったBoneの「A、B、C、D」に該当するようです。
4.0で出力されたspineは、これがなぜか全て0になっているので、
bondingの4頂点をワールド座標に変換すると全て0が返ってくる感じですね。
-------------------------------------------------------------------------------------------------------------
Nemaš dopuštenje za pregledavanje privit(a)ka dodan(og)ih postu.
natsue
  • Postovi: 8

Harald

ご迷惑をおかけして申し訳ございません!

どのバージョンのspine-unityランタイム(unitypackageの名前、または Assets / Spine / version.txtにも記載されています)を使用していますか? かなり最近、2021年12月21日に同様のバグを修正しました。 古いパッケージを使用している場合は、更新してみていただけますか?
-----
We are sorry for the troubles!

Which version of the spine-unity runtime (name of the unitypackage, also listed in Assets/Spine/version.txt) are you using? We have rather recently fixed a similar bug on 2021-12-21. If you are using an older package, could you please have a try updating?
Avatar
Harald

Harri
  • Postovi: 4101

natsue

Harald様

丁寧なご返信をありがとうございます。

>どのバージョンのspine-unityランタイム(unitypackageの名前、または Assets / Spine / version.txtにも記載されています)を使用していますか?

こちらですが、上記の質問時には
「spine-unity-4.0-2021-12-21.unitypackage」を使用しておりました。
いただいたご回答によりますと、既に修正されているバージョンと思われましたが、念のため最新の
「spine-unity-4.0-2022-01-10.unitypackage」に変更して、同様にunityで読み込んでみました。
しかし、結果は同じでした。

対処法としまして、
試しにbounding_boxを取得する直前で、強制的にupdateWorldTransformを呼んでみたところ、
rootにABCDの値が入り、bounding_boxのサイズは取得できました。
ただ、できれば根本的な解決方法として最初から取得したいと思いますので、引き続きご質問継続させていただけたらと思います。
どうぞ宜しくお願いいたします。
natsue
  • Postovi: 8

Harald

追加情報をいただきありがとうございます。 これはバグのように思われます。お手数ですが、この問題がまだ発生している最小限のUnityプロジェクトをcontact@esotericsoftware.comに送っていただけませんか? 前後の流れを把握できるように、このフォーラムのURLを記載して、zipパッケージとして送信してください。 その後、弊社で何が問題になっているのかを確認し、問題の正式な修正を提供させていただきます。
-----
Thank you for the additional information. This sounds like a bug then. Could you please send us a minimal Unity project that still shows this problem to contact@esotericsoftware.com? You can send it as a zip package, briefly mentioning this forum URL so that we know the context. Then we can check what is going wrong and provide an official fix for the issue.
Avatar
Harald

Harri
  • Postovi: 4101

natsue

Harald様

本件、メールでminimal Unity projectをお送りいたしました。
正しく届いておりますでしょうか?

ご検証を宜しくお願いいたします。
natsue
  • Postovi: 8

Misaki

問題確認用のUnityプロジェクトをご送付いただきありがとうございます。
正しくこちらに届いておりますので、確認のために少々お時間をいただけますと幸いです。
お待たせしてしまい恐れ入りますがよろしくお願いいたします。
Avatar
Misaki

Misaki
  • Postovi: 759

Harald

natsue je napisao/la:SpineVer3.8とSpineVer4.0の出力を比較したところ、spineの生成後にupdateWorldTransformを呼ぶ処理が、Ver4.0ではコメントアウトされているのを発見しました。
それがバグということでしょうか?
いいえ、これはバグではありません。 コメントアウトされた行を削除しましたが、そもそもそこにあるべきではありませんでした。
これは、最初のフレームでの UpdateWorldTransform()への重複した呼び出し( Update()でも呼び出されます)を省くために、意図的に削除されました。

あなたの複製プロジェクトのスクリプト SpineTest.csでは、 Start() から SkeletonGraphicコンポーネントを使用してプレハブをインスタンス化しています。問題は、同じ Start()メソッドで、最初の Update()または LateUpdate()の呼び出し(これはアニメーションフレームを作成し、 skeleton.UpdateWorldTransform()を呼び出します)に到達する前に、 Slot ComputeWorldVertices() を呼び出していることです。これを Start()から手動で行う場合は、 Update(0)を1回呼び出すことをお勧めします。 Update(0)の代わりに skeleton.UpdateWorldTransform()を直接呼び出すことは、 Update(0)の一部のみを呼び出すことによる一種の最適化にはなりますが、将来APIが変更された場合は、追加のコード変更が必要になる可能性があります。※例えば4.1または4.2に移行する場合など。

このような必要な Update呼び出しは最適ではないことは理解しています。今後、4.1-betaブランチのAPIを変更して、不要な重複呼び出しを防ぎながら、これらの要求される呼び出しの一部を自動的に発行できるかどうかを確認します。
-----
natsue je napisao/la:When comparing the output of Spine Ver3.8 and Spine Ver4.0, I found that the process of calling updateWorldTransform after the generation of spine was commented out in Ver4.0.
Is that a bug?
No, this is not a bug. We have removed the commented-out line, it should not have been there in the first place.
This is saving an otherwise duplicate call to UpdateWorldTransform() in the first frame (it is also called in Update()), and was intentionally removed.

In the script SpineTest.cs of your reproduction project you are instantiating a prefab with a SkeletonGraphic component from Start(). The problem is that in the same Start() method your are calling ComputeWorldVertices() on a Slot, before it gets to its first Update() or LateUpdate() call, which would apply the animation frame and call skeleton.UpdateWorldTransform(). If you do this manually from Start(), we would recommend to call Update(0) once. Calling skeleton.UpdateWorldTransform() directly instead of Update(0) is a kind of optimization by calling only a part of Update(0), but this might require some additional code changes if the API changes in the future, e.g. when migrating to 4.1 or 4.2.

We understand that such required Update calls are not optimal. We will have a look if we can change the API on the 4.1-beta branch to automatically issue some of these required calls, while still preventing unnecessary duplicate calls.
Avatar
Harald

Harri
  • Postovi: 4101

natsue

Harald様、Misaki様
丁寧なご返信をありがとうございます。

本件に関しては、現バージョンでは
「Start()から手動で行う場合は、 Update(0)を1回呼び出すこと」
で解決させ、

「不要な重複呼び出しを防ぎながら、これらの要求される呼び出しの一部を自動的に発行できる」
↑こちらは、将来Spineの新バージョンにて適用されることをお待ちする
という解釈でOKでしょうか?
natsue
  • Postovi: 8

Harald

あなたの返信を正しく理解できているかわからず、もし以下の回答があなたの質問への答えからずれてしまっていたら申し訳ありません。

現在のところ、この場合はスロット境界にアクセスする前にStartskeleton.Update(0)を呼び出すことをお勧めします。 これにより、spine-unity4.0での問題は直るはずです。 自動ソリューションが4.1-betaブランチに追加されるのを待つことはお勧めしません。これを実装するまでには時間がかかる可能性があるためです(主要な再構築タスクを事前に完了する必要があります)。
-----
I'm not sure I understand your reply correctly, so sorry if the following reply does not answer your question.

We currently recommend to call skeleton.Update(0) in Start in your case before accessing the slot bounds. This should fix your problem now in spine-unity 4.0. We do not recommend waiting for the automatic solution to be added to the 4.1-beta branch, because this might take long until we get to implement this (a major restructuring task need to be finished beforehand).
Avatar
Harald

Harri
  • Postovi: 4101

natsue

Harald様

ご回答をありがとうございます。
質問の答えとしてずれていないと思います。

>この場合はスロット境界にアクセスする前にStartでskeleton.Update(0)を呼び出すことをお勧めします。 これにより、spine-unity4.0での問題は直るはずです
>自動ソリューションが4.1-betaブランチに追加されるのを待つことはお勧めしません。

上記2点、了解いたしました。
ありがとうございました!

---

Harald様

何度も追記となりましてすみませんが、いくつか確認をさせてください。
前回ご返信いただいた内容を以下のように理解しましたが、こちらの解釈であってますでしょうか。
-----------------------
・UpdateWorldTransform()を呼べば意図した挙動にはなるし、4.0の現状では問題ない修正ではある
・ただ、今後の更新でまた動かなくなる可能性があるので、UpdateWorldTransform()よりもUpdate(0)を呼んだほうが安全
・明示的にUpdate(0)を呼ばなければならないというのは最適ではないと認識している(つまりバグ)
・この修正がいつ対応されるかは分からないので、Update(0)での対応で解決してほしい
-----------------------
また、ご提示いただいた解決方法→「Update(0)での対応」は、こちらで試してみましたところ問題なく動作することを確認いたしましたので、上記解釈に間違いがなければ、この対応で本質問は解決とさせていただくことにいたします。

以上となります、宜しくお願いいたします。
natsue
  • Postovi: 8

Harald

あなたはすべての点を正しく理解されています。 質問していただきありがとうございました、これは常に良い考えです。
You understood all points correctly. Thank you for asking, this is always a good idea.
Avatar
Harald

Harri
  • Postovi: 4101

natsue

Harald様

ご返答ありがとうございます。
全て正しい解釈だったとのこと、教えていただきまして、良かったです。
色々とお手数おかけいたしました、ありがとうございました。
natsue
  • Postovi: 8

Harald

喜んでお手伝いさせていただきます。親切な言葉をありがとうございます。
We are happy to help, thank you for your kind words.
Avatar
Harald

Harri
  • Postovi: 4101


Natrag na 日本のSpine ユーザー