今回はUnityのAnimationウインドウで銃を撃った後の引き金が後ろに下がるアニメーションを作成していきます。
銃はAssetStoreでダウンロードしてきたMakapobを使います。
他の3Dオブジェクトでもかまいませんが、引き金部分が切り離されているモデルでないと出来ません。
上のようにMakapobプレハブをシーン上に配置します。
銃のアニメーションの作成
Animationウインドウを開いた状態でMakapobを選択します。するとAnimationウインドウの方にCreateというボタンが出現するので押します。
するとファイル保存ダイアログが表示されるので、そこにGunShotという名前で保存します。
するとGunShotというAnimファイルとMakapobというアニメーターコントローラーがMakapobのプレハブがあるフォルダに作成されます。
次にAnimationウインドウでCreate New ClipでGunIdleという新しいアニメーションを追加します。
これでGunIdleとGunShotというアニメーションクリップが出来ました。
GunIdleを選択した状態で、Add PropertyでSlide→Transform→Positionの+を押します。
するとキーフレームが打たれるのでそれでGunIdleは終了です。
GunIdleの部分をGunShotに切り替えてください。
GunIdleの時と同じようにSlide→Transform→Positionの+を押します。
フレームの1:00にあるキーフレームは選択しDelキーを押して削除しておきます。
録画の赤い●ボタンを押し、0:05あたりのフレームに移動し、Slideの位置を後ろに移動させます。
0:00のフレームでCtrl+Cでコピーします。その後0:10にフレームを移動させCtrl+Vで貼り付けます。
上のような感じになります。
実際のアニメーションは上のようになります。AssetsフォルダのGunShotアニメーションクリップファイルを選択し、インスペクタでLoopTimeにチェックが入っている為、繰り返し再生されてしまいます。チェックを外してください。
これでアニメーションが完成したので、アニメーターコントローラーでアニメーションの遷移を作成します。
Makapobを選択し、Animatorウインドウで遷移を作成します。
アニメーションパラメータにTriggerのShotを作成します。
GunIdleをデフォルトの状態にし、ShotがトリガーされたらGunShotに遷移するようにします。
GunShot→GunIdleはHasExitTimeにチェックを入れ、アニメーションが再生されたら勝手にGunIdleに戻るようにします。
遷移は上のように作ります。
GunIdle→GunShotのTransitionは上のように設定します。
GunShot→GunIdleのTransitionは上のように作ります。
GunShot→GunIdleのSettingsのInterrupt SourceをNext Stateにします。これは銃を連続で撃った時にアニメーション途中でも次の状態へと素早く遷移させる為です。
AnyState→GunShotへはHas Exit Timeのチェックを外し、条件にShotがトリガーされた時を入れます。
AnyStateからGunShotへ遷移させるのはGunIdleやGunShot状態のどちらにいる時でも連続で銃のアニメーションをさせる為です。
これでアニメーション、アニメーターコントローラーが出来上がったので、装備させている銃のオブジェクトのAnimatorにMakapobアニメーターコントローラーを設定してください。
Animatorがない場合は追加してください。
銃のアニメーションの作成に使ったシーン上に配置したプレハブは削除してかまいません。
銃のアニメーションをさせる処理を銃を撃った時の処理スクリプトに追加
最後にアニメーションを再生させるアニメーションパラメータのShotをトリガーするスクリプトを作成します。
今まで作って頂いている方は銃を撃った時の処理をしているShotスクリプトのJudgeShotメソッドの中に追記します。
それ以外の方は銃を撃つスクリプトの個所に追加になります。
1 2 3 | private Animator gunAnimator; |
をShotスクリプトに追加します。
銃の情報を取得しているメソッドInitializeGunメソッドに銃のAnimatorを取得する処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 | // 銃の情報を取得 public void InitializeGun(GameObject weapon) { raserPointer = weapon.GetComponentInChildren<LineRenderer>(); shotLight = weapon.GetComponentInChildren<Light>(); audioSource = weapon.GetComponentInChildren<AudioSource>(); muzzle = weapon.transform.Find("Muzzle"); gunAnimator = weapon.GetComponent<Animator>(); bulletText.text = myStatus.GetNumberOfBullet().ToString(); } |
を追加します。
InitializeGunメソッドは武器を切り替えて銃だった時に呼び出され、その銃のゲームオブジェクトの情報を受け取るのでそこでweaponからAnimatorを取得しています。
あとは銃を撃った時の処理であるJudgeShotメソッド内に銃のAnimatorのアニメーションパラメータのShotをトリガーする処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 敵に弾が当たったかどうか public void JudgeShot() { // 弾がなければ弾がない時の効果音を鳴らしreturnで以降の処理をさせない if (myStatus.GetNumberOfBullet() <= 0) { PlaySE(noBulletSE); return; } // 銃のアニメーション gunAnimator.SetTrigger("Shot"); // 銃の発砲の光を表示 AbleLight(); // 銃の発砲音を鳴らす PlaySE(shotSE); |
それではUnityの実行ボタンを押して確認してみましょう。
ここまででもしかしたら銃がぶれてしまう!
という方がいるかもしれません。
わたしもそれにはまってしまって、原因不明でしたが・・・。
何の事はない、アニメーションのところでSlideのTransformだけでなく、Makapob本体のTransformも変更していたせいです。
GunIdleのアニメーションを作成した時にMakapob本体のTransformのプロパティも追加されてしまっている場合は削除してください。