LoginSignup
10
7

More than 5 years have passed since last update.

SimpleAnimationでisPlayingが常にtrueを返す件

Last updated at Posted at 2018-01-24

Unity初心者の備忘録的な何かです。
初投稿なので色々至らないところあるかも。

Unityのステートマシンがめんどくさすぎるので何か手を抜ける方法はないかと探してたもんですが、
何やらUnity公式が配布しているコンポーネントにSimpleAnimationなるものが。
これで楽できる!
と喜んだのも束の間。

isPlayingがfalseにならない

再生が終了したタイミングで処理させたいところがあったので、isPlayingで再生中かどうか確認。
ところが、アニメーション再生中だけtrueになるはずのisPlayingが、待てど暮らせどfalseにならない。

AnimationTest.cs
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がオンになっていても強制的に単発再生になってしまっていました。よく考えたら当たり前だ・・・
なので、isLoopingtrueかどうかを見てから上記のコードを差し込めば、ループも動くようになると思います。
もっといい方法がありそうだけど思いつきません:pensive:

元のコードとかライセンス的に書いていいのかよく知らないのでこんな説明になっちゃいました。わかりにくい・・・
とにかく、はやいとこ修正来てほしいです:cry:

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7