poi’s tech blog

3D多人数同時接続型球体アクション成人向けゲーム開発のためのアイデア、ナレッジ

Unity メモ

Unity 2019.3.14f1

Cinemachineのカメラが意図しないVirtual Camera視点の映像を映す

www.mum-meblog.com

同じPriorityだと、最後に設置されたVirtual Cameraが表示される

Timeline上で切り替えたいときは切り替えたいVirtualCameraのTrackを配置するだけでOK。

アニメーション中のモデルの顔をVirtualCameraで注視したい

Virtual CameraのLook Atに頭のBoneを設定すればOK

Cinemachineが振動しない

f:id:poipoipoip:20210305232758p:plain
Raw Signalを設定していなかった…

6D ShakeとかHandheldとかによって揺れ方がかわる。

Timelineで再生されるアニメーションに含めたAnimation Eventが二重で実行される

なぜか、Animation ExtrapolationのPost-ExtrapolateがLoopになっているとAnimation Eventgが二重で実行される事がある。

Trackを何度もコピペせずとも同じアニメーションをループしてくれる便利な設定だったが上記の通り悪さをするため、
アニメーションをループさせつつEventを発火させたい場合は同じTrackをコピペするという本末転倒具合…

f:id:poipoipoip:20210306001456p:plain

f:id:poipoipoip:20210306001308p:plain

正直このあたりの挙動がさっぱり分からないので原因究明はおいおい。

なんか再発した。Loopじゃなくても二重三重で実行される。

Post-ExtrapolateをHoldじゃだめだったけどNoneならいいっぽい。

LoopとかHoldでアニメーションをなめらかに補正するために裏で二重三重に同じアニメーションが動いてるとか?

20210306追記

二重実行再発

Loop Trackの挙動が悪さしている?

f:id:poipoipoip:20210306171650p:plain
ループしたいアニメーションのTrackとLoop Trackの長さが一致していれば二重実行されない

f:id:poipoipoip:20210306171800p:plain
ループしたいアニメーションのTrackよりLoop Trackが短いと二重実行される

ループ時のアニメーションをなめらかにするためにできれば後者の方法で二重実行防止したいが…

潔くSignal Trackの利用を検討する。

  • Animation Eventのほうが管理楽?
    • Blenderでアニメーション変更した時にAnimation Eventのデータ消えるかも
      → そのため、なるべくAnimationにゲームロジック組み込まないほうがそさそう

※AnimatorController内でイベント触りたい場合はAnimation Event使うしかない?要確認

取り急ぎ二重実行は無くなったので、しばらくはSignal Trackでよさそ。

nabesi777.hatenablog.com

同じUnityEventに異なる引数を与えたい場合は都度Signalファイルの作成必須?

f:id:poipoipoip:20210306201406p:plain
Signalの場合はそう。

MarkerとReceiverを設定すればよさそう。

tsubakit1.hateblo.jp

f:id:poipoipoip:20210307154730p:plain
自作Markerはアイコンが逆水玉マークになる

f:id:poipoipoip:20210307154801p:plain
好きにパラメータが設定できる

特定のMarkerの位置にJumpしたい

つくった。

poipoipoip.hatenablog.com

カメラをスクリプトとCinemachineでハイブリッド制御

Unity 2019.3.14f1

キャラクター移動時のカメラワークをスクリプトで制御していて、
スライムの攻撃を食らった際のカットシーンのカメラワークはTimelineのAnimation Trackで実現しようとしていた。

しかし、今のカメラの地点からキャラクターのいる地点にカメラが寄っていくアニメーションを作ろうとしたところ、Preview時とPlay時に再生するアニメーションで差異が出てうまく作れなかった。
(Animation Track の Track Offsets は Apply Scene Offsets を選択)

そのためキャラクター移動時はスクリプトで制御、TimelineのカメラワークはCinemachineで制御するようにした。

f:id:poipoipoip:20210303211734g:plain
Virtual Cameraが切り替わる様子

Main CameraにCinemachineBrainコンポーネントを設定して、Virtual Camera1を配置した時点でMain Cameraの位置がVirtual Camera1の位置と同期?してしまうため、Virtual Camera1の位置をスクリプトで制御するように変更。

Timeline再生前にスクリプトのカメラワーク制御を止めるように変更。

Humanモデルの子にVirtual Camera2を配置し、カメラを寄せたい位置にポジションを合わせる。

f:id:poipoipoip:20210303212731p:plain
Humanの子にするので常にHumanにVirtual Camera2がくっつく

Timeline上でVirtual Camera1からVirtual Camera2に切り替わるようにTrackを配置したら完了。

f:id:poipoipoip:20210303212938p:plain
作成したChinemachine Track上にVirtual CameraインスタンスをドロップでTrackが作成される。

2キャラの組技アニメーション作成メモ

Blender 2.82a
Unity 2019.3.14f1

概要

  • Blender上で2キャラ間の組技アニメーションを効率的に作成する方法
  • Unity上で再生する際の補足

ファイル構成

  • 1キャラ1Blendファイルで作成
  • 組技アニメーション用Blendファイルを作成
    • 上記BlendファイルのメッシュとアーマチュアをLinkして使用
    • LinkしたオブジェクトのProxyを作成することで、 メッシュやアーマチュアを壊さずにアニメーションのみ作れる状態を実現

Proxyを配置したら組技アニメーションを開始したい初期位置にオブジェクトを持っていく。

f:id:poipoipoip:20210302231946p:plain
初期位置

例:

  • 人間 Loc(0,0,0) Rot(0,0,0)
  • スライム Loc(0,-1,0) Rot(0,0,180)

この状態でアニメーションを出力するとオブジェクトの位置もアニメーション情報に含まれるようで、
スライムのアニメーションもLoc(0,-1,0) Rot(0,0,180)が掛かった状態で再生される。

f:id:poipoipoip:20210302232919p:plain
Loc(0,-1,0) Rot(0,0,180)が掛かった状態のアニメーションが出力される

そのため組技アニメーションをUnityで再生する際、
人間とスライムオブジェクトの位置座標と回転を同じ値にすればBlenderと同様の位置関係でアニメーションが再生される。

Unity上でBlendShapesの値を動かすと意図せずSmooth<->Flatシェードに切り替わる問題

Blender 2.82
Unity 2019.3

基本的にSmoothシェードで3Dモデルを作っていた。

同時に作ってた他のモデルは特に問題なかったのに、このモデルだけBlendShapeの値を動かすとFlatシェードになる奇妙な現象が発生。

f:id:poipoipoip:20210212171405p:plain
作っただけで特にメッシュ変形等の設定はしてないShape Key

f:id:poipoipoip:20210212171152p:plain
←BlendShapesの値100 BlendShapesの値0→

f:id:poipoipoip:20210212172116p:plain
Blender上でShape Key動かしてもSmoothのまま

すべてのShape Keyを削除してから作り直したりしたけど治らない。

そもそもシェーディングについて理解が曖昧だったので簡単に調べた。

bluebirdofoz.hatenablog.com

シェーディングの「フラット」と「スムーズ」を設定する事は3Dモデルの頂点の法線方向を変える事

つまり、なぜかはわからないがUnityにインポートした際にShape Keyに3Dモデルの頂点の法線方向の変更が加わる何かが起こった?

解決策

抜本的にBlender側で治す方法は分からなかったけど、Unity側の設定でとりあえず解決する方法

Legacy Blend Shape Normalsにチェックを付けてApplyで治る。

あるいはBlend Shape NormalsをImportにすると治ると書かれた記事もあったが、私の場合はBlendShapeを動かした際に若干モデルに歪みが出たので前者で対応した。

f:id:poipoipoip:20210212172648p:plain
Legacy Blend Shape NormalsにチェックしてApply

Unityアクションゲー超簡易メモ

個人的なベストプラクティスの備忘録。

Q.アニメーションの再生途中に親GameObjectのTransformを更新したい

A.アニメーションイベントでメソッド起動してDOTweenで動かす

攻撃アニメーション中に突進する場合とか。

qiita.com


Q.攻撃アニメーションの状態遷移と制御

A.ここみる

条件が複雑になる場合は状態遷移のマネージャークラスとか作ったほうがよさそう。

gametukurikata.com


Q.物理的には作用しない攻撃時の当たり判定

A.ここらへんみる

ColliderのIsTriggerをONに、イベントハンドラはOnTriggerEnter()を使う。

プレイヤーの攻撃と敵の攻撃を区別したい場合はそれぞれPlayer、Enemyレイヤーを作る。

gomafrontier.com

qiita.com


Q.Timeline実行時のオブジェクトの現在位置で組技アニメーションを実行したい

デフォルト実行(Track OffsetsがApply Transform Offsets)の場合はワールドの原点にワープしてしまう。

Track OffsetsのApply Scene Offset使うと良さげ。
クリップごとに現在地点からのオフセット設定できたりもする。

tsubakit1.hateblo.jp

ただし、使用するアニメーションのRoot Motionを予め有効(Root Transformとか)にしておかないとメニューが出ない。
毎回設定するの面倒くさいので、基本的にはFBXに紐付いたアニメーションをそのまま使うのが良さそう。

light11.hatenadiary.com

また、あくまでTimeline開始地点からの相対位置で動かせるだけなので、
組技アニメーションする場合は位置や回転などを先にスクリプトとかから整えてあげる必要がありそう。

それぞれのキャラ用Animation TrackのTrack OffsetをApply Scene Offsetsにしたあと、
Override Trackを作成して0フレーム目にTransform、Rotationの値をゼロにしたキーを登録すると
Playable Directorを持つGameObjectの現在位置に初期化ができた。

ただしキャラクターがDOTweenアニメーション中の場合はうまく位置の初期化ができなかったので、
Timelineを実行する直前にDOTweenのKill()を呼んであげる必要があった。

f:id:poipoipoip:20210213011615p:plain
他のGameObjectごとPlayable Directorを持つGameObjectの位置・回転に揃える

現在位置での初期化が出来たら、あとはアニメーションクリップ内のClip Transform Offsetsで位置関係を更に調整したらよさげ。


Q.条件に応じて複数Timelineの組み合わせ、開始終了制御したい

??


Q.モーフの制御用ボーン(シェイプキーのドライバー)の状態管理、アニメーション内で変更された時の値の維持

ボーンは他のアニメーション再生すると初期化されてしまう(?)のでShape Keyが良さそう。


Q.服や装備の着脱

別々のモデルとして作ってParent Constraintでくっつける感じ?


Blender

Q.Blender<->Unity間のマテリアル取り回しベストプラクティス

それぞれ独自のマテリアルを作るしかない?わからん。


Q.Chinポのサイズ維持ベストプラクティス


1.シェイプキーでメッシュ拡大
2.シェイプキー+ドライバーボーンのTransform
3.ボーンの拡大

Unity上で他のアニメーション再生しつつChinボーンのTransformを維持し続ける方法が分からないので、シェイプキーの値で管理するのが一番ラクそう。


Q.Mirrorモディファイア残したいしShape Key使いたい

A.ミラー残したデータを退避しつつ、Apply ModifierしたデータをUnity Asset内に名前をつけて保存が無難そう。

UnityとBlenderとゲーム用3Dモデルデータの取り回しについてメモ

更に、複数キャラの組み技的アニメーションを作るために以下の例を参考

reincarnation-plus.gitbook.io

  1. キャラA.blendとキャラB.blendを作る
  2. アニメ.blend内にキャラAとキャラBのLinkを作る
    Link対象を選ぶ際、.blend>Object>アーマチュアとメッシュを両方選択がよさそう
  3. LinkとProxyを使用してAnim用シーンを作る
    (アーマチュア選択して3DビューメニューのObject > Relations > Make Proxy) 作成したArmatureProxyのArmatureのIn Frontを有効にして手前に表示しておくと選択が楽

f:id:poipoipoip:20210302223230p:plain
更にLinkオブジェクトを非表示にしておくとProxy選択してPoseモードに移行が楽

※LINK元のモデルでアニメーションが再生できないときはBlenderのOutlinerに配置されているオブジェクト名が同じか確認する。  Proxyは作成すると◯◯_proxyという名前で作られるので◯◯に直しておく?

  1. 別途AnimationだけLinkして、流用したい場合にUnlinkすればすぐ編集できて便利
  2. とりあえず片方だけAnimation作ってPush Downして
    Nonliner Animationに並べて同時に再生して組み技作る

ようやくいい感じの方法を見つけた気がする


その他メモ

シェイプキーの動きをアニメーションに含めたい場合はシェイプキーのドライバーを追加する。
ドライバーに指定したボーンのtransform値によってシェイプキーが動くようにできる。

ameblo.jp