SpriteStudio / SS5PlayerForUnity

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

v1.2.0 フェードアニメーションの付加方法について #103

Open pastatsh opened 9 years ago

pastatsh commented 9 years ago

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

フェードイン・フェードアウトのような不透明度を変更するアニメーションオブジェクトを 別のアニメーションオブジェクトに付加しても不透明度が反映されませんが、 このようなアニメーションを付加する方法はありますでしょうか?

pastatsh commented 9 years ago

Wikiの「質問を投稿する」の項に「ページ右の [Add Labels] で[question]を選択します。」とありますが、 ラベルの設定はリポジトリの管理者にしか不可能と思われます。

DKAlpha commented 9 years ago

表記が間違っておりすみません。 Add Labelsではなく、この画面の右側にあります[Labels]から[question]を選択してください。

MasamiYitsuse commented 9 years ago

pastatsh 様

お世話になっております。 この場合の「別のアニメーションに付加する」という方法は、 「インスタンスパーツでの別アニメーションの付加」 という認識で合っておりますでしょうか?

当方でも同様の再現性を確認してみます。 また、もしお手数でなければ、 ・SS5P for Unityのバージョン(Unityの上部メニューの[Tools]→[SpriteStudio]→[About]を選ぶとバージョンが記載されたウィンドウが出てきます) ・SS5上でどのような形でアニメーションを呼び出して・不透明度を変化させているか の情報をご提供いただけますと非常に助かります。

その上で、一点SS5P for Unity の現在(及びそれ以前)のバージョンでは、 「多段でインスタンスパーツを呼び出す(インスタンスパーツ中から別のインスタンスパーツを呼び出す)」ことをしますと、SS5上でのプレビューと異なる透明度を示す場合がございます。 例えば…… ・アニメーションA   ・アニメーションB用インスタンスパーツ(アニメーションA内パーツ: 不透明度:0.5)     ・アニメーションB(呼び出されたインスタンスアニメーション)     ・アニメーションC用インスタンスパーツ(アニメーションB内パーツ: 不透明度:0.5)       ・アニメーションC(呼び出されたインスタンスアニメーション)

という構造になっていますと、 SS5上のプレビューでは、 ・アニメーションBは0.5 ・アニメーションCは不透明度: 0.25(0.5×0.5) ……となりますが、SS5P for Unityでは、 ・アニメーションBは0.5(アニメーションA内のインスタンスパーツで指定されている不透明度) ・アニメーションCも0.5(アニメーションB内のインスタンスパーツで指定されている不透明度) となってしまう差異がございます。

上記の点、ご確認いただけますと非常に助かります。 お忙しい中お手数ですが、何卒宜しくお願い致します。

pastatsh commented 9 years ago

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

この場合の「別のアニメーションに付加する」という方法は、 「インスタンスパーツでの別アニメーションの付加」 という認識で合っておりますでしょうか?

[1] Unityのシーン上で該当するパーツの子として、直接インポートしたプレハブを設置する を使用しています。

不透明度が変わらないアニメーションAにフェードのアニメーションを付加するために ヒエラルキー上に以下のように配置しております。 ・フェードのアニメーションのプレハブ  ・そのパーツ(?)   ・アニメーションAのプレハブ

SS5P for Unityのバージョンは1.2.00(Alpha-2)です。 SpriteStudioの方はデザイナーに確認が取れない状況です。

断片的な情報で申し訳ありませんが、何卒宜しくお願い致します。

MasamiYitsuse commented 9 years ago

pastatsh様

まず、先に一点(本来のコメントの前に)余談的ではありますが、重要なことなので、コメントさせていただきます。

SS5P for Unity ver.1.2.00(Alpha-2)をお使いとのことですが、こちらについては、先日数点の大きなバグが発見されておりますため、できるだけ早く、GitHubかアセットストアで公開されているVer.1.2.1に更新していただくことを推奨致します。 (Ver1.2.1は、1.2.0の重大なバグをいくつか修正してある他、再生実行時の相当な高速化が行われております。その分データの構造によっては、データサイズが大きくなる場合がございますが、そちらは現状対処検討中で、遠くない先でのバージョンアップで解消する予定です)。

その上でご質問の点ですが、該当する方法(別々にシーン上に実体化する方法)では、透明度を外部から制御する方法は、現状存在いたしません。 (SS5PUの再生スクリプトを改造すれば可能ではあるのですが……)

フェードを制御しているのが、Unityのアニメーション機能での場合、かなり複雑な改造が必要となります。

もし、支障がない場合、透明度を制御するアニメーション(ここからインスタンスパーツで必要なアニメーションをインスタンスパーツで呼び出して、必要なフェード処理のアニメーションを、呼出元のインスタンスパーツの不透明度で制御する方法を推奨致します。 また、呼び出されているインスタンスデータを実行中に変更したりする方法は、SS5Player for UnityのGitHub内のWikiに「実験機能」として記載されております。

具体的な方法ではなく大変申し訳ございませんが、まずそちらの方法でご希望の機能実装が行えるかをご検討いただけますと非常に助かります。

pastatsh commented 9 years ago

MasamiYitsuse様

基本的なことで申し訳ないのですが、「インスタンスパーツ」とは何でしょうか? 「呼び出し」とはスクリプト上で行うのでしょうか? sspjファイルに手を加えない形での解決方法はないのでしょうか? よろしくお願いいたします。

MasamiYitsuse commented 9 years ago

pastatsh様

説明不足で大変申し訳ございません。 OPTPiX SpriteStudio(5)での 「インスタンス」機能は、 「アニメーションデータ中から、同じプロジェクト(sspj)内に含まれている任意のアニメーションファイル(ssae)に含まれているアニメーションデータを再生する」 という動作を行います。 (呼び出し側のアニメーションでは、NULLパーツや通常スプライトパーツと同様に、インスタンスパーツという1つのパーツとして扱われます。当然呼び出されている側のアニメーションを更新・変更すると、呼び出している側での画面の出力結果も変わってまいります) (他社製品で恐縮ですが、Adobe AffterEffectなどの「コンポジット」機能などと同様の機能とお考えいただくと、はやいかと思います)


sspjファイルに手を加えない形での解決方法はないのでしょうか?

とのお話ですので、スクリプトの簡易的な改造方法(パッチ充て)をご案内したいと思います。 行頭のスペース(タブ)が消えてしまい、見づらくなって大変申し訳ございませんが……

・「Ver.1.2.0(Alpha-2)以前」「Ver.1.2.1以降」共通 対象リスト: (アセット内)SpriteStudio/Script/Script_SpriteStudio_PartsRoot.cs 本リストの「Script_SpriteStudio_PartsRoot」クラスの中に、以下の記述を追加します。 private float spriteAlpha = 1.0f; public float SpriteAlpha { set { spriteAlpha = value; } get { return(spriteAlpha); } } ※変数自体をpublicにせず、プロパティを使用している理由は、spriteAlpha自体をデータのシリアライズに含めず・PrefabをInstantiateした際に、必ず値を初期化させるためです。

以下は「Ver.1.2.0(Alpha-2)以前」「Ver.1.2.1以降」とで対処が変わります。

・Ver.1.2.0(Alpha-2)以前の場合 対象リスト: (アセット内)SpriteStudio/ScriptLibrary/Library_SpriteStudio.cs 対象関数名: UpdateMesh (本名称の関数は1つしかありませんので、この名前で検索下さい) 同関数内に下記の処理がございます。 float RateOpacity = 1.0f; if(null != AnimationDataOpacityRate) { if(0 < AnimationDataOpacityRate.Length) { RateOpacity = AnimationDataOpacityRate[FrameNo]; } } RateOpacity *= ScriptRoot.RateOpacity;

この直後に RateOpacity *= ScriptRoot.SpriteAlpha; を足して下さい。

・Ver.1.2.1以降の場合 対象リスト: (アセット内)SpriteStudio/ScriptLibrary/Library_SpriteStudio.cs 対象関数名: UpdateMesh (本名称の関数は1つしかありませんので、この名前で検索下さい) 同関数冒頭に下記の処理がございます。 float RateOpacity = (null != ScriptRoot) ? ScriptRoot.RateOpacity : 1.0f;

この直後に、 RateOpacity *= ScriptRoot.SpriteAlpha; を足して下さい。

上記の改造を行うことで、再生関数などを持っている「Script_SpriteStudio_PartsRoot」クラスの「SpriteAlpha」メンバを、スクリプトから書き換えることで、アニメーションの不透明度をリアルタイムで操作することが可能です。 ※SpriteAlphaの値の幅は「1.0fが不透明(元のデータのまま)」~「0.0f(完全に透明)」の間になります。

ただし、この方法では、半透明化したいアニメーションデータが「複数のスプライトパーツを重ねて作られている」場合に、「パーツが重なっている箇所が、パーツが別々に透けてしまう」という現象が起こります旨、あらかじめご理解くださいますようお願い致します。 (この症状を起こしたくない場合には、Unity-Proの機能を使って、半透明化したいアニメーションを一度テクスチャにアニメーションをレンダリングしてから、UnityのMesh機能などで表示してやる……という方法しか解決方法はありません。そのあたりは、Direct-XやOpenGL及びその他のゲームエンジンの3D表示の半透明の扱いなどと変わりません)

以上、ご検討の程お願い致します。

追伸: 一応、1.2.0(Alpha-2)の場合も記載しましたが、前記の通り、1.2.0(Alpha-2)は、重篤なバグが数点見付かっておりますため、最新の「Ver.1.2.1(GitHubのWikiの解説では「1.2.1(Alpha-3)」となっております)」かVer.1.1系の最終バージョンの「Ver.1.1.18」をご使用くださいますこと、強く推奨いたします。 (Ver.1.1.18での改造方法は「1.2.0(Alpha-2)」と同じ方法になります)

追伸2: この方法は上記の通り「(パッチ充て)改造」方法になりますので、SS5Player for Unityをバージョンアップした場合には、再度同じ改造を施す必要が生じますこと、あらかじめご理解の程お願い致します。

pastatsh commented 9 years ago

MasamiYitsuse様

改造方法をお教えいただきありがとうございます。 Ver.1.2.1にて、お教えいただいた改造に加え、以下の改造をすることで、 期待する動作(ヒエラルキー上でのフェードアニメーションの付加)が得られました。 お忙しい中ご対応いただきありがとうございました。

Script_SpriteStudio_PartsRoot.cs

private Script_SpriteStudio_Triangle2 parentPart;

void Start()
{
    parentPart = gameObject.transform.parent.GetComponent<Script_SpriteStudio_Triangle2>();
    (無変更)
}

void Update()
{
    if(parentPart != null && parentPart.SpriteStudioData != null){
        spriteAlpha = parentPart.SpriteStudioData.NowOpacity;
    }
    (無変更)
}

Library_SpriteStudio.cs

public void UpdateMesh(Mesh MeshNow, int FrameNo, Script_SpriteStudio_PartsRoot ScriptRoot)
{
    (無変更)
    NowOpacity = AnimationDataOpacityRate[FrameNo];
}

public float NowOpacity { get; private set; }
pastatsh commented 9 years ago

質問とは関係ありませんが、

この画面の右側にあります[Labels]から[question]を選択

こちらも管理者にしかできないと思われます。ご報告まで

MasamiYitsuse commented 9 years ago

pastatsh様 ご要望の動作が実装できたとのことで、安心いたしました。 お手数をおかけいたしましたが、今後とも宜しくお願い致します。

また、Labelsの件について、了解いたしました。 ご報告いただき、有難う御座います。

MasamiYitsuse commented 9 years ago

追記となりますが、2015/4/7現時点でGitHubのDevelopブランチにアップされているVer.1.2.2もしくはVer.1.2.3 (RC)については、UpdateMeshが複数に増えておりますのと、「メモリサイズ優先」「再生速度優先」の2つのフォーマットデータに対応しなくてはならない点から、パッチを充てる箇所が異なってまいります。

Ver.1.2.2以降の改造方法については、1.2.3の正式リリース後に付記させて頂きたく思います。