SpriteStudio / SS5PlayerForUnity

OPTPiX SpriteStudio 5 Player for Unity
http://www.webtech.co.jp/spritestudio/
MIT License
39 stars 15 forks source link

1.2.8 特定の NULL の Rotation を0にしたい #202

Open sagat64 opened 7 years ago

sagat64 commented 7 years ago

お世話になっております。SS5 5.5.1 & SS5PU 1.2.8 を使用しております。

任意の Transform の Rotation を、Animation にかかわらず、常に 0 にしたいと考えています (2Dエフェクトの表示のために、傾かないようにしたい。)

SS5PU コードを眺めてみたのですが、力不足で、よくわかりません。。

・どのクラスに、処理を追加するのが適当なのか、 ・SS5PU を書き換える以外に、良い方法があるか、

アドバイスをいただけないでしょうか。

MasamiYitsuse commented 7 years ago

sagat64 様

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

まず、正しく1.2.8ではなく、Ver.1.2系の最終バージョンであるVer.1.2.33でのお話となりますが、ご質問の件のあたりの構造は1.2.xの間では大きく変更がないはずだった記憶があるので、大枠大丈夫だと思われます。

SS5PUの各パーツのGameObjectのtransformは、 Library_SpriteStudio.cs内の Library_SpriteStudio.AnimationData.UpdateGameObject関数 で行っております。 呼び出し元は、Script_SpriteStudio_Parts~.csのUpdate関数内からになります。

特定のパーツとなりますと……恐らく一番汎用的に使えそうな手としては、 (NULLパーツなら)Script_SpriteStudio_PartsNULL.csに、HideForceフラグと同様に、(仮に名前を付けるなら)IgnoreRotateフラグを用意して、それを見てやるのが一番よいのかな?と思います。 ※これですと、インスペクタの改造も一番軽度なのではないかと思われます。 ※HideForceがbool FlagHideForce;と定義してありますので、仮にbool FlagIgnoreRotate;としておきます。

このフラグをインスペクタから操作可能にしてやり(Inspector_SpriteStudio_Parts~.csにチェックボックスの改造が必要になりますが、そのあたりもFlagHideForceに倣えば大丈夫かと思います)、 UpdateGameObject関数の引数を増やして、FlagIgnoreRotateを渡してやればよいかと思います(該当しない通常のパーツ用のソースを改変したくない場合、引数を省略可能にしておけば良いかと思われます)。

そして、FlagIgnoreRotateがtrueなら、UpdateGameObject関数の中でFlagUpdateTransformRotateをfalseにしてしまえば、そのパーツは回転を無視するようになるはずです。

実装例としては、 public bool UpdateGameObject(   GameObject GameObjectNow,   int FrameNo,   Collider ComponentCollider,   WorkAreaRuntime WorkArea,   bool FlagIgnoreRoate = false ←これを引数に追加する。これは単なる引数名です ) として、UpdateGameObject関数の中で、 bool FlagUpdateTransformRotate = !AnimationDataRotationIsNullOrEmpty; の行を bool FlagUpdateTransformRotate = (!AnimationDataRotationIsNullOrEmpty) && (true == FlagIgnoreRotate); とでもしておいてやります。 その上で、Script_SpriteStudio_PartsNULLのUpdateでの呼び出しを spriteStudioData.UpdateGameObject(   gameObject,   ScriptRoot.FrameNoNow,   CollisionComponent, WorkArea,   FlagIgnoreRotate ←これはフラグの実体でScript_SpriteStudio_PartsNULLに追加したbool FlagIgnoreRotateです ); となるでしょうか……。


データを修正することが可能であるのであれば、単にデータの当該パーツの回転を未使用状態にしてしまえばよいとは思うのですが……。


こんな感じではいかがでしょうか? これですと、回転させたくないパーツに設定をしなくてはなりませんが、代わりに設定していないパーツは従来どおりの動きをしますので、プロジェクトへのダメージは最低で済むと思われます。

また、Ver.1.2.33のソースを見ながらのみ(上記の実装例がご要望どおりに正常に動作するかは実動作検証しておりませんが……恐らく動くのではないかと思われます)で、大変申し訳ございません。

お忙しい中お手数ですが、ご検討頂けますと幸いです。

sagat64 commented 7 years ago

MasamiYitsuse さま

SS5PUの各パーツのGameObjectのtransformは、 Library_SpriteStudio.cs内の Library_SpriteStudio.AnimationData.UpdateGameObject関数 で行っております。

こちらのアドバイスがドンピシャで、 望んでいたの動作を短時間で実現できました。

いつも丁寧なサポートありがとうございます。 (こんなツールデベロッパーさんは、めったにないと思います。)

ありがとうございました!