ヴぁ部

イラスト、ゲーム、3DCGの個人サイト。

覚書

MotionControllerのドキュメント和訳

「Motion Controller」のアセットについて解説ページがあるものの、 英語なので、グーグル和訳したものをメモ。覚書。

導入からセットアップまでは、ここのページを参照にしたら良さそう。

ActorControllerのドキュメント和訳はこちら
Camera Controllerドキュメント和訳はこちら


概要
モーションコントローラーは、任意のキャラクターおよびゲーム用のアニメーションフレームワークおよびキャラクターコントローラーです。
それはユーザー入力と応答性を物理学より上に置く「入力ベース」コントローラーです。

アセットストアにある他の第三者のヒューマノイドコントローラーとは異なり、モーションコントローラーは柔軟です。
人間から猫、エイリアンまで、あらゆるタイプのキャラクターをサポートできるコンポーネントベースのフレームワークです。
拡張可能なように一から構築されており、独自のモーションを作成し、独自のモーションを使用することができます。
アニメーション、さらにはモーションを他のユーザーと共有します。

すぐに使えるモーションコントローラーには、アクターコントローラーが含まれています。
高度なキャラクターコントローラー。 重力、移動プラットフォーム、カスタムキャラクターシェイプ、壁の上を歩くことができます。 また、いくつかが含まれていますヒューマノイドキャラクターに使用できるビルド済みのモーション。走ったり、ジャンプしたり、はしごを登ったり、スケール壁など。


特徴
モーションコントローラは次の機能をサポートしています。
・壁、天井などの上を歩く
・プラットフォームでの移動と回転
・超高速移動
・カスタムボディ形状の作成
・15秒未満でヒューマノイドをセットアップする
・Nav Meshエージェントをサポート
・ルートモーションをサポート
・あらゆる入力ソリューションをサポート
・コードを含む(C#)


前書き
モーションコントローラは、いくつかの異なる部分で構成されています。これらの部品がどのように組み合わされるかを理解するフレームワークの使用と拡張がはるかに簡単になります。


入力ベース/Input Based
キャラクターコントローラーには通常、入力ベースと物理ベースの2つのフレーバーがあります。
入力ベースのコントローラーは、ユーザーとコードからの入力を受け取り、それを正確な動きに変換します。 これらは、より正確で応答性の高いキャラクターコントローラーを作成します。 物理的な力に対する反応をシミュレートできますが、物理ベースのコントローラーほど正確ではありません。
物理学に基づいたコントローラーは物理学の力を使用してキャラクターを動かし、物理学に基づいたシミュレーション(プールのビリヤードボールなど)に適している傾向があります。 ただし、ユーザー入力に対する応答性が低下する傾向があり、動きはそれほど正確ではありません。
モーションコントローラー(およびアクターコントローラー)は、入力ベースのコントローラーです。


アクターコントローラー/Actor Controller
これは実際の「キャラクターコントローラー」であり、移動、移動するプラットフォームへの付着、衝突、重力、壁の上を歩くなど基本的に、アクターコントローラーはこれらのことを「どのように」行うかを知っていますが、いつ行うのか、なぜ行うのかはわかりません。
アクターコントローラーの詳細については、ユーザーガイドをご覧ください。
http://www.ootii.com/Unity/ActorController/


入力ソース/Input Sources
誰もが同じ入力ソリューションを使用した場合、これは必要ありません。
ただし、Unityのネイティブ入力ソリューションを使用する人、Easy Inputを好む人、Asset Storeにある他のアセットを使用する人もいます。
つまり、モーションを1回コーディングし、任意のソリューションからユーザー入力を取得できるように、入力を取得する一般的な方法が必要です。
それが入力ソースです。
入力を取得する一般的な方法。好みの入力ソリューションを「入力ソース」にラップすることにより、MCとモーション自体が入力ソースを使用して、選択した入力ソリューションを利用できます。
モーションコントローラーには、Unityのネイティブソリューションを使用してユーザー入力を取得する方法を知っている「Unity Input Source」が含まれています。
Easy Inputには「Easy Input Source」が含まれており、必要に応じて他の「Input Sources」を作成して、お気に入りのソリューションを操作できます。


アクションエイリアス/Action Aliases
モーション全体を通して、「アクションエイリアス」を使用して、入力が発生したかどうか、およびモーションをアクティブ化する時間かどうかを確認します。 アクションエイリアスは、キープレスまたは入力条件に付けられるわかりやすい名前であり、その仕組みを理解せずに問い合わせることができます。
ジャンプモーションには、アクションエイリアスプロパティがあります。
デフォルト値は「Jump」です。
動きが見えるように見えるときジャンプするときは、次のような呼び出しを行います。
bool lShouldActivate =InputSource.IsJustPressed(“ Jump”);
モーションは、「ジャンプ」がどの程度であったかをあまり気にしません 処理されました。値がtrueまたはfalseが戻ってきます。
これはまさにUnityが入力システムで行うことです。


動き/Motions
モーションはアニメーションの流れに関するものです。
Mecanim Animatorに代わるものではありませんが、それと連携してタイミングを制御します。
アニメーションは開始時、移行時、終了時に開始されます。そのため、モーションには通常3つのコンポーネントがあります。
アニメーション、コード、および設定。彼らは協力して完全な体験を作り出します。
登山について考えてください。クライミングアニメーションを作成できますが、どのように「何を」登ることができますか?
高さが固定されていないはしごを登る場合はどうでしょうか。停止するタイミングをどのように知っていますか?
動きがはしごを登るアニメーション、これらの質問に答えるコード、および開発者が 情報を設定します。


優先順位/Priorities
すべてのモーションに優先順位が与えられます。この優先順位を使用して、どのモーションが別のモーションをオーバーライドするかを決定します。
優先度が高いほど、モーションが重要になります。
したがって、2つのモーションを両方ともアクティブにできる場合、優先度が最も高いモーションが優先されます。
2つのモーションが両方ともアクティブになり、同じ優先度を持つ場合、リストで最も低いモーションが優先されます。


モーションレイヤー/Motion Layers
Mecanim Animatorレイヤーと同様に、モーションをレイヤーにグループ化できます。このようにして、複数のモーションを作成できます。
体のさまざまな部分に影響を与えるために一度に実行します。通常、私は1つまたは2つのレイヤーで作業しますが、コードを変更せずに最大10個作成できます。


メカニムアニメーター/Mecanim Animator
内部では、MCはMecanimのAnimatorおよびAnimator Parametersを使用してアニメーションを制御します。
適切なパラメーターを設定するだけで、Mecanimステートマシンが一般的なUnityの方法でアニメーションフローを制御できます。
これを行うには、アニメーターで次のパラメーターが必要です。

IsGrounded-キャラクターが地面にいるかどうかを決定します
Stance –キャラクターの状態を定義する開発者定義の整数
InputX / InputY –「動き」入力キー/ゲームパッドの値
InputMagnitude –運動入力の値
InputMagnitude –運動入力の平均値
InputAngleFromAvatar –入力とキャラクターの前方
InputAngleFromCamera –入力とカメラの前方の角度差
コントローラーのアニメーターレイヤーごとに、これらのパラメーターのセットが存在する必要があります。 「L0…」、「L1…」、「L2…」などのラベルが付けられます。
L MotionPhase –アニメーターの状態をアクティブにする一意のキー
L MotionParameter –アニメーターの状態フローを支援する追加情報
L MotionStateTime –現在の状態の正規化された時間。値は常に0〜1(包括的)です。状態がループすると、値は0に戻ります。


ヒューマノイドアニメーターコントローラー
MCには、デモ用およびコピー用のビルド済みのアニメーターコントローラーが含まれています。以下にあります。
Assets \ ootii \ MotionController \ Content \ Animations \ Humanoid \ Humanoid.controller
アニメーターコントローラーをカスタマイズするときは、このコントローラーをコピーしてキャラクターで使用することをお勧めします。
この方法で、更新中に上書きしません。

初期設定
AnimatorのControllerプロパティは、MCの「Humanoid」コントローラーを参照する必要があります。
これは、歩行、ランニング、ジャンプ、登山などのアニメーションを含むMecanimコントローラーです。
[詳細設定/Advanced]タブには、多数のモーションを含む「移動/Locomotion」レイヤーが存在します。 これらの動きは、キャラクターが走ったり、ジャンプしたり、登ったりする原因となります。
後でリストにモーションを追加して、新しい機能を有効にしたり、独自のモーションを作成したりできることを学習します。

カスタム入力ソース

私が含めた入力ソースはオプションです。 入力ソースを作成することにより、任意の入力ソリューションを使用できます。
入力ソースは、IInputSourceインターフェイスを実装する単なるクラスです。
インターフェイスを実装することにより、クラスは「IsPressed」や「MovementX」などの特定の機能を実装することを約束します。
これらの機能とプロパティは、モーションコントローラーとモーションが入力ソリューションを活用するために使用します。
このビデオでは、入力ソースについて詳しく説明します。


クイックコーディング
たとえば、UnityInputSource.csファイルはMCに付属する入力ソースであり、Unityのネイティブ入力ソリューションを利用するために使用されます。
次のフォルダーにあります。
Assets \ ootii \ Framework_v1 \ Code \ Input
そのクラス内には、次のような関数があります。
 public virtual bool IsJustPressed(KeyCode rKey) 
 {  
      if (!_IsEnabled) { return false; } 
      return UnityEngine.Input.GetKeyDown(rKey); // <-------------
  } 

独自の入力ソースを作成するには、UnityInputSource.csをコピーし、YourAwesomeInputSource.csなどの名前に変更して、クラス名を変更します。
これで、入力ソースの必要に応じて関数の内容を変更できます。
前のコードでは、Unityの「UnityEngine.Input.GetKeyDown」関数を使用しています。
入力ソースでは、入力ソリューションを使用して関数の内容をコーディングします。

public virtual bool IsJustPressed(KeyCode rKey)
 {
     if (!_IsEnabled) { return false; }
      return YourAwesomeInputSolution.IsKeyPressedThisFrame(rKey); // <-------------
 }
ご想像のとおり、Asset Storeにはさまざまな入力ソリューションがあります。
そのため、すべてを購入して実装することはできません。
ビデオとこのセクションが、必要な入力ソースの作成に役立つことを願っています。 共有したい場合は、Vaultに追加します。


衝突とトリガー/Collisions & Triggers
モーションコントローラーは、基になるキャラクターコントローラーとしてアクターコントローラーを使用します。つまり、衝突を処理するのはアクターコントローラです。
詳細については、アクターコントローラーのガイドをご覧ください。


トリガー/Triggers
AC(およびMCの順番)は、Unityの物理エンジン(PhysX)を使用します。
ただし、デフォルトではUnityコライダーはありません。
代わりに、「ボディシェイプ/Body Shapes」を使用して、さまざまなサイズのキャラクターや基本的なカプセルではないキャラクターをサポートします。
つまり、MCはそれ自体でトリガーイベントを発生させません。
キャラクターにトリガーイベントを発生させるには、通常どおりにUnityコライダーをキャラクターに追加する必要があります。
これは、Unityの標準手順に従っています。


トリガーボリュームとの衝突
MC(およびAC)はUnityレイキャストを使用して衝突を管理します。ただし、Unityのレイキャストはトリガーボリュームと衝突します。つまり、コライダーの[トリガー]がオンになっていても、キャラクターはコライダーと衝突します。

キャラクターがトリガーボリュームと衝突しないようにするには、レイヤーをUnityの「レイキャストを無視」レイヤーに設定するだけです。

ユーザーインターフェイス/User Interface
ユーザーインターフェースを2つのセクションに分けました。
基本セクションと詳細セクションです。
ヒューマノイドキャラクターの場合、基本ビューは必要なもののほとんどを提供します。
ただし、独自のモーションを作成する場合、値を微調整する場合、または非ヒューマノイドのモーションを使用する場合は、詳細ビューを使用します。


基本ビュー/Basic View
移動スタイルボタンのいずれかをクリックするだけで、ほとんどのセットアッププロセスをショートカットできます。
そうすることで、モーションコントローラは入力ソースを作成し、カメラをセットアップし、必要に応じてモーションを追加します。

運動スタイル/Movement Styles
さまざまな第三者のスタイルのゲームプレイをサポートするために、私は 模倣するさまざまな「ウォークラン」モーションが含まれています。
・MMOスタイル
・アドベンチャースタイル
・シューティングスタイル

オプション/Options
[Options]セクションでは、組み込み済みのモーションを簡単に追加できます。
必要なモーションをチェックするだけで、デフォルトの設定で追加されます。
いくつかのモーションでは、どのUnityレイヤーが操作可能なオブジェクトを識別するかを指定する必要があります。


詳細ビュー/Advanced View
このビューを使用して、モーションプロパティをカスタマイズしたり、作成したモーションを有効にしたり、シンプルモーション機能でアニメーションを使用したりします。
モーションレイヤー/Motion Layers
必要に応じて、レイヤーを追加、削除、および名前付けします。追加する各レイヤーには、モーションのコレクションを保持できます。
レイヤーの数は、Mecanim Animatorで使用するレイヤーの数と一致する必要があります。

モーション/Motions
モーションレイヤーを選択すると、モーションレイヤーに含まれるモーションのリストが表示されます。
リストには次が表示されます。
・モーションタイプ
・モーション名(テキストフィールド)
・モーション優先度(数値フィールド)
・有効化フラグ(チェックボックス)
行の左側にあるアイコンを使用して、順序を並べ替えることもできます。
これは、モーションの優先度値が同じ場合に役立ちます。最も低いものが優先されます。

モーション詳細
モーションを選択すると、リストの下に詳細セクションが開きます。

上部(説明がある部分)は一般的なものです。
ここで、フレンドリ名(検索も可能)を追加し、優先度を変更できます。
再アクティブ化遅延は、モーションが再びアクティブになるまで待機する必要がある秒数です。 0は遅延がないことを意味します。

下の部分(線の下)は、モーション固有のプロパティです。それらのすべてに役立つツールチップがあります。プロパティ名にカーソルを合わせると、プロパティの機能が説明されます。

モーションコントローラーイベント/Motion Controller Events
コードとの統合をサポートするために、Motion Controllerは次の3つのイベントを公開します。
MotionActivated
この関数は、モーションの「アクティブ化」関数が呼び出されると起動します。
モーションが存在するレイヤー、モーション自体、および非アクティブ化される古いモーションが含まれます。
MotionUpdated
この関数は、モーションの「更新」関数が呼び出された後に起動します。
モーションはそれ自体を非アクティブ化できるため、MotionDeactivatedイベントが呼び出された後に呼び出されるのを確認できます。
これは、更新イベントが非アクティブ化されて終了したためです。
MotionDeactivated
このイベントは、モーションの「非アクティブ化」関数が呼び出されたときに発生します。
モーションが存在するレイヤーとモーション自体が含まれます。
MotionDeactivatedイベントは、現在のモーションが非アクティブ化される方法に基づいて、MotionActivatedイベントの前または後に起動できます。



以下は、イベントを利用する方法の簡単な例です。
using UnityEngine;
using com.ootii.Actors.AnimationControllers;
public class dev_Simple_Code : MonoBehaviour
{
 public MotionController mMotionController = null;
 void Start()
 {
 mMotionController = gameObject.GetComponent<MotionController>();
 mMotionController.MotionActivated += MotionActivated;
 mMotionController.MotionUpdated += MotionUpdated;
 mMotionController.MotionDeactivated += MotionDeactivated;
 }
 protected void MotionActivated(int rLayer, MotionControllerMotion rNewMotion, MotionControllerMotion rOldMotion)
 {
 Debug.Log(string.Format("Activated m-new:{0} l:{1}", rNewMotion.GetType().Name, rLayer));
 }
 protected void MotionUpdated(float rDeltaTime, int rUpdateCount, int rLayer, MotionControllerMotion rMotion)
 {
 Debug.Log(string.Format("Updated m:{0} l:{1} dt:{2:f2}", rMotion.GetType().Name, rLayer, rDeltaTime));
 }
 protected void MotionDeactivated(int rLayer, MotionControllerMotion rMotion)
 {
 Debug.Log(string.Format("Deactivated m:{0} l:{1}", rMotion.GetType().Name, rLayer));
 }
}

ドキュメントの和訳はここで半分ぐらいだけど、後半は複雑なので割愛。

コメントを残す

Theme by Anders Norén