ユニティちゃんの2D横スクロールアクション(その5:アニメーション管理中編)【チュートリアル】

ども、ゴコーです。 アニメーション管理の中編行きます。まずは横移動から。 前回までで、走りアニメーション、及びジャンプアニメーションを作成しました。 今回からは、それぞれのアニメーションを入力と条件によって切り替えて行きます。


uni-tu-5-0 Animatorタブをクリックして下さい。 少し前に見たときよりもかなり配置されている四角形が増えましたね。 これは前回のパートで追加したアニメーションです。 これからこれらのアニメーションをつなぐために色々と操作をする必要があるのですが、このままでは少々扱いずらいので並び替えてみましょう。


Tips 普通ならばアニメーション作成→プロジェクトウィンドウからアニメーターウィンドウに設置という作業が余計に必要になるのですが、アニメーション管理したいオブジェクトを選択した状態で前回のようにアニメーションを追加していくと、 このように最初から配置された状態になります。手間はほとんどかわりません。


uni-tu-5-1 ざっと並べてみるとこんな感じです。 一番始めに追加したアニメーションはオレンジ色になっていますが、これはこのアニメーションが最初に再生されることを表しています。違うアニメーションを基準にしたい場合はアニメーションを選択し、右クリックから「Set As Default」を選択してください。


uni-tu-5-2 アニメーションを遷移させるために必要な「トランジション(Transition)」という矢印みたいなものを作成します。 アニメーションを右クリックし、「Make Transition」を選択して下さい。


uni-tu-5-3 矢印がマウスカーソルについてくると思うのでその状態で別のアニメーションをクリックして下さい。 画像では走り始めのアニメーションをクリックしました。 すると、画面のように矢印がそのアニメーションに接続されたと思います。


uni-tu-5-4.1 同様に走り始めから走り中のアニメーションへのトランジションを作成してください。 その状態でゲーム再生ボタンを押すとアニメーターウィンドウで待機→走り始め→走り中へと青いバーが進行し、 同時にゲームウィンドウでもユニティちゃんのアニメーションが遷移していったと思います。 これがアニメーション遷移です。 uni-tu-5-4 接続された矢印をクリックしてインスペクターを見て下さい。 その中にある「Conditions」というのがアニメーション遷移の条件です。 最初からある「Exit Time」とはアニメーションの再生が終わった回数、つまり何回ループしたかを表しています。 デフォルトでは1回再生したら遷移するように設定されています。 だから上記の様にそれぞれ1回再生したら次の動きに移行したのですね。 最後の走りアニメーションから遷移しないのは次のアニメーションに移るためのトランジションを作成していなかったからです。 これでアニメーション遷移には トランジションと遷移条件が必要であることが分かりました。 でも、デフォルトである遷移条件はExitTime1つだけなので、次は追加してみましょう!


uni-tu-5-5 アニメーターの左下にある「Parameters」の右端のプラスをクリックするとこのようにフラグ候補が出てきます。 今回は Bool を選択します。表示された New Bool を isRunning と変更しておいて下さい。 そして、待機→走り始めのトランジションのConditions を ExitTime から isRunning に変更し、true はそのままに。 走り始めはそのままで、走りから待機にもトランジションを追加し、isRunningを設定、trueをfalseに変更してください。 これで、走りフラグが立ったら走り始め、走り出しアニメーションを1回再生したら(一瞬ですが)走りアニメーションに移行し、 走りフラグが倒れたら待機モーションに移行する、という流れができました。 実際にこれを制御するのはスクリプトからです。スクリプトを書きましょう。


まずは_cTransformの下辺りに

[csharp]

public Animator cAnimator
{
get
{
if(!_cAnimator)
_cAnimator = GetComponent();
return _cAnimator;
}
}
Animator _cAnimator;

[/csharp]

と書いて下さい。 cTransformなどと同様、ユニティちゃんのアニメーターをキャッシュしています。 アニメーターも毎フレームアニメーションの管理用に呼ばれると思いますが、キャッシュしておかないと毎フレームGetComponent()が呼ばれるので書いておいた方が良いですね。


次は、InputCheck() の下辺りに

[csharp]

void MecCheck()
{
bool isRunning = InputHorValue != 0;
cAnimator.SetBool("isRunning",isRunning);
}

[/csharp]

と書いて下さい。 横移動のフラグ isRunning は左右の入力がある状態(InputHorValue != 0)だと true になります。 先ほどキャッシュしたアニメーターから、SetBool を使ってアニメーション管理用にフラグをセットします。 SetBool の第一引数はAnimatorウィンドウで設定したフラグ名、第二引数はそれに適用するフラグになります。 訳が分からない人もとりあえず手を動かしましょう。 近いうちにきっと分かります(経験者)


後は Update() 内に MecCheck(); と書いて下さい。 これでフラグの接続が完了しました。 ゲームを再生してみましょう。 uni-tu-5-6 オーケーです。 Animatorウィンドウでも接続されているのが確認できますね! では次回はジャンプとの接続をやってみましょう! では、また。

Comments

comments

スポンサーリンク
336*280px

コメント

  1. 田中 より:

    はじめまして、参考にさせて頂いてます
    ここまで同じように、コードを書いてきたのですが、上に書いてあるように追加すると
    “error CS0411: The type arguments for method `UnityEngine.Component.GetComponent()’ cannot be inferred from the usage. Try specifying the type arguments explicitly”
    というエラーが出てしまうのですが、どうしたら解決できるのでしょうか

  2. backlight1144 より:

    田中さん、初めまして。
    おそらく「get」辺りの一部分が抜けているのではないかと思われます。

  3. のあ より:

    こんにちは最近ゲームを作ってみたいと思い参考にさせてもらってます
    Error CS0411: メソッド ‘UnityEngine.Component.GetComponent()’ に対する型引数を使い方から推論することはできません。型引数を明示的に指定してください。 (CS0411) (Assembly-CSharp)
    とエラーが出ます。
    どうすればいいでしょうか?

  4. backlight1144 より:

    のあさん初めまして
    Animatorの辺りでしょうか?
    でしたら、
    GetComponent();
    という様に変更すれば良いかもしれません

  5. こっぺぱん より:

    最終的にどういうプログラムになったのか書いていただけると助かります

  6. backlight1144 より:

    こっぺぱんさん
    初めまして

    ご指摘ありがとうございます!
    実は、未完な上にターゲットが初心者なのか分からない情報も載せすぎているのでチュートリアル全体を一から作り直そうか悩んでたりするんですよね…

  7. こっぺぱん より:

    ここの工程において上のお二方と同じエラーが出たので、実際に動作を確認できたプログラムがあるといいなと思いコメントさせていただきました。

    一から作ることの大変さは察しますが、ここを参考にする方も多いと思うので是非作っていただきたいです。

  8. backlight1144 より:

    実際のプログラムはもっと先の方まで出来ているので載せるのは難しいです。
    すみません。

    チュートリアルとしては、とりあえず今は無理ですが9月中旬には再スタートしたいと思います!
    今しばらくお待ち下さい!

    あと、こんな内容も欲しいということもあれば描いて頂けると反映できると思いますのでよろしければそちらもよろしくお願いします!

  9. のあ より:

    こんにちはこの前エラー文を乗せたのあです
    どうしてもエラーを治せなかったのでもう一度質問させていただきます
    public Animator cAnimator
    {
    get
    {
    if(!_cAnimator)
    _cAnimator = GetComponent();
    return _cAnimator;
    }
    }
    Animator _cAnimator;

    このように文を打ってもまえの様にエラーが出ます。
    この前のGetComponent();は何処に打てばよろしいのでしょうか?

  10. backlight1144 より:

    のあさん
    このように修正してみて下さい。

    public Animator cAnimator
    {
    get
    {
    _cAnimator = _cAnimator ?? GetComponent<Animator>();
    return _cAnimator;
    }
    }
    Animator _cAnimator;
    WordPressの特徴で、 < は普通に入力しても表示されないという特徴があるということを失念しておりました。
    大変申し訳ありません!

    • もち より:

      はじめまして、現在このチュートリアルを参考にゲームを作っているものですが、のあさんの質問の回答にあった

      public Animator cAnimator
      {
      get
      {
      _cAnimator = _cAnimator ?? GetComponent();
      return _cAnimator;
      }
      }
      Animator _cAnimator;

      ではアニメーションが待機のままでこのようなバグが発生するようになりました。

      NullReferenceException
      UnityEngine.Animator.SetBool (System.String name, Boolean value) (at C:/BuildAgent/work/d3d49558e4d408f4/artifacts/EditorGenerated/AnimatorBindings.cs:185)
      UnityChanController.MecCheck () (at Assets/Script/UnityChanController.cs:66)
      UnityChanController.Update () (at Assets/Script/UnityChanController.cs:51)

      • backlight1144 より:

        <Animator>
        が例によって入力できていないものと見て返答しますと、Mecanim側でisRunningを設定し忘れているのではないでしょうか。
        NullReferenceExceptionというのは、「値がある、って指定されたからからアクセスしようと思ったけどそんな値ないよ…」っていう例外処理です。
        さらに言うと、(UnityChanController.cs:51)みたいに.cs:数字というのはその数字の行に何か問題があるよ!っていうMonoからの通知だったりします。
        ということで今回の場合は、isRunningっていうBool値がないのではないでしょうか?

  11. もち より:

    こんにちは、先週は返信してくださってありがとうございます、ソースを書き換えて下のように変えたらうまくうごきました。最近またチュートリアルを直してるようですね、応援してます!がんばってください!

    public Animator cAnimator
    {
    get
    {
    if(!_cAnimator)
    _cAnimator = GetComponent();
    return _cAnimator;
    }
    }
    Animator _cAnimator;

  12. micro より:

    もちさんと同じエラーが出ました。
    Mecanim側のisRunningが設定されているのを確認しました。
    待機から走りのConditionをisRunningにしてtrueに設定し、走りから待機をfalseに設定しましたが、うまくいきませんでした。
    のあさんの質問の回答にあったプログラムを打ち込んでも下のエラー文が出てくるだけです。大変申し訳ございませんがご返答のほどよろしくお願いします。

    NullReferenceException
    UnityEngine.Animator.SetBool (System.String name, Boolean value) (at C:/BuildAgent/work/d3d49558e4d408f4/artifacts/EditorGenerated/AnimatorBindings.cs:185)

  13. backlight1144 より:

    でもダメでしょうか?

  14. micro より:

    試してみましたがだめでした。
    もう一度Animationの矢印をつけるところからひとつずつ確かめつつ実行してみましたが、やはりプログラムを書き込むところで行き詰ってしまいます。

    • backlight1144 より:

      分かりました。では、
      <pre>
      </pre>
      で囲ってコードを全て見せてもらえませんか?
      明日になると思いますが回答させていただきます。

  15. micro より:

    長文になるためか403Errorがでてしまい、コードをコメントで送信ことができませんでした。

  16. micro より:

  17. micro より:

  18. micro より:

  19. micro より:

    見づらくて申し訳ございません。
    よろしくお願いします。

  20. backlight1144 より:

    ありがとうございます
    僕がコメント欄で書いたAnimatorの部分と見比べてみてください
    microさんの上げて下さったスクリプトが使ったものそのままなら決定的な違いがあります。