ホーム » 「ActorController」タグがついた投稿
タグアーカイブ: ActorController
ActorControllerのドキュメント和訳
MotionController同様、公式ドキュメントが英語なので、日本語にしたものをメモ。
複雑なところは割愛。
概要
アクターコントローラーは、Unityの標準的なキャラクターコントローラーの代わりであり、高度な機能を提供します。
Unity 5ソリューションで単独で使用できますが、モーションコントローラーの基盤でもあります。
特徴
アクターコントローラーは次の機能をサポートしています。
・壁、天井などの上を歩く
・プラットフォームでの移動と回転
・超高速移動
・急な斜面を滑る
・キャラクターを地面の傾斜に合わせる
・カスタムボディ形状の作成
・外力に反応する
・Nav Meshエージェントをサポート
・ルートモーションをサポート
・あらゆる入力ソリューションをサポート
・ゼロガベージコレクション*
・コードを含む(C#)
アクターコントローラー/Actor Controller
環境と外力に応じて、全身のキャラクターの動きと回転を制御します。
アクタードライバー/Actor Driver
ユーザー入力、AIなどに基づいてアクターコントローラーがどのように動くかを決定します。含まれているアクタードライバーは 使用可能ですが、拡張することもできます。 実際、必要に応じて独自のドライバーを作成できます。
注:モーションコントローラーを所有している場合、モーションコントローラーがドライバーです。
入力ソース/Input Source
キーボード、マウス、ゲームパッドなどからのユーザー入力を収集するために使用されます。これを分割することにより、 基本的なUnity入力ソースが提供されるか、サードパーティの入力ソリューションを使用する入力ソースを作成します。
このアプローチを使用すると、任意の入力ソリューションを使用できます。
また、アクタードライバーがアクターコントローラーに指示する方法を変更することにより、アクターの動きを変更することができます(つまり、歩くか飛行するか)。
これは、同じシーン内の異なるキャラクターを異なる方法で、または異なるプレーヤーでさえ制御できることを意味します。
Unity入力ソース– Assets / ootii / Framework_v1 / Code / Input
これは、UnityのネイティブInput Managerソリューションを使用して入力を読み取るデフォルトの入力ソースです。 キーボード、マウス、Xboxコントローラーでの基本的な移動と表示をサポートしています。
Xboxコントローラーを有効にするには、チェックボックスをオンにします。
適切な値がUnityの入力マネージャーリストに追加されます(必要な場合)。
「Viewing Activator」プロパティを使用すると、回転/表示をアクティブにする方法を決定できます。 たとえば、「右マウスボタン」に設定すると、アクターは右マウスボタンが押されたときにのみ回転します。

たとえば、UnityInputSource.csファイルは、MCに付属する入力ソースであり、Unityのネイティブ入力ソリューションを利用するために使用されます。
次のフォルダーにあります。
Assets\ootii\Framework_v1\Code\Input
独自の入力ソースを作成するには、UnityInputSource.csをコピーし、
などの名前に変更して、クラス名を変更します。
これで、入力ソースの必要に応じて関数の内容を変更できます。
カスタムアクタードライバー
これらのドライバーは、基本的な動きのケースを処理し、さまざまな状況で機能します。
しかしながら、独自のドライバーを作成して、アクターを自由に制御することもできます。
最終的に、ドライバーは実際にアクターコントローラーの関数を呼び出しています。
ActorController.Move()
ActorController.RelativeMove()
ActorController.Rotate()
独自のドライバーを作成するときに使用できる他の機能がいくつかありますが、上記の機能は基本です。
力を適用するためのもう1つの便利な関数は次のとおりです。
ActorController.AddImpulse()
これはジャンプのようなものに力を加えることができます。ただし、ACは物理ベースのコントローラーではなく、入力ベースのコントローラーであるため、AddImpulse()を使用してキャラクターを通常に移動しないでください。
パッケージには、使用できるいくつかのアクタードライバーが含まれています。
Actor Driver –Assets/ootii/ActorController/Code/Actors/
これがデフォルトのドライバーです。 キーボード、マウス、およびXboxコントローラーからの入力を受け取り、それをキャラクターの順方向に相対的な動きと回転に変換します。 次に、Actor Controller関数を呼び出して、実際にアクターを移動します。

Actor Driverから継承しますが、ゲームオブジェクトにアタッチされているUnity Animatorを探します。 見つかった場合、ルートモーションデータを照会し、それを使用してキャラクターを移動および回転させます。 ルートモーションデータが見つからない場合は、入力を使用してキャラクターを制御します。
Mesh Driver – Assets / ootii / ActorController / Code / Actors / CharacterControllers / Drivers
Animator Driverから継承しますが、Nav Mesh Agentを使用してアクターを特定のターゲットに移動します。 Animatorが見つかった場合、Animatorはルートモーションデータを照会し、それを使用してキャラクターを移動および回転させます。ルートモーションデータが見つからない場合、速度はコンポーネントに設定されます。
Sphere Actor Driver – Assets / ootii / _Demos / ActorController / Code
アクタードライバーから継承します。 「内側の」球体が見つかると、これはアクターの体を使用し、それに基づいて回転します。
キャラクターが動いている方向。これは、球体が回転しているような印象を与えます。
Spider Actor Driver – Assets / ootii / _Demos / ActorController / Code
Animator Driverから継承します。他のドライバーと同様ですが、ジャンプを押すと(そしてアクターが壁に面している場合)、壁にジャンプして登ることができます。
Coding an Actor Driver
アクタードライバーのコーディングは、実際には入力を読み取り、アクターコントローラーに何をするかを伝えるだけです。
ACをコーディングするには、回転が2つの部分に分かれていることを理解する必要があります。ヨーとチルト。
通常、アクターコントローラーの次の機能を使用します。
Move(Vector3) ワールド空間に基づいてアクターを移動します。
RelativeMove(Vector3) ローカルスペースに基づいてアクタを移動します。
SetPosition(Vector3) 絶対位置の値を強制します。
Rotate(Quaternion) アクターを「上」軸を中心に回転します。 この回転は通常「ヨー」と呼ばれます。
Rotate(Quaternion、Quaternion) ヨーとチルトを回転します。
SetRotation(Quaternion) 絶対回転値を強制します。
Body Shapes and Colliders
ボディシェイプは、Actor Controllerによる衝突検出に使用されます。球体とカプセルを使用することにより、人間の形状や他の単純でないキャラクターを表現できます。また、キャラクターのポーズに合わせて、実行時にこれらの形状を変更する機能もあります。
デフォルトのセットアップには2つの形状があります。

Foot Sphere-この球体は空中でのみアクティブです。これにより、オブジェクトを飛び越えるときに足が物に入らないようにします。ただし、棚やステップの近くに移動しても、ブロックされることはありません。
体の形はコライダーではないことに注意することが重要です。そのため、外部のレイキャストや剛体はそれらに反応しません。外部のレイキャストをキャラクターに当てたい場合は、通常の方法で従来のUnityコライダーをアクターに追加するか、「Unityコライダーを使用」チェックボックスをオンにします。
コライダーの代わりにボディシェイプを使用する理由は、通常のUnityカプセルコライダーはあまり柔軟性がないためです。任意に回転したり、異なる変換に結び付けることはできません。つまり、キャラクターがアニメーション化しても、その形状は自動的に変化しません。

また、基本的な方向に固執しています。
ただし、ボディシェイプカプセルは、関連付けられている変換に合わせてサイズ変更および回転します。したがって、キャラクターの形状は自動的に変更されます。
Unity Colliders
Unityカプセルコライダーの制限を補うために、各ボディシェイプには、ボディシェイプを使用してUnityコライダーを作成および管理するオプションがあります。

球は簡単です。 ただし、Unityカプセルコライダーは実際には使用できないため、代わりに球体が使用されます。
少し混乱していますが、複数の球体を使用して、カプセルの位置、サイズ、回転を近似する方法に注目してください。
キャラクターの頭が動くと、球体が動きカプセルの形状を保ちます。


「衝突」と「地面」は異なるものです。
衝突とは、衝突検出により、壁などの別の物体にぶつかったと判断されたことを意味します。
接地とは、アクターの直下で地面をテストし、その上に立つことができることを意味します。
そのため、衝突を完全に無効にすることができ、キャラクターは引き続き地面を歩いたり、斜面を上ったりできます。衝突を無効にすると、パフォーマンスが大幅に向上します。 これは、レール上にあるか、動きが制限されているNPCに最適です。

アクターコントローラーは、標準のユニティコライダーと衝突することができます。 最速のコライダーは、球、箱、および飛行機です。 ただし、メッシュコライダーに対する衝突も検出できます。
ただし、UnityのCharacter Controllerと同様に、メッシュコライダーと衝突するとパフォーマンスに影響があります。
Unity 5.3では、ACはUnityの非割り当て物理呼び出しを使用しています。 これは、衝突によってパフォーマンスが低下する可能性のあるガベージを作成しないため、モバイルに最適です。 ただし、これらの呼び出しは、プレーン(およびおそらく他の形状)の背面との衝突を引き起こします。
衝突レイヤー/Collision Layers
Actor Controllerは、標準Unityのレイヤーを使用して、衝突する対象を決定します。
コリジョンセクションでレイヤーを設定するだけで、同じレイヤーにあるオブジェクトやプロップと衝突します。 オブジェクトがコリジョンレイヤーに含まれていないレイヤー上にある場合、キャラクターは単にオブジェクトを通過します。
レイヤーで接地を有効にするには、「Use Grounding Layers」チェックボックスもオンにする必要があります。

影響を最小限に抑えるため、メッシュコライダーを解析し、将来の衝突に備えてその情報を保存します。 小さなメッシュの場合、これは最初の影響で実行できます。 ただし、大きなメッシュの場合、アクターコントローラーでメッシュコライダーを前処理する必要があります。
これを行うには、Moos Colliderオブジェクトを持つゲームオブジェクトにootii Mesh Partitionerコンポーネントを追加します。 次に、「開始時に解析」をチェックします。
残りのオプションはすべて、エディターでパーティションを視覚化するためのものであり、有効にしないでください。

Grounding

重力を使用するかどうかを決定します。
Is Relative
重力が世界の向き(Vector3.up)または地面の法線に基づくかどうかを決定します。
壁を歩くには、このオプションを設定する必要があります。
Extrapolate Physics
アクターコントローラーは、すべての処理にLateUpdate()関数を使用します。ただし、物理レートベースの情報(重力やジャンプの力など)は、フレームレート間で一貫性を保つためにFixedUpdate()で処理されます。
これら2つの機能は常に同期しているわけではありません。
落下中にどもる場合、このオプションをチェックするとスムーズになります。
Gravity(重力)
重力の力と方向を決定します。値が設定されていない場合、Unityの重力値を使用します。
最終的な重力方向は、Is Relativeフラグによって決定されます。
Skin Width(スキン幅)
アクターのボディシェイプと、衝突または接地するオブジェクトとの間に許可されたわずかなスペース。
Mass(質量)
アクターの質量。外力を適用するときにこの値を使用します。 Unityの標準を使用します。これは約1単位= 1立方体=約35 kgです。
Grounding Start(接地開始)
接地のために光線を撮影する場合、これはキャラクターのルートからの高さであり、光線を下方に撮影し始めます。
Grounding Distance(接地距離)
接地線をキャラクターのどのくらい下に射撃するかを決定します。
Grounding Radius(接地半径)
光線に加えて、球体は隙間に落ちるのを防ぐために下向きにキャストされます。この値は、「足」の半径またはアクターの底でなければなりません。
Force Grounding(強制接地)
Force Distanceの範囲内にいるキャラクターを地面に押し下げるかどうかを決定します。
Force Distance(力の距離)
キャラクターが地面から離れることができる最大距離であり、Force Groundingがチェックされているときは、キャラクターを強制することもできます。
Collisions

衝突をテストするかどうかを決定します。
Stop Rotations
衝突によってキャラクターの回転が停止するかどうかを決定します。
Allow Pushbacks
外部コライダーがアクターを移動させることを決定します。
アクターはただアイドル状態にあるが、コライダーがキャラクターに動いていると仮定します。このオブジェクトを使用すると、コライダーがキャラクターを押し戻して、キャラクターが貫通しないようにすることができます。
ただし、Unityキャラクターコントローラーのように、コライダーはキャラクターを別のコライダーにプッシュできます。そのため、これには注意が必要です。
このオプションを使用すると、パフォーマンスが低下します。控えめに使用してください。
Overlap Center
衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これがその範囲の中心です。
Overlap Radius
衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これは、使用する半径です。
エディターでは、衝突テストに使用されるオーバーラップ円を表す明るい灰色の球体が表示されます。 「Overlap」設定を使用して、キャラクターの大部分がカバーされるようにします。


角度が最小傾斜角よりも大きいスロープでは、アクターがスライドします。
Min Slope
アクターがスライドを開始する前に、(アクターの下の)スロープの最小角度。
Gravity
スライドするとき、スライドに適用される重力の割合。 これは、表面の摩擦を偽造するのに役立ちます。
Max Slope
アクターが上に移動できる最大傾斜。 傾斜がこれより大きい場合、キャラクターは移動を停止します。
Step
スロープが実際に開始する地点の終了点を見つけるために内部的に使用される小さな距離。 通常、この値を変更する必要はありません。
Orientation

Orient to Ground(地面に向ける)
アクターが立っているサーフェスの法線に一致するようにアクターが「アップ」ベクトルを変更するかどうかを決定します。
壁を歩くには、このオプションを設定する必要があります。
Keep Orientation(オリエンテーションを保つ)
アクターがジャンプ中に最後の方向を保持するかどうかを決定します。 チェックされていない場合、キャラクターはジャンプ中に自然な向き(Vector3.up)に戻ります。
Min Angle(最小角度)
方向の変更を引き起こす最小角度の変更。
Max Distance(最大距離)
アクターの向きが自然な地面(Vector3.up)に変わり始める前の地面からの最大値。
Freezing

Max Slope
Max Slopeを、バンプを登れるような大きな値に設定します。85度は極端です。 明らかに、これはキャラクターがその程度以下の傾斜を登ることを意味します。 あなたのゲームによっては、それは良い選択肢かもしれません。 Max Slopeを0に設定すると、内部的にデフォルトで70度になります。

小さな斜面からコライダーを取り外します。小さな傾斜がある場合、キャラクターがその上にぶつかることは本当に重要ですか? 2本の足を持つ人間の場合、通常は気付かないでしょう。
これは、地形を扱う場合に特に有効です。
誰かが私に1,000個の岩や小石が地面に散らばっているシーンを見せてもらいましたすべての岩と小石は、丘のコライダーの一部でした。コライダーは複雑で大規模なメッシュでした。
そのため、丘の全体的な傾斜は良好でしたが、小さな小石はそれぞれ急斜面になりすぎ、ACは丘を登ろうとしてたどたどしくなりました。
これは「現実の幻想」についての私のコメントに行きます。
すべての小石をコライダーの一部にすることは現実に近いかもしれませんが、それがあなたのゲームに与えるパフォーマンスの打撃は通常は価値がありません。
Slopes to Steps
コライダーを「スロープ(斜面)」から「ステップ(段差)」に変更します。
ACはステップとスロープを異なる方法で処理します。
ステップの場合、スムーズにポップアップします。したがって、斜面は斜面のように見えますが、コライダーは実際には90度の面を持つ立方体になります。

急斜面のコライダーをそれほど急ではないものに変更することで逃げることができるかもしれません。

ほとんどのキャラクターコントローラーには、「ポップアップ」ステップがあります。
それは機能しますが、キャラクターが1フレーム低く、次のフレームが高いため、少し耳障りになることもあります。これは、いくつかのステップがある場合に特に当てはまります。あなたはこのポップポップポップ体験を得ることができます。
典型的な解決策は、ステップのコライダーとしてランプを使用することです。これにより、階段を上るスムーズな方法が提供されますが、足のIKは個々のステップを認識しません。代わりに、階段で停止した場合、足IKは、自分が坂道に乗っており、足が傾いていると判断します。
スムーズなステッピング
そのため、ACには「smooth stepping」と呼ばれる機能が含まれています。基本的に、ポップアップするのではなく、時間をかけてステップアップします。
「Step Up Speed」は、より高いステップに移動する速度(単位/秒)を決定します。
「Step Down Speed」は、下のステップに移動する速度を決定します。
「Max Angle」は勾配に使用されます。地面の角度がこの値より急な場合、スムーズなステップを無効にします。

キャッチは、より長い階段やランプを扱うとき、キャラクターがあなたが前進するよりもゆっくりと上昇することです。 この場合、キャラクターは沈んでゆっくりと立ち上がっているように見えます。これを修正するには、いくつかのオプションがあります。
スムーズステッピングを無効にする
「Step Up Speed」および/または「Step Down Speed」を「0」に設定して、スムーズなステップを無効にします。 これにより、従来の方法でステップを上下させることができます。
速度を上げる
この「キャッチ」が通常発生する理由は、キャラクターが上下に移動するよりも速く前進するためです。 そのため、ゲームのプレイに合わせて速度を上げることができます。 ステッピングはより速くなり、前方への動きに追いつくはずです。
最大角度を下げる
斜面では、「Max Angle」を下げて、地形などのスムーズな踏み込みを無効にすることができます。 実際、「3」は地形に適した数値であることがわかりました。
FAQ:急斜面での沈没
キャラクターのコライダーがなぜ斜面に沈むのか、何人かの人に尋ねました。
ほとんどのキャラクターは完璧なカプセルや球体ではありません。ただし、カプセルと球体を使用して衝突領域を定義します。これらは衝突検出が高速であり、単純さを提供し、凹凸のある地面を移動するときに湾曲した底が役立つためです。ただし、急な傾斜が問題になる場合があります。
これは非常に簡単に視覚化できます。

これにより、キャラクターが浮かんでいるように見えるだけでなく、ACはキャラクターが浮かんでいるとみなし、動きを止めることができます。したがって、ドキュメントで前述したように、グラウンディングとコリジョンは異なる方法で発生します。
沈むもう1つの理由は、足IKです。コライダーの形状に厳密に従うと、足が地面に到達することはなく、環境に対してより自然な姿勢を強制することはできません。
とはいえ、これについてはある程度の制御が可能です。 「Enable on ramp」オプションを使用して、コライダーがランプを尊重するかどうかを決定します。

FAQ:オリエンテーションの強制
向きは重力ではなく、地面に基づいていることに注意してください。 壁の上を歩くクモを取ります…世界の重力は変わりませんが、向きは変わりました。
ただし、重力セクションで「Is Relative」フラグを使用して、個人の重力を変更することでクモが壁にくっつくようにします。
これは向きの変化を引き起こさず、単に彼の重力が彼を地面の法線に引き寄せていることを確認します。 クモが壁にいる場合、壁に向かって押され、壁に「接地」されていることを意味します。
時々、キャラクターに特定の向きを持たせることができます。 実際、クモが壁にジャンプするときにACデモ(demo_Factor)でこれを行います。 クモの動きを担当するSpiderDriver.csファイルを確認してください。

SetTargetGroundNormalの設定に加えて、アクターがこの方向に向くのにかかる速度を変更することもできます。 OrientToGroundSpeedでそれを行うことができます。
繰り返しになりますが、SpiderDriver.csでこのすべてが発生しています。
・167行目:プレイヤーがジャンプを押し、壁が見つかりました。再配向の開始
・行175:ジャンプを押すプレーヤーに基づいてOrientToGroundSpeedを変更します
・179行目:方向を変えるとスパイダーが上に移動するようにインパルスを追加します
・行112:SetTargetGroundNormalが呼び出され、アクターが回転を開始します
・行105:アクターが新しい地上ターゲットに到達し、SetTargetGroundNormalがクリアされます
考えておくべきこと:アクターが自分の原点を中心に単純に回転すると、おそらく壁や床に埋め込まれてしまいます。そのため、それを防ぐために、衝動や動きを追加する必要があるかもしれません。私は179行目でそれをします
FAQ:ジャンプの追加
ジャンプは、いくつかの異なる方法で実装できます。 私は、キャラクターにリフトをかける力を使用してから、重力でキャラクターを引き下げます。

1. ACは、キャラクターのルートを自分の足元に残しておくのが好きです。それがキャラクターの本当の位置です。そのため、ジャンプでルートを移動すると、オブジェクトの上に簡単にジャンプできます。
2.ゲームでは、ジャンプの力を変更するだけで、キャラクターのジャンプの高さを変更できます。
3.頭部の変形を使用するように体型を設定すると、体型はキャラクターのポーズに合わせて自動的にサイズ変更されます。ここの設定を参照してください。「ボトム変換」がどのように空であるかに注意してください。つまり、ルートに基づいています。 「トップトランスフォーム」は頭の骨に基づいています。
力を適用するには、次のようにACのAddImpulse関数を呼び出すだけです。
このような機能:
ActorController mActorController =
gameObject.GetComponent
mActorController.AddImpulse(transform.up * _JumpForce);
このアプローチを採用する場合は、通常、ジャンプアニメーションでキャラクターが立ち上がらないように設定します。代わりに、彼の足は根元にとどまります。生のアニメーションはそれ自体少し奇妙に見えますが、衝動を追加すると、見栄えが良くなります。

AddImpulseアプローチを使用したくない場合は、ジャンプのアップムーブメントをアニメーションに含めることができます。 この場合、ルートモーションはないと仮定しています。 このアプローチの課題は、体が空中にある間、キャラクターの根がまだ地面にあることです。

これを補うために、通常、コライダーを移動および/またはサイズ変更して、ジャンプの生涯にわたるキャラクターの位置を表します。
体の形でこれを行うには、次のようなコードを使用します。
// Grab the first body shape as a capsule
BodyCapsule lCapsule = mActorController.BodyShapes[0] as BodyCapsule; if (lCapsule != null)
{
// Changes the offset of the bottom part of the capsule
lCapsule.Offset = Vector3.up * 0.25f;
// Changes the offset of the top part of the capsule
lCapsule.EndOffset = Vector3.zero;
}

ダブルジャンプを実装する場合、AddImpulse()を再度呼び出す前に、ACの「AccumulatedVelocity」プロパティをクリアする必要があります。その理由は物理学です…
ジャンプにAddImpluse()を使用する場合、重力を扱います。現実と同じように、上昇するにつれて速度が低下し(重力が初期ジャンプ速度に対抗するため)、頂点で速度が0になり、下降するにつれて速度が増加します(重力のため)。
速度の累積を「AccumulatedVelocity」変数に保存します。したがって、落下して重力が速度を上げると、フレームごとにキャプチャされます。
ダブルジャンプに対してAddImpulse()を再度実行すると速度が追加されるため、現在の累積速度に応じて異なる結果を得ることができます。あなたがジャンプの落下側にいて、多くの重力速度が蓄積している場合、ダブルジャンプでは再び上に移動するには不十分な場合があります。
AccumulatedVelocityをクリアすることにより、時間の経過とともに重力が増加し、蓄積が最初から始まる衝撃を取り除きます。それで、あなたはあなたの現在の位置からの新しい新鮮なジャンプをするでしょう。
AccumulatedVelocityをクリアするには、次のようなコードを実行します。
lActorController.AccumulatedVelocity = Vector3.zero;
よくある質問
アクターコントローラが互いに衝突するのを防ぐにはどうすればよいですか?
早い段階で覚えているなら、衝突と接地の違いについて話します。
2人のアクターが互いに衝突しないようにしたとしても、彼らがお互いを通過するときに奇妙な結果が得られる可能性があります。
それは、一方が他方の上に「接地」されることを望むためです。
たとえば、2人のアクターがいるとします。 1つはレイヤー#8に、もう1つはレイヤー#9にあります。
衝突を防ぐには、「Use Grounding Layers」を有効にし、「Ground Layers」に他のキャラクターレイヤーが含まれないようにします。 また、「Collision Layers」に他のキャラクターレイヤーも含まれないようにする必要があります
私の両方のアクターの「Grounding Layers」と「Collision Layers」にはこれらのレイヤーが含まれていないため、衝突しません。
