GP09

アニメーション制御

前回の続き:

以下の作業では、

シーン MiniGame のオブジェクトのPrefab化

により、Playerなどを修正した際に一括して修正が反映されるようする。


Roll a Ball のシーンのオブジェクトをPrefabと置き換えていく

シーン MiniGame を編集する

(1/6) NorthWallをPrefab化する
※AudioSourceとWallBumpスクリプトの設定はGP08の資料で設定済みであることに注意

(2/6) WestWallを選択してInspectorのTransformのメニューから Copy -> Component で値をメモする。

(3/6) WestWall を PrefabのNorthWallで置き換える
操作方法:

Ctrlキーを押したまま PrefabNorthWall HierarchyWestWall DnDする

※このときNorthWallは2個になる。WestWallが2個目のNorth Wall(1)になるためである


(4/6) メニュー  Replace Prefabで置き換える

(5/6) NorthWall(1)の Transform のメニューから Paste -> Component Values でメモしたWestWallの値に回復する


(6/6) NothWall(1)の名前を WestWall に修正する


残りの East  South  の各壁も同様にしてPrefabで置き換える

今度は  Reconnect Prefab するコンポーネントの値はNorthWallプレファブで上書きされずに元の値を保つ

Walls をPrefab化する。下の階層のNorth Wall、South Wall、East Wall、West Wallも一緒に纏めてPrefab化される。

Prefabのネスト:

Prefabを他のPrefabを使って組み立てることができる。Prefabの中にPrefabが入る入れ子構造になる。

WallsをヒエラルキーからPrefab化すると下の階層にある東西南北の4つの壁もPrefabになる

PlayerをPrefab化する。 


Prefabリンクするオブジェクトに注意

Script や Sound や他のPrefabなどProjectのAssetに所属するオブジェクトはPrefabのコンポーネントのスロットにリンクできる。
しかし、シーンのヒエラルキーにあるゲームオブジェクトはPrefabからは参照できない。


Prefab化したPlayerのPrefab編集画面を確認する。
Inspectorを開いてScriptのスコア表示などのUI部品を接続した部分を確認すると、None 状態になっている。

一方で、HierarchyのPlayerオブジェクトのScriptのスロットにはHierarchyに配置されたUI部品がセットされている。

PrefabPlayerに対してUI部品もPrefab化して設定する。


PlayerprefabのUI部品へのリンクを以下の手順で修正する。


PlayerSetゲームオブジェクト追加

(1/4) EmptyのGameObjectをヒエラルキーに新規追加する。

(2/4) 名前を PlayerSetに修正する。

(3/4) Main Camera 、 Canvas 、 EventSystem 、Player をこのPlayerSetオブジェクトの下に配置する。

(4/4) PlayerSetをPrefab化する。

Prefab化された Player と Camera と Canvas UI は、お互いにコンポーネントのスロットから参照できる。

第2シーン  MiniGame 1 のWalls をPrefabに置き換える(Ctrlキー+DnD


Player と Main Camera と Canvas と EventSystem を削除する


PlayerSet を Prefabから追加する

応用:

上記の作業ではPlayerとスコア表示などのUIをセットにしてPrefab化したが、Playerとは独立したUI用のレイヤーを別のシーンに用意してゲームシーンに化させる工程も検討するとよい。
参照:

https://dolphinetech.com/unity/scene-road-unload/

https://www.hanachiru-blog.com/entry/2020/05/18/120000

https://gamebiz.jp/?p=218949

Unityのアニメーションクリップの作成


Scene をコピーしてアニメーションオブジェクトの設定練習用にする。


MiniGame 1を複製(Ctrl + D)してMiniGame 2 を作成し、複製したシーンで以下の演習を進める。MiniGame2が既に存在する場合は適当な名前のシーンを作成して進める。


プロジェクトに Animations フォルダを作成する


シーンにHierarchyから Cylinder を追加する

名前を piston に修正


Hierarchypistonを選択


piston  を  player と重ならない適当な位置に移動する

 例)Transform の position を  x, y, z = 1, 0,  5

animation windowを開く。


メニュー Window → Animation → Animation

Animation windowはConsoleなどと同じ場所にドッキングさせておく

Animationウィンドウでアニメーションクリップを作成する。

(1/5) create を押す。

ProjectのAnimationsフォルダを選択する。

AnimationClipに名前を付けて保存する。

アニメーションのファイル名 p_anim.anim


ゲームオブジェクトpistonのInspectorを確認する:

Animator  ← 自動的に追加されたコンポーネント

Controller piston ← 自動的に追加された pistonコントローラー

  (2/5) AnimatorコンポーネントのControllerの

pistonコントローラーをダブルクリックして Animator window を開く。

p_anim ステートが自動的に追加されている。

(3/5) Animation window の作業に戻る。

add property を押す。

Transform  を選び Position + ボタンから追加する

(4/5) 記録ボタンを押すpistonを動かしてアニメーションを記録する。


再生ヘッド(縦線) 0フレーム に戻す


先頭のキーフレームを選択


Scene編集画面で

piston の Y を調整する(床から少し見える程度の位置にする)

※この調整はAnimationウィンドウで行ってもよいしScene編集ウィンドウでpistonを直接移動させて修正してもよい。


再生ヘッド(縦線) 中間フレーム(30) まで進める

add keyframe ボタンを押してキーを追加する。(記録中はキーは自動的に追加されるので、この作業は省略可能)

pistonの Yを上げる


再生ヘッド(縦線)を最終フレームまで進める

最後のキーフレームを選択

pistionの Y を先頭のキーフレームのYと同じ値にする(ループアニメーションにした際にスムーズに繋げるために)

(5/5) 記録を終了する。



再生ボタン、または再生ヘッド(縦線)を操作してアニメーションの様子を確認する。

公式マニュアル参照 Using the Animation view

アニメーションカーブを確認する。

Animation window を Curves 表示に切り替える。

カーブエディタ上の操作
A キー でカーブ全体を選択
F キーで選択したカーブをエディタにフィット
マウスで範囲選択してカーブを選択

うまくできていないようなら調整する。

応用 アニメーションの加減速の解除と設定:


中間フレームのカーブの編集点を選択する

アニメーションの加減速(イージング)

キーのカーブ調整用のハンドルで調整する

カーブのキーを右クリックしてメニューを表示する。
左右の方向毎にカーブのタイプを変更できる。
Left Tangent

Right Tangent を選択後、

カーブではなく直線(加減速なし)に設定するには Linearを選択する。

メモ:Right と Left両方を Linear にすると物に衝突して跳ね返るような動きになる。
Linearから元のカーブに戻すには、Clamped Auto を設定する。

シーンを再生して piston の動作状況を確認する。

アニメーションと衝突判定の精度について:

参照:

公式マニュアル CCD (連続的衝突判定)

最適な衝突判定を即選択。Collision Detection 早見表【Unity 2018.3 以降】


ゲームステージのオブジェクトの移動やプレイヤーの移動速度によっては物理シミュレーションの衝突判定に失敗する場合がある。

例) 壁をすり抜けるなど


Player ゲームオブジェクトに取り付けた Rigidbody の設定を変更することで高精度の衝突判定をUnityにさせることができる。

ゲームオブジェクトのPlayerのInspectorからRigidbodyコンポーネントを表示する。

Collision Detection を

Discrete から Continuous Dynamic

に変更する。
※PlayerをPrefab化したためカスタマイズ項目として青くマークされる。

Prefabに修正内容を適用する。

  方法1:

HierarchyのゲームオブジェクトのPlayerSetを選択

InspectorのPrefabメニューから

Overrides → Rigidbodyの順に選択する。

Apply to All ボタンを押す。

 方法2:

RigidbodyのCollision Detectionを右クリック → Apply to Prefab 'Player'

 ※PlayerのPrefabを編集すれOverride作業は不要だった

2023進捗管理 月5クラス 水1クラス はここまで進んだ。GP08のバグ修正はしていないまま。GP10でバグに対応する。

C#スクリプトによるアニメーションの制御


TriggerAnim の作成

イベントに反応して1回だけ再生されるアニメーションクリップを設定する。


(1/9) Animations フォルダにあるpistonAnimatorを選択

(2/9) Ctrl +Dで複製

(3/9) 複製でできたpiston(1)の名前を変更

名前 TriggerAnim

(4/9) Hierarchyの piston を選択

(5/9) Ctrl +Dで複製(piston(1)ができる)

(6/9) piston(1)適当な場所に移動

(7/9) piston(1) のInspectorからAnimatorコンポーネントを修正

Controllerを TriggerAnim に変更

apply Root motion を ON

(8/9) Animator ウィンドウを Paramators タブに切り替え

+ ボタンから Trigger を選択

(9/9) 名前をkeyP設定(小文字key+大文字P

コピーしたゲームオブジェクト piston(1) を選択する


animationウインドウの作業:

animation ウィンドウのメニューから Create new Clip を選ぶ

名前を w_anim にして保存する

※ ProjectのAnimationClipを直接ダブルクリックしてもAnimation Windowが開くが、

その手順では▽ボタンから【アニメーションの切替】や【Create New Clip…はできない

add property から transform position にキーを打つ。

フレーム 0 と 60 にキーが追加されるが、編集せずにそままにしておく。※

※60フレーム(1秒間)の動かないアニメーションが作成された

アニメーションのキーは追加しない

pistion(1)の位置も移動しない

→ 静止状態のアニメーションになる

Animator ウィンドウの作業:

AnimationsフォルダのTriggerAnimアニメーターをダブルクリックして開く
または
Hierarchyのpiston(1)を選んでAnimatorウィンドウを開く


w_anim ステートが追加されていることを確認

w_anim ステートを右クリックして Set as Layer Default State する。Entryステートからの矢印が切り替わる。


w_anim ステートを右クリックして make Transition を選ぶ。

p_anim に矢印を接続する。

同様に p_anim ステートから exit ステートに接続する。

pinston(1)のAnimatorのw_animからp_animへのTransitionを選択した状態で※

Inspectorからアニメーションの遷移条件を設定する


Conditions の List is Empty の + ボタンを押す


keyP


を選択して設定する。下の画像参照。

不要なTransitionやConditionsを削除するには、Inspectorから -ボタン を押す。

例)w_animステートに自分から自分への不要なTransitionが設定されているので削除が必要

animator で keyP を ONにしてSceneを再生して動作を確認(最初から動く)

animator で keyP を OffにしてSceneを再生して動作を確認(動かなくなる)

制御スクリプトを追加する。

参照:https://www.atmarkit.co.jp/ait/articles/1501/26/news035_4.html


ProjectのScriptsフォルダにC#スクリプトを追加する。


ファイル名 TriggerKeyP.cs

クラス名 TriggerKeyP


スクリプトをpiston(1)の方にDnDでアタッチする。


アニメーションのタイミングの調整


Animator ウィンドウでTriggerAnimの w_animステートからの矢印を選択

has Exit Time Offにする。

※has Exit TimeがONの状態の場合、w_animの再生が完了するまで p_animに遷移しない。

つまりキー入力に対する反応が悪くなる。

アニメーションを繰り返し再生していると徐々に位置がずれて行く問題に対応:


p_aimのアニメーションカーブを緩い加速→急減速に調整するとずれが顕著になる。元の位置に戻りきらない。


TriggerAnim アニメーターの p_animのアニメーションクリップの再生時間は1秒間。

p_animからExitヘトランジションを設定した際に、Has Exit Timeの設定時間が0.75秒に設定されいるためアニメーションクリップの再生完了前にExitしている。


Settingsから Exit Time を 0.75 から 1 に修正。

例)アニメーションカーブを緩い加速→急減速

スライディングアニメーション と スタンディングアニメーション をブレンドしたらこんな感じになるかもしれない。

UnityのAnimatorではアニメーションクリップのトランジション(遷移)ではアニメーションがブレンドされている。