Unityで銃を撃つ #6 右クリックで照準器を覗き込む

投稿者: | 2020-01-06


右クリックで照準器を覗き込むアニメーションを付けます。

まず銃のオブジェクトを選択して、AnimationウィンドウでCreate New Clip…をクリックし、新規アニメーションの名前を付けて保存します。

Add Propertyで、PositionとRotationを追加します。

キーフレーム(白い縦線)を1:00のところに移動し、録画ボタンを押します。

ゲーム画面を見ながら、シーン上やインスペクタで銃の位置と回転を調節します。

終わったら録画ボタンをもう一度押して確定します。これでデフォルトの状態からこの状態までのなめらかなアニメーションができます。

Transfromの値をコピペすることもできます。キーフレームを好きな場所に置き、Transformの歯車アイコンからCopy Componentをクリックすると、Transformの値がコピーされます。

キーフレームを移動して録画ボタンを押し、同じ歯車アイコンからPaste Component Valuesをクリックして値をペーストできます。

他のアニメーションの値に揃えたいときなどに便利です。

アニメーションを作ると、アニメーターコントローラーに新しいステートが作られます。このステートでは今作ったアニメーションが再生されます。もともとあったステートとは別にこのステートを使いたいので、レイヤーを分けてみます。
このステートを選択して、右クリックからCopyをクリックします。

「Layers」の+ボタンから新しいレイヤーを作ります。

何もないところで右クリックして新しいステートを作ります。

すると、このステートが自動的にオレンジ色のデフォルトのステートになります。

また何も無いところで右クリックして、今度はPasteをクリックします。

すると新しいアニメーションが付いたステートがペーストされました。

オレンジのステートを選択して右クリックMake Transitionで矢印を出し、灰色のステートをクリックして遷移を作ります。

遷移の条件を作る

「Parameters」の+ボタンからTriggerのパラメーターを作ります。

今作った遷移の矢印をクリックして、インスペクタのConditionsでこのパラメーターを選択します。

遷移はこのパタメータがスクリプトでセットされたときに行われます。

Animator.SetTrigger("LookIn");

Has Exit Timeのチェックが入っているときは、設定した時間がたったときにパラメータの条件が揃っていれば遷移します。

別レイヤーのアニメーションが再生されない

新しく作ったアニメーションとは逆の動きをするアニメーションを作り、そのアニメーションがついたステートをこのレイヤーに追加して遷移を付けました。

白い矢印にはすべて同じパラメータの条件が付いています。

そして、スクリプトで、右クリックを押したときと離したときにトリガーがセットされて、ステートが遷移するようにしました。

if (Input.GetMouseButtonDown(1))
{
    gunAnimator.SetTrigger("LookIn");

}
else if (Input.GetMouseButtonUp(1))
{
    gunAnimator.SetTrigger("LookIn");

}

ステートをクリックするとインスペクタ上でアニメーションのスピードを設定できるので10に上げました

また、Motionに設定されているアニメーションをダブルクリックするとアニメーションのインスペクタを見れます。

ここでLoop Timeのチェックを外して、アニメーションが一度だけ再生されるようにしました。

これでゲームを実行してみると、銃弾を発射したりリロードしたりするようなBase Layerのアニメーションは再生されますが、新しく作ったレイヤーのアニメーションは再生されません。
これはレイヤーの歯車マークからWeightを1にすると治ります。

これで、覗き込むアニメーションは動きますが、素早く覗き込むたびに銃の位置が移動してしまいます。

覗き込むアニメーションが途中で終わってしまうのが原因です。

アニメーションがずれる

これを解決するために、遷移の矢印のインスペクタでHas Exit TimeのチェックをいれてExit Timeを1にしました。

これでアニメーションの再生が100%になったときに遷移すると思ったのですが、まだ少しずれます。

再生が完了したかどうかを、normalizedTimeプロパティで知ることで解決できました。
https://docs.unity3d.com/ja/current/ScriptReference/AnimationState-normalizedTime.html

if (Input.GetMouseButton(1) && gunAnimator.GetCurrentAnimatorStateInfo(1).normalizedTime >= 1 && (gunAnimator.GetCurrentAnimatorStateInfo(1).IsName("LookInAnimation2") || gunAnimator.GetCurrentAnimatorStateInfo(1).IsName("New State")))
{
    gunAnimator.SetTrigger("LookIn");

}
else if (!Input.GetMouseButton(1) && gunAnimator.GetCurrentAnimatorStateInfo(1).normalizedTime >= 1 && gunAnimator.GetCurrentAnimatorStateInfo(1).IsName("LookInAnimation"))
{
    gunAnimator.SetTrigger("LookIn");

}

また、マウスの左クリックを押した時と離したときで分けるのではなく、マウスが押されている状態とマウスが押されていない状態で場合分けするようにしました。
マウスのオンオフによる動きが逆になったりしていましたがこれで解決しました。

例えば、覗き込むアニメーションが再生されている間にマウス左クリックが離されて、再度クリックされなかったというときは、アニメーションが終わったらすぐに覗き込むのをやめるアニメーションに移ります。

コメントを残す

メールアドレスが公開されることはありません。