0 支持
226 閲覧
(200 ポイント) Q&A
カテゴリーを変更
以下内容につきまして、回避方法があれば教えてください。

SpriteStudio6で作成したアニメーションをUnity上でコントロールしようと思っています。

実現したいことは以下の条件です。

①親アニメーション内に同じ子アニメーションがいくつか存在する

②子アニメーションは数フレーム毎にAとBの画像に入れ替わる

③子アニメーションで使用されるAとBの画像をUnity側で変更したい
 (AとBのセットがいくつかあり、それはセルマップにはしている)

これを子アニメーションのユーザーデータを検知してコールバックから変えることで実現しようとしていましたが、

リファレンスによるとインスタンスアニメーションのユーザーデータは検知されないとあり、

特に無効化の設定等もなさそうでした。

SpriteStudioのリファレンスを利用してこの条件を実現することは可能でしょうか?

あるいは、Unity側で時間ベースで切り替えるしかないでしょうか?
このページをシェアする

回答 2

0 支持
(1.7k ポイント)
編集

gg三浦 様

お世話になっております。SS6Player for Unity(以降SS6PU)担当です。


> リファレンスによるとインスタンスアニメーションのユーザーデータは検知されないとあり、

これについては、仕様としてインスタンスアニメーション(以降子アニメーション)からのコールバックを検知することは(動作結果の安定性の面から、仕様として)できません。

「できない」としている主な理由は、SpriteStudio6は、子アニメーションを呼び出す階層がほぼ無制限です(最親が子を持ち・その子がさらに子をもつ……ということです)。

それを同じ親からの兄弟で並列して子を持つこともできるため、インスタンスでコールバックを発行した場合、

「どの階層のアニメーションの、どのパーツに設置されたユーザーデータなのか?」

ということが一切判別できなくなる状況が成立します。

これを防ぐために、(Unityに限らず)SS6Player群は子アニメーションからのコールバックを発行しないことを仕様にしています。

少々面倒な仕様ではあるとは思うのですが、上記のような理由が(発行しないという仕様の下敷きに)ございますこと、ご理解くださいますようにお願いいたします。

……という事情があることを踏まえて……


> SpriteStudioのリファレンスを利用してこの条件を実現することは可能でしょうか?

▼その1

もし、インスタンス側(子アニメーション)にコールバックを仕掛ける形で実装しようとしていた場合については、その子アニメーションの親パーツである親アニメーション側の「インスタンスパーツ」にユーザーデータを設置する……という方法が、まず1つ目です。

インスタンス側に仕掛けると、一見親のアニメーションが変化した場合でも、インスタンスは独自でアニメーションを続行しそうな印象になるかもしれませんが……インスタンスは例え「独自再生」を設定したとしても、親のアニメーションを変えてしまった時点で、親のリセットと合わせて子もアニメーション状態はリセットされますので……「インスタンスが、親のアニメーションから完全に独立して・アニメーションを実行する」方法はありません。

……そのため、実は

  • インスタンスパーツにコールバックをユーザーデータを設置
  • インスタンス側にユーザーデータを設置

の2つは、「できること」は「ほぼ同じ」になります(インスタンス側のパーツ毎にユーザーデータを設置するということがカバーできない程度でしょうか?)。

▼その2

インスタンスの絵の切り替えを、親アニメーション側の再生状況に関係なく一定時間で切り替える……という場合は、どうやっても、独自にUnity側で追加の処理をする必要があります。

  • インスタンスのScript_SpriteStudio6_Rootが持つTableMaterialのマテリアルに割り当ててあるテクスチャを変える
  • インスタンスのScript_SpriteStudio6_RootのCellChangeParts関数を使用して、同じセルマップ中の別のセルに(パーツのセルを)変更する

など、いくつか強制的にパーツの表示図柄を強制変更する方法はありますが……いずれにしても

「パーツを差し替える一定タイミング」についてはUnity側でSS6PUとは別のスクリプトコンポーネントから計測して・そのタイミングになったら上記の図柄変更の処理を行う……という形にするのが一番平易です。

もし、すべての子アニメーションのテクスチャの差し替えタイミングが「同時」であるのであれば、亜型として(Unity側で時間計測する代わりに)「一定フレーム毎にユーザーデータが設置されているだけのアニメーション」を作成して、それをシステム全体で1つ空回ししておくことで、クリッカ(メトロノームみたいに一定時間間隔で処理を呼んでくれるもの)を作るという手もあります。

▼その3(非推奨)

「どうしても子アニメーションにユーザーデータを仕掛けたい」という「のっぴきならない」場合、一番最初で説明したデメリット・動作不良などが起こることと引き換えに、「SS6PUを改造して、インスタンスからのコールバックを発行させてしまう」という方法がないわけではないです。

実働は試していませんが、

Assets/SpriteStudio6/Library/Control/AnimationParts.cs

に(Library_SpriteStudio6.Control.Animation.Partsクラスの)Update関数があります(大体350行目あたりです)。

その関数の中を見ていくと、下記のような一文があります。

if((null == instanceRoot.InstanceRootParent) && (0 == (StatusAnimationParts & Library_SpriteStudio6.Data.Animation.Parts.FlagBitStatus.NO_USERDATA)))

この一文を

if(0 == (StatusAnimationParts & Library_SpriteStudio6.Data.Animation.Parts.FlagBitStatus.NO_USERDATA))

と書き換えると、インスタンスアニメ側でもユーザーデータ検知がかかるようになる「はず」です(最親のアニメーションオブジェクトでないとユーザーデータを検知しない……という条件そのものをコード側で外してしまう……ということです)。

ですが、この方法は非推奨かつ・自己責任でお願いいたします。

※そもそもうまく動かない他、ご期待通りの動作しないことや別の障害などが発生しても一切サポートなどできませんので、その点ご理解くださいますようお願いいたします。


恐らく、上記の1か2のどちらかを、実装仕様の都合からご選択していただくのが、一番平和なのではないかと推測いたします。

ご希望の実装が可能になる一助にでもなればと願っております。

今後ともよろしくお願いいたします。

(200 ポイント)
お世話になっております。

丁寧なご回答、ありがとうございます。

各種対応方法とご説明を参考に対応させていただきます。

(おそらく2を選択することになると思います)

今後ともよろしくお願いいたします。
0 支持
(1.7k ポイント)
編集

gg三浦 様

お世話になっております。SS6Player for Unity(以降SS6PU)担当です。

直前の返信への追加・付記となります。


▼その4

インスタンス側のアニメーション再生状態を親アニメーションから制御する必要がないのであれば……

SpriteStudio6上でインスタンスとして呼び出すのではなく、Unity上でシーン(ヒエラルキ)上に設置した親オブジェクトの特定パーツのGameObjectの子として、インスタンスにしたかったアニメーションオブジェクトを設置する。

という方法もあります。

この場合ですと、子アニメーション側はインスタンスではないので、コールバックを仕込むことも・差し替えそのものも(子側が持っている)アニメーションでできるかもしれません。

※そのかわり、(親子関係があるだけの完全に別のアニメーションオブジェクトになるため)親オブジェクトからアニメーションの再生状態を制御できないので、アニメーションを同期させたりするときの処理は自前で(別のスクリプトで)実装してやる必要があります。


これもアプリケーション側の仕様によりけりではありますが、比較的自由度が高いという意味では「良い」方法かもしれません。

(200 ポイント)
お世話になっております。

追加のご説明、ありがとうございます。

Nullパーツで持っておいてUnity上で設置するということでしょうか。

であれば、仕様的にはNullパーツでも設定可能なOn/Offや不透明度でカバーできる範囲な気がしますので、この方法で対応するほうが良さそうな気がします。

色々とご提示いただき、大変助かります。

今後ともよろしくお願いいたします。
(1.7k ポイント)
編集

お世話になっております。

SS6PU担当です。

一点注釈させてください。

> 仕様的にはNullパーツでも設定可能なOn/Offや不透明度でカバーできる範囲な気がしますので、この方法で対応するほうが良さそうな気がします。

この点なのですが……(インスタンスもしくはエフェクトでない限り)アニメーション内の設定が他のアニメーションに影響することはないため、不透明度・非表示・優先度などのアトリビュートは子(の位置に設置しているとは言え、別)のアニメーションオブジェクトに影響できませんので、注意してください。

※XYZ座標・XYスケール・XYZ回転の3要素については、GameObjectのTransformに反映されるので、この3種類のアトリビュートについてだけは子のGameObject群に影響させることができます。

もし、また疑問などございましたら、お気軽にご質問・ご要望いただけますと幸いです。

今後ともよろしくお願いいたします。

(200 ポイント)
お世話になっております。

注釈いただきありがとうございます。

それでは、transform関連以外はunity側から変えられる範囲で対応してみたいと思います。

今後ともよろしくお願いいたします。
...