以下の作業でシーンのオブジェクトのPrefab化を進め、PlayerやWallの修正を他のシーンに反映する。
Roll a Ball のシーンのオブジェクトをPrefabと置き換えていく
シーン MiniGame を編集する※
※MiniGameのWallに衝突音とスクリプトを設定してない場合は設定をしたシーンを編集する
(1/6) NorthWall※をPrefab化する
※AudioSourceとWallBumpスクリプトの設定がない場合はGP08の授業資料を参照して要設定
(2/6) WestWallを選択してInspectorのTransformのメニューから Copy -> Component で値をメモする。
(3/6) WestWall を PrefabのNorthWallで置き換える
操作方法:
Ctrlキーを押したまま PrefabのNorthWall を HierarchyのWestWall にDnDする
※操作後にWestWallの名前はNorthWall(1)に置換わる
※Ctrlキーを押さずにDnDするとPrefabが置き換えられずに追加されてしまう
(4/6) メニュー Replace でPrefabで置き換える
確認: 置き換え後のWestWallのTransformは
position 変化なし
rotation 変化なし
scale Prefabのscaleで上書きされる
(5/6) NorthWall(1)の Transform のメニューから Paste -> Component Values でメモしたWestWallの値に回復する
(6/6) NothWall(1)の名前を WestWall に修正する
East Wall と South Wall を同様にして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部品がセットされている。
PrefabのPlayerに対してUI部品もPrefab化して設定する。
PlayerのprefabのUI部品へのリンクを以下の手順で修正する。
PlayerSetゲームオブジェクトの追加
(1/5) EmptyのGameObjectをヒエラルキーに新規追加する。
(2/5) 名前を PlayerSetに修正する。
(3/5) Transeform を Reset する。
(4/5) Main Camera 、 Canvas 、 EventSystem 、Player のオブジェクト4個をPlayerSetオブジェクトの下に配置する。
(5/5) PlayerSetをPrefab化する。
確認 Prefab化された Player と Camera と Canvas UI は、お互いにコンポーネントのスロットから参照できる。
第2シーン MiniGame 1 のWalls をPrefabに置き換える(Ctrlキー+DnD)
Player関連を削除してPlayerSetのPrefabを追加する
(1/6) Player を削除
(2/6) Main Camera を削除
(3/6) Canvas を削除
(4/6) EventSystem を削除
(5/6) PlayerSet を Prefabから追加
(6/6) PlayerSetのTransformをReset
応用:
上記の作業ではPlayerとスコア表示などのUIをセットにしてPrefab化したが、Playerとは独立したUI用のレイヤーを別のシーンに用意してゲームシーンに化させる工程も検討するとよい。
参照:
https://dolphinetech.com/unity/scene-road-unload/
Scene をコピーしてアニメーションオブジェクトの設定練習用にする。
MiniGame 1を複製(Ctrl + D)してMiniGame 3 を作成し、複製したシーンで以下の演習を進める。MiniGame3が既に存在する場合は適当な名前のシーンを作成して進める。
プロジェクトに Animations フォルダを作成する。
シーンにHierarchyから Cylinder を追加する
名前を piston に修正
Hierarchyのpistonを選択
piston を player と重ならない適当な位置に移動する
例)Transform の position を x, y, z = 1, 0, 5
animation windowを開く。
メニュー Window → Animation → Animation
Animation windowはConsoleなどと同じ場所にドッキングさせておく
Animationウィンドウでアニメーションクリップを作成する。
(1/6) create を押す。
ProjectのAnimationsフォルダを選択する。
AnimationClipに名前を付けて保存する。
アニメーションのファイル名 p_anim.anim
ゲームオブジェクトpistonのInspectorを確認する:
Animator ← 自動的に追加されたコンポーネント
Controller piston ← 自動的に追加された pistonコントローラー
(2/6) AnimatorコンポーネントのControllerの
pistonコントローラーをダブルクリックして Animator window を開く。
p_anim ステートが自動的に追加されている。
(3/6) Animation window の作業に戻る。
add property を押す。
Transform を選び Position を + ボタンから追加する
(4/6) Animationパネルのメニューから時間軸の単位を Frame に変更する
(5/6) 記録ボタンを押す
1. 再生ヘッド(縦線)を 0フレーム に戻す / 画像の〇赤丸に 0 を入力
先頭のキーフレームを選択 / 画像の□赤四角をクリック
Scene編集画面で緑の矢印マニピュレータで
piston の Y を調整する(床から少し見える程度の位置にする)
※この調整はAnimationウィンドウで行ってもよいしScene編集ウィンドウでpistonを直接移動させて修正してもよい。
2. 再生ヘッド(縦線)を 中間フレーム(30) まで進める
add keyframe ボタンを押してキーを追加する。(記録中はキーは自動的に追加されるので、この作業は省略可能)
pistonの Yを上げる
3. 再生ヘッド(縦線)を最終フレームまで進める
pistionの Y を先頭のキーフレームのYと同じ値にする※
※ループアニメーションになるので開始と終了Frameでは同じ位置が適切
※Sceneビューで編集せずにプロパティ Position.yに数値入力してもよい
※Keyframe Recording Modeは解除(記録を終了)の状態でもプロパティを編集するとキーの挿入と修正が可能
(6/6) 記録を終了する。
再生ボタン、または再生ヘッド(縦線)を操作してアニメーションの様子を確認する。
アニメーションカーブを確認する。
Animation window を Curves (カーブ)表示に切り替える。
カーブエディタ上の操作
A キー でカーブ全体を選択 または マウスで範囲選択してカーブを選択
F キーで選択したカーブをエディタにフィット または スクロールバー(緑の部分)でズームイン・アウト
開始フレームと終了フレームの接続(黄色〇部分)がずれていたらpistionのY座標を調整して直す
応用 アニメーションの加減速の解除と設定:
中間フレームのカーブの編集点を選択する
アニメーションの加減速(イージング)
キーのカーブ調整用のハンドルで調整する
カーブのキーを右クリックしてメニューを表示する。
左右の方向毎にカーブのタイプを変更できる。
Left Tangent
か
Right Tangent を選択後、
カーブではなく直線(加減速なし)に設定するには Linearを選択する。
メモ:Right と Left両方を Linear にすると物に衝突して跳ね返るような動きになる。
Linearから元のカーブに戻すには、Clamped Auto を設定する。
Position.yの Frame 30 を Both Tangents → Leaner(直線)に設定した例
壁にぶつかって跳ね返るような動きになる。
シーンを再生して piston の動作状況を確認する。
水曜日4時間目のクラスはここまで進んだ。
終了時刻を勘違いして20分早く終了。次回の進捗調整回で遅れを取り戻す予定。
参照:
公式マニュアル 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作業は不要だった
イベントに反応して1回だけ再生されるアニメーションクリップを設定する。
(1/9) Animations フォルダにあるpistonのAnimatorを選択
(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ではアニメーションクリップのトランジション(遷移)ではアニメーションがブレンドされている。