SpriteStudio / SS5PlayerForUnity

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

全般 再生後のアニメーションの変更について #126

Open nunnnu opened 9 years ago

nunnnu commented 9 years ago

http://befool.co.jp/blog/ayumegu/unity-study-SpriteStudio/  こちらのサイトを参考に表示させてみたのですが アニメーションは再生されましたが、 spriteStudioRoot.AnimationPlay の行で 【NullReferenceException: Object reference not set to an instance of an object ○○○.Start () (at Assets/Resources/Script/mirai.cs:18)】 とのエラーがでてしまい、アニメーションを変更できずにいます。 対処法ございますでしょうか

MasamiYitsuse commented 9 years ago

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

起こっている事象から類推した対処法となりますが、まず下記の点を試してみてくださいますようお願いいたします。

  1. AnimationStartを1ループ後のタイミングで行ってみてください。 インポートした制御用Prefabを使用した場合ですと、Script_SpriteStudio_LinkPrefab.csを使用して実際のPrefabをInstantiateしている関係から、使用しているアニメーションのPrefabが安定起動するのに、1ループ分必要としてしまいます。 そのため、Instantiateした直後にアニメーションを変更した場合、Script_SpriteStudio_PartsRootが持っている資産が安定していないか・そのGameObjectが実体化できていないために、エラーが出ていることが推測されます。
  2. Monoへの実行優先度設定で「Script_SpriteStudio_LinkPrefab.cs」の値を「-2」「Script_SpriteStudio_AnimationReferenced.cs」の値を「-1」(他のスクリプトよりも実行優先度を高くする)に設定してみて下さい。 これは、1と同時に行う必要があるのですが、UnityではMonoに対してスクリプトの実行順序を明示(スクリプトの実行順序を指定しないと)しないと、全てのスクリプトの動作優先順位が同位となり・各スクリプトの動作順序が不定になる仕様があります。 そのため、本スクリプト群を通常のスクリプトより実行優先度を高くしておくと、Instantiateした次のループでの実行安定性が増すかと思われます。 ※参考にされているサイトは、SS5PUのVer.1.1.xをベースに記載して頂いておりますが、Ver.1.2.x系から内包していたアニメーションデータが別データとして外部に出された関係から、この処置が必要になる場合があることが想定されます。

以上となります。 まず、上記2点を行ってみて頂けますようお願いいたします。 その上で、まだ状況が改善しないようであれば、アニメーションを再生している部分のスクリプトと・シーンへの設置方法(Unity上で直接配置しているのか・スクリプトから設置しているのか)などの情報をいただけますと助かります。

お手数をおかけいたしますが、何卒今後とも宜しくお願いいたします。

MasamiYitsuse commented 9 years ago

また、追加情報となりますが、上記URLの記事を参考とせず、自力でScript_SpriteStudio_PartsRootを取得してアニメーション制御する方法については、

・本GitHub内Wikiページ内の「スクリプトリファレンス」 https://github.com/SpriteStudio/SS5PlayerForUnity/wiki/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9 内にあります「制御用GameObject等からのScript_SpriteStudio_PartsRootの取得」などもご参考いただけるのではないかと思われます。

何卒よろしくお願いいたします。

nunnnu commented 9 years ago

詳しい解説ありがとうございます。 上記2点 やってみましたが結果は変わらずでした。 最初のスクリプトは、最初に貼った講座のスクリプトそのままで、 現在は Update()にて 20ループ目で一度だけ spriteStudioRoot.AnimationPlay を実行させている状態です。 シーンへの設置は プロジェクトからヒエラルキーへ直接 View3D→○○_Control で行っています。

MasamiYitsuse commented 9 years ago

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

情報ありがとうございます。 例えば、上記URLのサンプルの形(Start関数の中でアニメーションを発行)ではなく、「~_Control」のGameObjectにつけるC#スクリプトの内容を下記の形にしてみるとどのような挙動になりますでしょうか? ※本リストを記載するスクリプトは、「スクリプトのボディ名と同名のクラス名」かつ「MonoBehaviour」クラスを継承したクラスの中に記載されるものとします。

private Script_SpriteStudio_PartsRoot ScriptRoot = null;
private int animationNoPrevious = -1;
private int animationNo = -1;
public int AnimationNo
{
    get
    {
        return(animationNo);
    }
    set
    {
        animationNo = value;
    }
}
void start()    
{
}
void Update() 
{
    if(null == ScriptRoot)
    {
        int Count = transform.childCount;
        Transform InstanceTransformChild = null;
        for(int i=0; i<Count; i++)
        {
            InstanceTransformChild = transform.GetChild(i);
            ScriptRoot = InstanceTransformChild.gameObject.GetComponent<Script_SpriteStudio_PartsRoot>();
            if(null != ScriptRoot)
            {
                break;
            }
        }
    }
    if((null != ScriptRoot) && (animationNo != animationNoPrevious))
    {
        ScriptRoot.AnimationPlay(animationNo);
        animationNoPrevious = animationNo;
    }
}

このコメントにいきなりザラ書きしたため、コンパイルエラーが出るかもしれませんが、その点申し訳ございません(エラーの内容は恐らく単純な変数名などのタイプミスによるものだと思われます)。

その上で、上記のAnimationNoプロパティを他のスクリプト等から書き換えることによって、インスタンス化したアニメーションが安定した(と思われる)段階で、「~_Control」の子についているアニメーションの再生が開始されます。 ※また初回再生開始以降でも、AnimationNoプロパティに他の値を与えると、アニメーションが切り替わるはずです。

もし、この方法でも状況が改善しない場合、もしご支障がなければ、ご使用のUnityのバージョン(Win/Mac.の動作OS情報と、Unity自体のバージョン情報をいただけますと非常に助かります)と一緒に本症状が起こるUnityのプロジェクト(本来のプロジェクトそのものでなく、症状が起こるデータとスクリプトを含んだものであれば問題ありません)を、SpriteStudioのサポート宛てに、「本GitHubのIssue-126のサンプルデータ」である旨をお書き添えて頂き、メールに添付ないし何らかの方法でデータをご送付の上・ご質問頂ければ、より具体的に動作状態を検証し・解消方法のご案内やスクリプトを直接書き換えて提供できるかと思われます。 ※その際のプロジェクト内容の守秘などについては厳格に扱い、ご質問が解消された時点で当方の環境からその一切を削除することをお約束いたしますので、ご安心下さい。 ※プロジェクトをご送付いただく際には、「Unityのプロジェクトが格納されているフォルダ内のAssetsのフォルダをZIPなどでフォルダごと圧縮していただく」か「Unity上からプロジェクトの内容を全て選択して、パッケージにエクスポートしていただく」ことをお願いいたします。また、その際に、症状が起こるサンプルのシーンをプロジェクト内に入れておいて頂けますと、非常に助かります。 ※また、お手数でなければ、インポートした元のSS5のデータも添えて頂けますと、SS5PU自体のバグなどであった場合の検証が楽になるため、非常に助かります。

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

MasamiYitsuse commented 9 years ago

また、Ver.1.2.xでは、AnimationPlayなどの関数の引数などが、(Ver.1.0.xやVer.1.1.xなどの以前のバージョンと比較して)大きく追加等が行われております(上記サンプルリストでは、引数の省略記載を行っておりますことにご注意ください)。 そのため、前記Wiki内のスクリプトリファレンス(特に「Script_SpriteStudio_PartRoot」と冒頭の4項目の諸注意事項について)をご一読頂けますと幸いです。

nunnnu commented 9 years ago

上記スクリプトで動きました! ありがとうございます!! 大変お手数おかけ致しました。

MasamiYitsuse commented 9 years ago

お世話になっております。 ご提案したスクリプトで動作したとのことで、心から安堵しております。 少々扱いに癖があるプレーヤとは思いますが、今後とも皆様からのご要望やご質問などを反映して、より使いやすいプレーヤになるよう努力していきますので、何卒よろしくお願い致します。

DKAlpha commented 9 years ago

検索しやすいタイトルに変更いたしました。