前の記事で攻撃可能ステートから攻撃中のステートへ遷移している間はまだ攻撃可能ステートに留まっていると思ったのですが、遷移中はその後の攻撃中のステートも有効になるようです。
攻撃ステートが有効でマウス左クリックすると攻撃するとしても、遷移中に攻撃ができてしまいます。
if (Input.GetMouseButtonDown(0) && stateInfo.IsTag("Attack"))
わかりにくいですが、遷移中もずっと弾が出ています。AnimatorStateInfoの値をテキストに表示してみると、遷移中は遷移元か遷移先のどちらかしかtrueにならず、MonoBehaviour(text)では遷移中は遷移元がtrueで、StateMachineBehaviour(text_2)では遷移先がtrueになっています。
しかし、遷移元がtrueのときだけ攻撃できるとしても、遷移先がtrueのときだけ攻撃できるとしても、どちらも遷移中に攻撃できてしまうので、遷移中はどちらもtrueになっているようです。
といっても、両方とも同時にはtrueにならないようです。これらはIsTagでもIsNameでも同じでした。
if (stateInfo.IsName("HandGunStay") && stateInfo.IsName("HandGunShoot"))
{
Debug.Log("両方true");
}
よくわからないので、遷移やモーションの長さを変えたりしてみると、弾が途切れるときがありました。
これはStateMachineBehaviourで攻撃可能ステートがtrueのときだけ攻撃できるようにしています。攻撃中のステートへの遷移が終わってから少しの間、弾の発射が途切れています。
よく見ると、このとき攻撃可能ステートの青いバーが消えていて、青いバーが出現するとまた弾の発射が始まります。青いバーが出ているかどうかが、ステートが有効かどうかを表しているのかもしれません。
遷移中は遷移元と遷移先のモーションをブレンドするために両方とも有効になるのでしょうか。モーションをループさせないようにしても、青いバーが右端に到達した状態で、遷移が終わるまで表示され続けます。
なので、攻撃可能ステートに入ってから攻撃するまでの間だけ攻撃可能にしたいというときは、前の記事のようにStateMachineBehaviourのOnStateEnterなどを使って、Bool型の変数の値を切り替えるのが良いと思います。
OnStateEnterが呼ばれるのは青いバーが表示されるタイミングのようです。
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (stateInfo.IsTag("Attackable"))
{
attackable = true;
}
}
攻撃ステートのモーションが終わる前で、遷移が始まった時にtrueになっています。これらのタイミングは遷移の矢印をクリックしてインスペクタで変更できます。