Unity メモ
Unity 2019.3.14f1
Cinemachineのカメラが意図しないVirtual Camera視点の映像を映す
同じPriorityだと、最後に設置されたVirtual Cameraが表示される
Timeline上で切り替えたいときは切り替えたいVirtualCameraのTrackを配置するだけでOK。
アニメーション中のモデルの顔をVirtualCameraで注視したい
Virtual CameraのLook Atに頭のBoneを設定すればOK
Cinemachineが振動しない
6D ShakeとかHandheldとかによって揺れ方がかわる。
Timelineで再生されるアニメーションに含めたAnimation Eventが二重で実行される
なぜか、Animation ExtrapolationのPost-ExtrapolateがLoopになっているとAnimation Eventgが二重で実行される事がある。
Trackを何度もコピペせずとも同じアニメーションをループしてくれる便利な設定だったが上記の通り悪さをするため、
アニメーションをループさせつつEventを発火させたい場合は同じTrackをコピペするという本末転倒具合…
正直このあたりの挙動がさっぱり分からないので原因究明はおいおい。
↑
なんか再発した。Loopじゃなくても二重三重で実行される。
Post-ExtrapolateをHoldじゃだめだったけどNoneならいいっぽい。
LoopとかHoldでアニメーションをなめらかに補正するために裏で二重三重に同じアニメーションが動いてるとか?
20210306追記
二重実行再発
Loop Trackの挙動が悪さしている?
ループ時のアニメーションをなめらかにするためにできれば後者の方法で二重実行防止したいが…
↓
潔くSignal Trackの利用を検討する。
- Animation Eventのほうが管理楽?
- Blenderでアニメーション変更した時にAnimation Eventのデータ消えるかも
→ そのため、なるべくAnimationにゲームロジック組み込まないほうがそさそう
- Blenderでアニメーション変更した時にAnimation Eventのデータ消えるかも
※AnimatorController内でイベント触りたい場合はAnimation Event使うしかない?要確認
取り急ぎ二重実行は無くなったので、しばらくはSignal Trackでよさそ。
同じUnityEventに異なる引数を与えたい場合は都度Signalファイルの作成必須?
MarkerとReceiverを設定すればよさそう。
特定のMarkerの位置にJumpしたい
つくった。
カメラをスクリプトとCinemachineでハイブリッド制御
Unity 2019.3.14f1
キャラクター移動時のカメラワークをスクリプトで制御していて、
スライムの攻撃を食らった際のカットシーンのカメラワークはTimelineのAnimation Trackで実現しようとしていた。
しかし、今のカメラの地点からキャラクターのいる地点にカメラが寄っていくアニメーションを作ろうとしたところ、Preview時とPlay時に再生するアニメーションで差異が出てうまく作れなかった。
(Animation Track の Track Offsets は Apply Scene Offsets を選択)
そのためキャラクター移動時はスクリプトで制御、TimelineのカメラワークはCinemachineで制御するようにした。
Main CameraにCinemachineBrainコンポーネントを設定して、Virtual Camera1を配置した時点でMain Cameraの位置がVirtual Camera1の位置と同期?してしまうため、Virtual Camera1の位置をスクリプトで制御するように変更。
Timeline再生前にスクリプトのカメラワーク制御を止めるように変更。
Humanモデルの子にVirtual Camera2を配置し、カメラを寄せたい位置にポジションを合わせる。
Timeline上でVirtual Camera1からVirtual Camera2に切り替わるようにTrackを配置したら完了。
2キャラの組技アニメーション作成メモ
Blender 2.82a
Unity 2019.3.14f1
概要
- Blender上で2キャラ間の組技アニメーションを効率的に作成する方法
- Unity上で再生する際の補足
ファイル構成
- 1キャラ1Blendファイルで作成
- メッシュとアーマチュア情報のみ含む
- 組技アニメーション用Blendファイルを作成
Proxyを配置したら組技アニメーションを開始したい初期位置にオブジェクトを持っていく。
例:
- 人間 Loc(0,0,0) Rot(0,0,0)
- スライム Loc(0,-1,0) Rot(0,0,180)
この状態でアニメーションを出力するとオブジェクトの位置もアニメーション情報に含まれるようで、
スライムのアニメーションもLoc(0,-1,0) Rot(0,0,180)が掛かった状態で再生される。
そのため組技アニメーションをUnityで再生する際、
人間とスライムオブジェクトの位置座標と回転を同じ値にすればBlenderと同様の位置関係でアニメーションが再生される。
Unity上でBlendShapesの値を動かすと意図せずSmooth<->Flatシェードに切り替わる問題
Blender 2.82
Unity 2019.3
基本的にSmoothシェードで3Dモデルを作っていた。
同時に作ってた他のモデルは特に問題なかったのに、このモデルだけBlendShapeの値を動かすとFlatシェードになる奇妙な現象が発生。
すべてのShape Keyを削除してから作り直したりしたけど治らない。
そもそもシェーディングについて理解が曖昧だったので簡単に調べた。
シェーディングの「フラット」と「スムーズ」を設定する事は3Dモデルの頂点の法線方向を変える事
つまり、なぜかはわからないがUnityにインポートした際にShape Keyに3Dモデルの頂点の法線方向の変更が加わる何かが起こった?
解決策
抜本的にBlender側で治す方法は分からなかったけど、Unity側の設定でとりあえず解決する方法
FBXの設定のlegacy blend shape normalsにチェック入れると治るかも
— 火村ユウヤ (@Virtual_Himura) 2020年4月14日
Legacy Blend Shape Normalsにチェックを付けてApplyで治る。
あるいはBlend Shape NormalsをImportにすると治ると書かれた記事もあったが、私の場合はBlendShapeを動かした際に若干モデルに歪みが出たので前者で対応した。
Unityアクションゲー超簡易メモ
個人的なベストプラクティスの備忘録。
Q.アニメーションの再生途中に親GameObjectのTransformを更新したい
A.アニメーションイベントでメソッド起動してDOTweenで動かす
攻撃アニメーション中に突進する場合とか。
Q.攻撃アニメーションの状態遷移と制御
A.ここみる
条件が複雑になる場合は状態遷移のマネージャークラスとか作ったほうがよさそう。
Q.物理的には作用しない攻撃時の当たり判定
A.ここらへんみる
ColliderのIsTriggerをONに、イベントハンドラはOnTriggerEnter()を使う。
プレイヤーの攻撃と敵の攻撃を区別したい場合はそれぞれPlayer、Enemyレイヤーを作る。
Q.Timeline実行時のオブジェクトの現在位置で組技アニメーションを実行したい
デフォルト実行(Track OffsetsがApply Transform Offsets)の場合はワールドの原点にワープしてしまう。
Track OffsetsのApply Scene Offset使うと良さげ。
クリップごとに現在地点からのオフセット設定できたりもする。
ただし、使用するアニメーションのRoot Motionを予め有効(Root Transformとか)にしておかないとメニューが出ない。
毎回設定するの面倒くさいので、基本的にはFBXに紐付いたアニメーションをそのまま使うのが良さそう。
また、あくまでTimeline開始地点からの相対位置で動かせるだけなので、
組技アニメーションする場合は位置や回転などを先にスクリプトとかから整えてあげる必要がありそう。
それぞれのキャラ用Animation TrackのTrack OffsetをApply Scene Offsetsにしたあと、
Override Trackを作成して0フレーム目にTransform、Rotationの値をゼロにしたキーを登録すると
Playable Directorを持つGameObjectの現在位置に初期化ができた。
ただしキャラクターがDOTweenアニメーション中の場合はうまく位置の初期化ができなかったので、
Timelineを実行する直前にDOTweenのKill()を呼んであげる必要があった。
現在位置での初期化が出来たら、あとはアニメーションクリップ内のClip Transform Offsetsで位置関係を更に調整したらよさげ。
Q.条件に応じて複数Timelineの組み合わせ、開始終了制御したい
??
Q.モーフの制御用ボーン(シェイプキーのドライバー)の状態管理、アニメーション内で変更された時の値の維持
ボーンは他のアニメーション再生すると初期化されてしまう(?)のでShape Keyが良さそう。
Q.服や装備の着脱
別々のモデルとして作ってParent Constraintでくっつける感じ?
Q.Blender<->Unity間のマテリアル取り回しベストプラクティス
それぞれ独自のマテリアルを作るしかない?わからん。
Q.Chinポのサイズ維持ベストプラクティス
案
1.シェイプキーでメッシュ拡大
2.シェイプキー+ドライバーボーンのTransform
3.ボーンの拡大
Unity上で他のアニメーション再生しつつChinボーンのTransformを維持し続ける方法が分からないので、シェイプキーの値で管理するのが一番ラクそう。
Q.Mirrorモディファイア残したいしShape Key使いたい
A.ミラー残したデータを退避しつつ、Apply ModifierしたデータをUnity Asset内に名前をつけて保存が無難そう。
UnityとBlenderとゲーム用3Dモデルデータの取り回しについてメモ
途端にUnity触りたくなったので一番簡単にBlenderとモデルデータのやり取りできるような方法考えてたんだけど、
— poi (@poi_poi_poi_p) 2021年2月9日
メッシュ+ボーンはblendファイルそのままUnityで読み取り、
アニメーションは別途FBXで書き出して使用
でいい感じなのでは。
ほんとこの辺のノウハウほしい… pic.twitter.com/UI0DUP1F27
更に、複数キャラの組み技的アニメーションを作るために以下の例を参考
- キャラA.blendとキャラB.blendを作る
- アニメ.blend内にキャラAとキャラBのLinkを作る
Link対象を選ぶ際、.blend>Object>アーマチュアとメッシュを両方選択がよさそう - LinkとProxyを使用してAnim用シーンを作る
(アーマチュア選択して3DビューメニューのObject > Relations > Make Proxy) 作成したArmatureProxyのArmatureのIn Frontを有効にして手前に表示しておくと選択が楽
※LINK元のモデルでアニメーションが再生できないときはBlenderのOutlinerに配置されているオブジェクト名が同じか確認する。 Proxyは作成すると◯◯_proxyという名前で作られるので◯◯に直しておく?
- 別途AnimationだけLinkして、流用したい場合にUnlinkすればすぐ編集できて便利
- とりあえず片方だけAnimation作ってPush Downして
Nonliner Animationに並べて同時に再生して組み技作る
ようやくいい感じの方法を見つけた気がする
その他メモ
シェイプキーの動きをアニメーションに含めたい場合はシェイプキーのドライバーを追加する。
ドライバーに指定したボーンのtransform値によってシェイプキーが動くようにできる。
Quest2 Unity Buildメモ
Unity2019.3.14
Android Platformにしてapkファイルをインストールして実行すると黒い画面のまま →Window>Package ManagerのOculus XR Packageを1.3.4から1.5.0にアップグレードする