最終更新: kenken2020 2021年11月17日(水) 18:48:36履歴
目次
- アセット:PuppetMaster(パペットマスター、ラグドール拡張)
- Puppet Extended(パペットマスター基本的な動作デモ)
- Puppet(基本的なデモ)
- Basic(基本的なデモ)
- Killing(ラグドールの状態切り替え)
- Hanging(パペットマスターとIK)
- IK Before Physics (Animator IK)(パペットマスターとIK)
- Death Baker (Fall)(ラグドールを活用したモーションのベイク)
- Death Procedures(ラグドールを活用したモーションのベイク)
- Death Baker(ラグドールを活用したモーションのベイク)
- Removing Muscles (Deprecated)(一部を無効化(取り外し)する)
- Disconnecting Muscles(一部を無効化(取り外し)する)
- Falling(条件下でラグドールのアニメーションを切り替える)
- Punching(ラグドールの一部だけに適用する)
- Partial Pinning(ラグドールの一部だけに適用する)
- X-Boarding(パペットと独立したRigidbodyとの接続)
- NavMesh(ナビメッシュとパペットマスター)
- NavMeshAgentav(メッシュエージェントでパペットマスター)
- Melee(長物・2つ以上のパペットマスター同士の衝突)
- Melee Grab(ラグドールと掴み)
- Prop(ラグドールと小道具)
- Puppet Particle Collision(ラグドールとパーティクル)
- Puppet Raycast Hit(ラグドールとレイキャスト)
- Humanoid Config(パペットマスターの設定?)
- Puppet Respawning(リスポーンとプールのデモ)
- RigidbodyController
- Scaling
パペットを制御するビヘイビアは、BehaviourPuppet.csです。
これは、MuscleCollisionBroadcastersがパペットの筋肉にブロードキャストした衝突を聞き、衝突した(そして親子の)筋肉のピンを解放します。これでキャラクターが緩みます。
筋肉がアニメーションのターゲットから離れすぎると、キャラクターのバランスが崩れます。そうでなければ、ピンを締め直します。
キャラクターがバランスを崩すと、落下アニメーションが再生されます(PuppetEvent「On Loose Balance」で呼び出されます)。
伏せや仰向けのポーズから自動的に立ち上がることもBehaviourPuppetでサポートされており、PuppetEventsでそれぞれのアニメーションを呼び出します。
Can Activate」と「Deactivate Automatically」がチェックされていると、ピンの重さに応じてビヘイビアが自動的にアクティブモードとキネマティックモードの間で切り替わります。
つまり、パペットが完全にピンで固定されている場合、キネマティックに切り替わり、100%のアニメーション精度を得ることができます。衝突があると、パペットは再起動します。
BehaviourPuppetのすべてのパラメータは、ツールチップになっているので、すべて読むことが、そのビヘイビアの動作を理解するための最短の道です。
キャラクターコントローラ」のCharacterPuppetコンポーネントの「Replace Character Model」にヒューマノイドキャラクターのFBXや既製のラグドールを割り当てて、「Replace」をクリックすれば、キャラクターモデルを簡単に置き換えることができます。
これは、MuscleCollisionBroadcastersがパペットの筋肉にブロードキャストした衝突を聞き、衝突した(そして親子の)筋肉のピンを解放します。これでキャラクターが緩みます。
筋肉がアニメーションのターゲットから離れすぎると、キャラクターのバランスが崩れます。そうでなければ、ピンを締め直します。
キャラクターがバランスを崩すと、落下アニメーションが再生されます(PuppetEvent「On Loose Balance」で呼び出されます)。
伏せや仰向けのポーズから自動的に立ち上がることもBehaviourPuppetでサポートされており、PuppetEventsでそれぞれのアニメーションを呼び出します。
Can Activate」と「Deactivate Automatically」がチェックされていると、ピンの重さに応じてビヘイビアが自動的にアクティブモードとキネマティックモードの間で切り替わります。
つまり、パペットが完全にピンで固定されている場合、キネマティックに切り替わり、100%のアニメーション精度を得ることができます。衝突があると、パペットは再起動します。
BehaviourPuppetのすべてのパラメータは、ツールチップになっているので、すべて読むことが、そのビヘイビアの動作を理解するための最短の道です。
キャラクターコントローラ」のCharacterPuppetコンポーネントの「Replace Character Model」にヒューマノイドキャラクターのFBXや既製のラグドールを割り当てて、「Replace」をクリックすれば、キャラクターモデルを簡単に置き換えることができます。
- これはパペットマスターの最も基本的なキャラクター設定です。
- シーンを再生し、「ピンウェイト」をゼロにスライドさせると、キャラクターが物理的な筋肉空間のアニメーションに解放されます。
- 他のすべてのパラメータを調整し、「筋肉」を拡大して各筋肉のウェイトマルチプライヤーを個別に調整します。
- ラグドールからPuppetMasterキャラクターを作成するには、以下の手順で行います。
- 1. ラグドールのキャラクターをシーンにドラッグします。
- ラグドールがConfigurableJointsで作られていない場合は、ラグドールのルートゲームオブジェクトを選択して、GameObject/Convert To ConfigurableJointsをクリックします。
- また、BipedRagdollCreatorコンポーネントを使って、二足歩行のラグドールを作成・修正することもできます。
- 2. PuppetMasterコンポーネントをラグドールキャラクタのルートTransformに追加します。
- 3. 「アニメーションターゲット」を割り当てます。
- 同じGameObjectに設定することもできますが、その場合はラグドールのコンポーネントがすべて複製され、クリーンアップされます。
- また、ボーンの位置が一致していれば、キャラクターのインスタンスでも、別のキャラクターでも構いません。
- ボーンの回転は同一である必要はありません。これにより、ラグドールの構造を共有することが可能になります。
- また、足のボーンが地面に沿っていない場合(ミキサモのキャラクターなど)に最も有効です。
- その場合、ラグドールの足を回転させて揃えるだけで、ターゲットの足はそのままにしておくことができます。
- 4. Set Up PuppetMaster "をクリックしてください。
- これで、あなたのキャラクターは、アニメートされたターゲットとラグドールの二重構造になっており、ルートのゲームオブジェクトの親になっているはずです。
- この二重設定により、パペットマスターが管理するラグドールの部分を忘れて、キャラクターのアニメーションに集中することができます。
- また、不要な時には「モード」を「無効」にするだけで、パペットマスターを無効にし、ラグドール全体を無効にすることができます。
- なお、技術的には1つのラグドールとして設定することも可能ですが、アップデートのたびにコライダを持つGameObjectを前後に移動させる必要があるため、パフォーマンス面での代償が大きくなります。]
- さらに、それらのボーンにIKをかける必要があれば、コストはさらに増加します。
- しかし、デュアルセットアップでは、キネマティックターゲットのキャラクターに対して、すべてのプロシージャルなキネマティック調整を行うことができ、ダイナミクス側の余分なパフォーマンスコストがかかりません。
- 将来のPuppetMasterのリリースでは、キャラクター間でラグドールを共有できるというメリットも追加されるでしょうね。)
- すべてのパペットビヘイビアは、このゲームオブジェクトにペアレントされている必要があり、パペットマスターはここから自動的に見つけることができます。
- すべてのパペットビヘイビアは、あるキャラクターから別のキャラクターへ、参照を変更することなく簡単にコピーできるように設計されています。
- パペットビヘイビアには多くのパラメータが含まれており、設定や調整が面倒になるので、これは重要なことです。
生きている状態、死んでいる状態、凍っている状態の切り替えは、PuppetMaster.stateを設定するだけで可能です。
Killing "というゲームオブジェクトのKilling.csを見てみましょう。
Killing "というゲームオブジェクトのKilling.csを見てみましょう。
パペットは単純なジョイントでキネマティック・ターゲットにリンクされ、左腕の筋肉は弱くなっています。
RotateShoulderToTarget.csは、PuppetMasterが読み取る前に、左の鎖骨を少し上に回転させます。
シーンビューでターゲット(Dummy Rootにペアレントされている)を動かして、Dummyがオブジェクトとどのように衝突するかを確認します。LMBでダミーにボールを投げます。
シミュレーションの上にIKを適用して、シミュレーションの不正確さを隠し、手がターゲットに正しくロックされていることを確認します。
RotateShoulderToTarget.csは、PuppetMasterが読み取る前に、左の鎖骨を少し上に回転させます。
シーンビューでターゲット(Dummy Rootにペアレントされている)を動かして、Dummyがオブジェクトとどのように衝突するかを確認します。LMBでダミーにボールを投げます。
シミュレーションの上にIKを適用して、シミュレーションの不正確さを隠し、手がターゲットに正しくロックされていることを確認します。
シーンを再生し、シーンビューで「左手のIKターゲット」を動かしてターゲットのポーズを調整します。
MecanimのIKはアニメーターと一体化して動作するため、パペットマスターと連携するための追加コードは必要ありません。
ただし、ラグドールのシミュレーション後にコスメトリーにIKを適用することはできません(その場合はFinal IKを使用してください)。
MecanimのIKはアニメーターと一体化して動作するため、パペットマスターと連携するための追加コードは必要ありません。
ただし、ラグドールのシミュレーション後にコスメトリーにIKを適用することはできません(その場合はFinal IKを使用してください)。
- このシーンでは、PuppetMaster.DisconnectMuscleRecursive()を使ってPuppetMasterから筋肉を切り離すことを実演しています。
- PuppetMaster.DisconnectMuscleRecursive()は、従来の標準であるPuppetMaster.RemoveMuscleRecursive()よりもはるかに効率的にボディパーツや小道具を取り外す新しい方法です。
- 撮影を担当しているスクリプトは、"Main Camera "のGameObjectにあるSkeletonDisconnector.csです。
- また、"CowboyAnimationTarget "GameObjectのSkeleton.csも見てみましょう。
地面を上に動かすと、Dummyが空中に押し上げられ、跳ね返ります。
また、回転させて、転がったり落ちたりするようにしてみましょう。
BehaviourFallスクリプトのレイキャストで、ラグドールの地面からの高さを調べます。
その高さが十分に大きければ、アニメーターをブレンドして腕を振るアニメーションを再生します。
そうでなく、キャラクターが地面に落ちる寸前であれば、代わりにしゃがみのアニメーションをブレンドします。
また、回転させて、転がったり落ちたりするようにしてみましょう。
BehaviourFallスクリプトのレイキャストで、ラグドールの地面からの高さを調べます。
その高さが十分に大きければ、アニメーターをブレンドして腕を振るアニメーションを再生します。
そうでなく、キャラクターが地面に落ちる寸前であれば、代わりにしゃがみのアニメーションをブレンドします。
- stateName
- この動作がアクティブ化されたときにクロスフェードするアニメーションの状態。
- transitionDuration
- stateNameへのクロスフェードの期間。値は秒単位です。
- layer
- 宛先の状態を含むレイヤーインデックス。レイヤーが指定されていないか、レイヤーが-1の場合、指定された名前またはハッシュで最初に見つかった状態が再生されます。
- fixedTime
- 現在の宛先状態の開始時刻。値は秒単位です。
- 明示的なfixedTimeが指定されていないか、fixedTime値がfloat.NegativeInfinityの場合、状態はまだ再生されていない場合は最初から再生されるか、現在の時刻から再生を継続して遷移は発生しません。
- raycastLayers
- 衝突するオブジェクトを見つけるためにレイキャストされるレイヤー。
- BlendParameter
- キャッチフォールアニメーションと身もだえアニメーションをブレンドするアニメーターのパラメーター。
- writheHeight
- アニメーションを悶えるためにブレンドされる地面からの骨盤の高さ。
- writheYVelocity
- アニメーションを悶えるためにブレンドされる骨盤の垂直速度。
- BlendSpeed
- 2つの落下アニメーション間のblendigの速度。
- canEnd
- falseの場合、この動作は決して終了しません。
- minTime
- この動作がアクティブ化されてから終了するまでの最小時間。
- maxEndVelocity
- 骨盤の速度がこの値を下回った場合、動作を終了できます。
- onEnd
- すべての終了条件が満たされたときにトリガーされるイベント。
パペットメーテルの「筋肉」を展開すると、上半身の筋肉は個々の「ピンウェイト」の倍率がゼロに設定されており、これらの筋肉は固定されておらず、筋肉のトルクのみで動くことになります。下半身はまだ固定されています。
シーンビューでキャラクターを動かして、上半身の動きが下半身に比べてどのようにずれているかを確認してください。
このテクニックは、怪我のシミュレーション、キャラクターとキャラクター、キャラクターとジオメトリの貫通を止める、ヒットリアクションのシミュレーションなどに使うことができます...。
シーンビューでキャラクターを動かして、上半身の動きが下半身に比べてどのようにずれているかを確認してください。
このテクニックは、怪我のシミュレーション、キャラクターとキャラクター、キャラクターとジオメトリの貫通を止める、ヒットリアクションのシミュレーションなどに使うことができます...。
PuppetBoard.csは、"Board "というRigidbodyを、パペットの物理とは独立した "Board Controller "に従わせます。
Boardは足にFixedJoints、骨盤にSpringJointでパペットにリンクされており、パペットの直立を維持します。
このオブジェクトに任意のボード物理コントローラを追加すると、その動きはパペットの物理とは完全に独立します。
PuppetBoard.csでは、「Board」というRigidbodyを、パペットの物理とは独立した「Board Controller」に従わせています。
Boardは足にFixedJoints、骨盤にSpringJointでパペットとリンクしており、パペットの直立を維持します。
Boardは足にFixedJoints、骨盤にSpringJointでパペットにリンクされており、パペットの直立を維持します。
このオブジェクトに任意のボード物理コントローラを追加すると、その動きはパペットの物理とは完全に独立します。
PuppetBoard.csでは、「Board」というRigidbodyを、パペットの物理とは独立した「Board Controller」に従わせています。
Boardは足にFixedJoints、骨盤にSpringJointでパペットとリンクしており、パペットの直立を維持します。
このシーンでは、Unity Navigationとカスタムナビゲーターを使ったPuppetMasterの使用方法を説明しています。
Bot Puppet」の下にある「Character Controller」ゲームオブジェクトのUserControlAIスクリプトには、キャラクターコントローラーの動きのベクトルを設定するためのカスタムナビゲーターがあります。
CharacterPuppet.csでは、パペットのバランスが崩れているときに、キャラクターコントローラーが動いたり回転したりしないようにしています。
Bot Puppet」の下にある「Character Controller」ゲームオブジェクトのUserControlAIスクリプトには、キャラクターコントローラーの動きのベクトルを設定するためのカスタムナビゲーターがあります。
CharacterPuppet.csでは、パペットのバランスが崩れているときに、キャラクターコントローラーが動いたり回転したりしないようにしています。
このシーンでは、NavMeshAgentでPuppetMasterを使用することを実演しています。
NavMeshAgent "ゲームオブジェクトの "Bot Puppet "にあるNavMeshPuppet.csスクリプトをご覧ください。
NavMeshAgent "ゲームオブジェクトの "Bot Puppet "にあるNavMeshPuppet.csスクリプトをご覧ください。
このシーンでは、BehaviourPuppetで制御された2つ以上のパペットが衝突時にどのように動作するか、また、パンチやバットで殴るなどのアクションをどのようにデザインできるかを示しています。
なお、このようなシステムを動作させるには、特に長い小道具を使用する場合、設定を正しくするために多くの調整と反復が必要になります。
バットを振りながら、WASDでキャラクターを同じ方向に回転させると、より強い打撃を与えることができます。
キャラクターコントローラー」の「CharacterMeleeDemo」コンポーネントの「Replace Character Model」にヒューマノイドキャラクターのFBXや既製のラグドールを割り当てて「Replace」をクリックすると、キャラクターモデルを簡単に交換することができます。
なお、このようなシステムを動作させるには、特に長い小道具を使用する場合、設定を正しくするために多くの調整と反復が必要になります。
バットを振りながら、WASDでキャラクターを同じ方向に回転させると、より強い打撃を与えることができます。
キャラクターコントローラー」の「CharacterMeleeDemo」コンポーネントの「Replace Character Model」にヒューマノイドキャラクターのFBXや既製のラグドールを割り当てて「Replace」をクリックすると、キャラクターモデルを簡単に交換することができます。
シーンを再生し、Pを押すと武器を拾い、Dを押すと落とします。
PropDemo.cs のコードを見てみましょう。
PuppetMaster GameObject を選択し、Scene View の Prop Muscles をクリックします。Prop Muscles はプロップが取り付けられる筋肉です。
Prop M4」は、すべての PuppetMaster のプロップに必要な設定を表しています。
プロップのルートには PuppetMasterProp コンポーネントが必要です。このコンポーネントには、追加の複合コライダをペアリングできます。
また、"Mesh Root "には、すべてのメッシュレンダラーとFX/bulletエミッタがペアレントされていなければなりません。
プロップがピックアップされると、メッシュルートはプロップマッスルのターゲットにペアリングされ、コライダがプロップマッスルで使用されるようにリジッドボディは削除されます。
プロップが落とされると、元の設定が復元されます。
プロップが拾われると、その位置と回転はプロップマッスルのものと一致します。
プロップの持ち方を変える必要がある場合は、エディタでプロップマッスルの位置と回転を調整してください。
PropDemo.cs のコードを見てみましょう。
PuppetMaster GameObject を選択し、Scene View の Prop Muscles をクリックします。Prop Muscles はプロップが取り付けられる筋肉です。
Prop M4」は、すべての PuppetMaster のプロップに必要な設定を表しています。
プロップのルートには PuppetMasterProp コンポーネントが必要です。このコンポーネントには、追加の複合コライダをペアリングできます。
また、"Mesh Root "には、すべてのメッシュレンダラーとFX/bulletエミッタがペアレントされていなければなりません。
プロップがピックアップされると、メッシュルートはプロップマッスルのターゲットにペアリングされ、コライダがプロップマッスルで使用されるようにリジッドボディは削除されます。
プロップが落とされると、元の設定が復元されます。
プロップが拾われると、その位置と回転はプロップマッスルのものと一致します。
プロップの持ち方を変える必要がある場合は、エディタでプロップマッスルの位置と回転を調整してください。
パペットを制御するビヘイビアは、BehaviourPuppet.csです。
これは、MuscleCollisionBroadcastersがパペットの筋肉にブロードキャストした衝突を聞き、衝突した(そして親子の)筋肉のピンを解放します。これでキャラクターが緩みます。
筋肉がアニメーションのターゲットから離れすぎると、キャラクターのバランスが崩れます。
そうでなければ、ピンを締め直します。キャラクターがバランスを崩すと、落下アニメーションが再生されます(PuppetEvent「On Loose Balance」で呼び出されます)。
伏せや仰向けのポーズから自動的に立ち上がることもBehaviourPuppetでサポートされており、PuppetEventsでそれぞれのアニメーションを呼び出します。
BehaviourPuppetのパラメータはすべてツールチップ化されているので、それらをすべて読むことが、そのビヘイビアの動作を理解するための最短の道です。
これは、MuscleCollisionBroadcastersがパペットの筋肉にブロードキャストした衝突を聞き、衝突した(そして親子の)筋肉のピンを解放します。これでキャラクターが緩みます。
筋肉がアニメーションのターゲットから離れすぎると、キャラクターのバランスが崩れます。
そうでなければ、ピンを締め直します。キャラクターがバランスを崩すと、落下アニメーションが再生されます(PuppetEvent「On Loose Balance」で呼び出されます)。
伏せや仰向けのポーズから自動的に立ち上がることもBehaviourPuppetでサポートされており、PuppetEventsでそれぞれのアニメーションを呼び出します。
BehaviourPuppetのパラメータはすべてツールチップ化されているので、それらをすべて読むことが、そのビヘイビアの動作を理解するための最短の道です。
両方のPuppetMasterコンポーネントには、「Humanoid Config」スロットが割り当てられています。アセットにあるコンフィグファイルを見つけて、その値を変更すると、その変更が両方のパペットに適用されます。コンフィグがパペットに適用されるのは、エディターでの操作時と、パペットが起動したときの1回だけです。その後は、各パペットマスターで直接プロパティを変更することができます。
レイヤー設定では、パペット・リグのレイヤーとコリジョン・マトリクスを設定しますが、デモのためにプロジェクト設定をインポート/エクスポートする必要はありません。
理想的には、プロジェクト内でレイヤーを設定すれば、このコンポーネントは全く必要ありません。
レイヤーは以下のように設定します。
1. キャラクター全体を「キャラクター」レイヤーに設定します。
2. ラグドール全体を「ラグドール」レイヤーに設定する。
3. 歩行可能な面を「地面」レイヤーに設定する。
4. 衝突するすべてのオブジェクトを「Collision」レイヤーに設定します。
5. パペットマスターの「歩行可能なレイヤー」を「地面」レイヤーに設定します。
6. パペットマスターの「コリジョンレイヤー」を「コリジョン」レイヤーに設定します。
7. 物理設定で、「キャラクター」レイヤーと「ラグドール」レイヤーをお互いに無視するように設定します。そうしないと、ラグドールのボーンがキャラクターコントローラに衝突してしまいます。
8. また、「キャラクター」と、パペットを衝突させたいレイヤー(小さな障害物、投射物、壁など)との衝突も無視します。
もし2つの派閥のキャラクターを戦わせたい場合は、「キャラクター1」、「キャラクター2」、「ラグドール1」、「ラグドール2」のレイヤーを適宜使用し、パペットマスターの「コリジョンレイヤー」に相手のラグドールレイヤーも含めるようにしてください。
レイヤー設定では、パペット・リグのレイヤーとコリジョン・マトリクスを設定しますが、デモのためにプロジェクト設定をインポート/エクスポートする必要はありません。
理想的には、プロジェクト内でレイヤーを設定すれば、このコンポーネントは全く必要ありません。
レイヤーは以下のように設定します。
1. キャラクター全体を「キャラクター」レイヤーに設定します。
2. ラグドール全体を「ラグドール」レイヤーに設定する。
3. 歩行可能な面を「地面」レイヤーに設定する。
4. 衝突するすべてのオブジェクトを「Collision」レイヤーに設定します。
5. パペットマスターの「歩行可能なレイヤー」を「地面」レイヤーに設定します。
6. パペットマスターの「コリジョンレイヤー」を「コリジョン」レイヤーに設定します。
7. 物理設定で、「キャラクター」レイヤーと「ラグドール」レイヤーをお互いに無視するように設定します。そうしないと、ラグドールのボーンがキャラクターコントローラに衝突してしまいます。
8. また、「キャラクター」と、パペットを衝突させたいレイヤー(小さな障害物、投射物、壁など)との衝突も無視します。
もし2つの派閥のキャラクターを戦わせたい場合は、「キャラクター1」、「キャラクター2」、「ラグドール1」、「ラグドール2」のレイヤーを適宜使用し、パペットマスターの「コリジョンレイヤー」に相手のラグドールレイヤーも含めるようにしてください。
RigidbodyController.csは、AddForce/TorqueによってRigidbodyをターゲットのTransformに追従させるコンポーネントです。
シーンを再生し、"Target "ゲームオブジェクトを動かし、RigidbodyControllerがどのように追従するかを確認してください。
シーンを再生し、"Target "ゲームオブジェクトを動かし、RigidbodyControllerがどのように追従するかを確認してください。
コメントをかく