Unity初心者の備忘録的な何かです。
初投稿なので色々至らないところあるかも。
Unityのステートマシンがめんどくさすぎるので何か手を抜ける方法はないかと探してたもんですが、
何やらUnity公式が配布しているコンポーネントにSimpleAnimationなるものが。
これで楽できる!
と喜んだのも束の間。
isPlayingがfalseにならない
再生が終了したタイミングで処理させたいところがあったので、isPlaying
で再生中かどうか確認。
ところが、アニメーション再生中だけtrue
になるはずのisPlaying
が、待てど暮らせどfalse
にならない。
SimpleAnimation anim = GetComponent<SimpleAnimation>();
if(!anim.isPlaying){ //<- falseのとき動くかんじにしたかった
//実行したい処理
}
元々アニメーション関連は避けて通っていたのでイマイチ原因が分からず詰み。。。
アニメーション名を指定できる関数版のIsPlaying()
でも同じでした。
原因
このまま悶々とするのも嫌なので、SimpleAnimationPlayable.cs
の中身とかを覗いたりしてみました。
どうも、読み込んだAnimationClipのWrapModeがOnceの場合はきちんと終了するようなのですが、
何も設定していないとDefaultで読み込まれてしまい、終了処理に引っかからないみたいです。
自分は外側からWrapModeを設定する方法がいまいち分からなかったので、
SimpleAnimationPlayableのDoAddClip()
中に「WrapModeがDefaultのときはOnceにする」という処理を加えて強引に終わらせる事に。
if(newState.wrapMode==WrapMode.Default) newState.wrapMode = WrapMode.Once;
これでとりあえず終了処理が効くようになりました。
2018/01/27追記:
newStateが取得された直後にOnce
にしてしまうと、AnimationファイルのisLooping
がオンになっていても強制的に単発再生になってしまっていました。よく考えたら当たり前だ・・・
なので、isLooping
がtrue
かどうかを見てから上記のコードを差し込めば、ループも動くようになると思います。
もっといい方法がありそうだけど思いつきません
元のコードとかライセンス的に書いていいのかよく知らないのでこんな説明になっちゃいました。わかりにくい・・・
とにかく、はやいとこ修正来てほしいです