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のどちらかを、実装仕様の都合からご選択していただくのが、一番平和なのではないかと推測いたします。
ご希望の実装が可能になる一助にでもなればと願っております。
今後ともよろしくお願いいたします。