0 支持
2.3k 閲覧
(200 ポイント) Q&A

Unityで使用する際にインスタンスを変更しようとした場合に発生する下記問題について解決方法をご教授ください。

SpriteStudio6で作成したアニメーションプロジェクトをUnityにインポートし、アニメーション内のインスタンスを

InstanceChange()によって変更しようとしています。

この際、変更先のパターンが10種類ほどあり、条件に応じて設定するインスタンスを変更しております。

インスタンスはPrefabを配列で持っており、再生時にInstanceChange()で設定しております。

この設定を行った場合、正しく変更後のアニメーションインスタンスが再生される場合とまったく表示されない場合があります。

InstanceChange()の返り値はtrueとなっており、ヒエラルキー上でも該当アニメーションが設定されているように見えますが、

失敗パターンでは親アニメーションのgameObjectに存在するMesh Rendererのmaterialsのsizeが0になっており、

これが原因だと思われます。

また、InstanceChangeに失敗するアニメーション単体で再生することに問題はありません。

こちら、解決手段につきましてご教授のほどよろしくお願いいたします。

  • SpriteStudioバージョン: 6.3.2.1522
  • Unityバージョン: 2019.1.1f1
このページをシェアする

回答 1

0 支持
(5.0k ポイント)

gg三浦様

お世話になっております。SS6Player for Unity担当です。

ご質問いただいた症状については初見ですので、検証に入ろうと思います。

まずは状況の再現からとなりますため、少々お時間をいただければと思います。

また、当方で状況の再現ができない場合にUnityのプロジェクト(該当部分のみ)などか再現性に類する情報のご提供をお願いする場合がございます。その場合には大変お手数とは存じますが、ご検討いただけますと非常に助かります。

※また、再現性や失敗するアニメーションの共通性にお気づきの点がありましたら、情報をいただけますと非常に助かります。


また、現状のお手元で、下記の点のチェックをお願いできますでしょうか?

  • InstanceChangeコマンドの終了後にAnimationChangeInstance関数で新規インスタンスのアニメーション設定を行っているか?(新規インスタンスのアニメーション指定はAnimationPlay関数を直接叩かないでください)
    インスタンスの変更タイミングは、「インスタンス側の各種コールバック(インスタンス側の再生終了コールバックも含みます。親の再生終了コールバックは大丈夫です)」や「ユーザーデータ検知コールバック」などのタイミングで行わないでください。(特にユーザー検知データコールバックはアニメーションの更新中に呼ばれるため、コールバック処理中で処理状態を変更すると動作が不安定になります)
    コールバック処理中には「次に再生するインスタンス(&アニメーション)のキャッシュ」に留めて・次のUpdateなどの平易なタイミングで実際の変更を行ってください。


以上となります。

お忙しい中、お手間やご不便をおかけして申し訳ございません。

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

(200 ポイント)

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

ご確認、情報ありがとうございます。

> InstanceChangeコマンドの終了後にAnimationChangeInstance関数で新規インスタンスのアニメーション設定を行っているか?(新規インスタンスのアニメーション指定はAnimationPlay関数を直接叩かないでください)

こちらに関しまして、現状のコードでは

①インスタンスの入れ替えを行う親アニメーションをヒエラルキー上にインスタンス化、アクティブ化(非再生状態)

InstanceChange()呼び出し

③親アニメーションをAnimationPlay(-1, -1, 1)で再生

の順で行っております。

こちらの処理順序に誤りがあるということでよろしいでしょうか。

また、その場合正しい処理順序をご教授いただけると助かります。

以上、よろしくお願いいたします。

(5.0k ポイント)

また、SS6Player for Unityのサンプル群(https://github.com/SpriteStudio/SS6PlayerForUnityのsampledevelopブランチにサンプル群があります)の「doll」シーンの「Script_Sample_DollTricks.cs」でインスタンスのアニメーション切り替えを行っているサンプルがあります(ただしこのサンプルだとAnimationChangeInstance関数のみでの変更になっています)。

何かの参考になれば……と。

(5.0k ポイント)

gg三浦様

ご返信ありがとうございます。

※私からの追記の書き込みとご返信のタイミングが前後したようで、申し訳ありません。

> ②InstanceChange()呼び出し

> ③親アニメーションをAnimationPlay(-1, -1, 1)で再生

InstanceChangeを行った場合、そのインスタンスのアニメーションが確定していない場合(というよりは直前までかかっていたアニメーション番号が新しいインスタンスに存在しない場合)があり得ますので……

②InstanceChange()呼び出し

2' : AnimationChangeInstance関数でインスタンスで再生するアニメーション番号を設定

③親アニメーションをAnimationPlay(-1, -1, 1)で再生

……の順が正しい手順となります。

お忙しい中お手数とは存じますが、ご検証のほどお願いいたします。

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

ご提示いただいたサンプルと見比べて気づきましたが、インスタンスの入れ替えを行う場合、変更対象は同じssae内にある必要があるでしょうか?

現在はそれぞれ別々のssaeになっております。

また、AnimationChangeInstanceは同じssae内同士でしか切り替えられないように見受けられます。

以上、よろしくお願いいたします。
(5.0k ポイント)

gg三浦様

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

> また、AnimationChangeInstanceは同じssae内同士でしか切り替えられないように見受けられます。

> 現在はそれぞれ別々のssaeになっております。

はい。その通りで、AnimationChangeInstanceは同じssaeの中のアニメーションを設定する機能です。

ですので、異なるssaeのインスタンスに変更してから、AnimationChangeInstanceを使用してアニメーションを設定しますので……

> ②InstanceChange()呼び出し

> 2' : AnimationChangeInstance関数でインスタンスで再生するアニメーション番号を設定

の順序通り、

SS6Root.InstanceChange(idParts, 新しいインスタンスのPrefab); /* 2 */

SS6Root.AnimationChangeInstance(idParts, "アニメーション名", ~ ); /* 2' */

  として、から

> ③親アニメーションをAnimationPlay(-1, -1, 1)で再生

を行うこととなります。

※AnimationChangeInstanceに与えるのは、事前に特定されている場合アニメーションのインデックスでも構いません(そのあたりはAnimationPlayと同じです)。


インスタンスの実体を別のssaeに変更する場合、エディット時には同じアニメーション名であってもアニメーションのインデックスが変わる場合などもあり(SS6上でssae内のアニメーションは文字コード順でソートされるためアニメーションのインデックスはssaeが異なると維持されません)、この手数がかならず必要になります。

お手数をおかけして申し訳ございませんが、ご検証の程、何卒よろしくお願いいたします。

(200 ポイント)

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

ご説明ありがとうございます。

ご指摘の通り、

①InstanceChange呼び出し

②AnimationChangeInstance呼び出し

③AnimationPlay呼び出し

の順で実行してみたところ、やはりmaterialsの中身が空になり、非表示となりました。

また、②の返り値はtrueのため、設定自体はうまくいっているように見えます。

また、参考までに正常時とNG時のインスペクターの画像をお送りします。

MeshRendererのMaterialsが0になっていることが確認できます。

(200 ポイント)

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

矢継ぎ早に申し訳ありません。

試しにテスト用のssaeを追加し、その中に

①元々正常に表示されていたアニメーションのコピー

②元々正常に表示されなかったアニメーションのコピー

を追加して、こちらのprefabを用いて

①InstanceChange呼び出し

②AnimationChangeInstance呼び出し

③AnimationPlay呼び出し

の流れを試してみました。

(同じprefabを使用するため、②で指定するnameのみ異なる)

すると、同様に正常表示できる/できない結果となり、同様のmaterialsの状態となりました。

(元々設定されているインスタンスは別ssaeのため、サンプルのdollとは異なる条件とはなりますが・・・)

ちなみに、こちらもそのままヒエラルキー上に配置すると正常に表示されるため、インスタンスの切り替えに使用した際に異常が出るものと思われます。

以上、追加状況のご連絡となります。

(5.0k ポイント)
gg三浦様

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

状況と情報、ありがとうございます。

いただいた情報を元にこちらで具体的な検証をいたします。

前述の通り、少々お時間をいただけますようお願いいたします。

検証上疑問点が出た場合や修正が行われた場合の連絡については、当スレッドで行わせていただければと思います。

お待たせして申し訳ございませんが、何卒ご容赦の程お願い申し上げます。
(200 ポイント)
お世話になっております。

お忙しいところご対応ありがとうございます。

追加検証情報です。

前コメントで記載した検証に利用したテスト用ssaeを利用し、同ssaeを参照したインスタンスが設定された親アニメーションを別途用意し、AnimationChangeInstanceのみでの変更を実施してみました。

(サンプルのDollと同じ条件)

結果としては、Dollどのアニメーションにも問題なく切り替えられました。

そのため、このアニメーションに利用している画像(セルマップ)やアニメーションの中身は原因には関係なさそうで、何かしらの条件において元ssaeが異なるアニメーションを切り替えようとした場合に問題が発生する用です。

お手数おかけしますが、よろしくお願いいたします。

以上です。
(5.0k ポイント)

gg三浦様

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

> そのため、このアニメーションに利用している画像(セルマップ)やアニメーションの中身は原因には関係なさそうで、何かしらの条件において元ssaeが異なるアニメーションを切り替えようとした場合に問題が発生する用です。

追加のご検証ありがとうございます。

その上で、2点追加でお聞きしたいことを失念しておりました。

  1. この場合の「異なるssae」は、「同じsspjの中にあるssae」でしょうか?
  2. sspjをSS6PUでインポートする際に、インポート設定の[Option: Basic]-[No-Create unreferenced Materials]の設定はいずれになっておりますでしょうか?

大変お手数とは存じますが、お手間の空いている時で構いませんので、情報をいただけますと非常に助かります。

(200 ポイント)

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

2点、回答いたします。

この場合の「異なるssae」は、「同じsspjの中にあるssae」でしょうか?

はい、同じsspjの中にあるssaeです。

あるsspjをインポートし、その結果同一のPrefabAnimationフォルダ下に各ssaeのprefabが生成されると思いますが、それらを使用して切り替えております。

sspjをSS6PUでインポートする際に、インポート設定の[Option: Basic]-[No-Create unreferenced Materials]の設定はいずれになっておりますでしょうか?

デフォルト設定をそのまま使用しておりますが、確認したところ「None(Create all)」でした。

以上、よろしくお願いいたします。

(5.0k ポイント)
gg三浦様

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

お忙しい中、1と2の状況をいただけましたこと、心から感謝いたします。

何かしら状況の進展など発生しましたら、こちらにて報告させていただきたく思います。
(5.0k ポイント)
gg三浦様

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

間が開いてしまい申し訳ありません。

当方で状況を再現してみようとテストを行ってみたのですが、状況が再現できずにおります。

そのため、大変お手数とは存じますが、該当するSpriteStudio6のデータをご提供いただけると非常に助かるのですが、ご検討いただけますでしょうか?

また、もしご提供をご快諾いただける場合、こちらのコミュニティに登録されているメールアドレスに弊社サポートから手順などのメールを送ってもよろしいでしょうか?

お忙しい中お手数とは存じますが、何卒ご検討くださいますようお願いいたします。
(5.0k ポイント)
編集

gg三浦様

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

本件そのものの障害は再現できていないのですが、(本件調査中に)ご指摘の症状に発展する可能性がある障害を修正したバージョンをSS6Player for UnityのGitHubにの

developもしくはsampledevelop

のブランチにコミットいたしました。

https://github.com/SpriteStudio/SS6PlayerForUnity

※修正後バージョンは「1.1.24」になります。

状況としては、インスタンスとエフェクトを併用したアニメーションを使用しているアニメーションに対してInstanceChange関数を使用した場合に、データ構成によってはメモリリークを起こし・動作が不安定になる場合がある障害の解消……になります。

もしお手元で更新可能な場合、本変更で同時に本件も修正されていると良いのですが……。

お忙しい中お手数をおかけして申し訳ございませんが、今後とも何卒よろしくお願いいたします。

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

ご調査いただきありがとうございます。

一旦Dollと同じ状態(すべて同じアニメーションを経由する)形で対応できたこと、時間的余裕がないことから今回はこちらの対応で進めようと思っております。

ただ、今後同様に作成する場合はできれば別々のアニメーションを切り替える形(今回問題が発生している形)で運用したいと考えております。

そのため上記データの提供、修正バージョンでの確認を後ほどさせていただきたいと考えております。

時間が空くことになってしまい申し訳ありませんが、落ち着き次第対応させていただきたいと考えておりますので、

よろしくお願いいたします。
...