contentヴぁ部イラスト、ゲーム、3DCGの個人サイト。Controllerドキュメント和訳MotionController同様、公式ドキュメントが英語なので、日本語にしたものをメモ。概要アクターコントローラーは、Unityの標準的なキャラクターコントローラーの代わりであり、高度な機能を提供します。5ソリューションで単独で使用できますが、モーションコントローラーの基盤でもあります。特徴アクターコントローラーは次の機能をサポートしています。Controller環境と外力に応じて、全身のキャラクターの動きと回転を制御します。Driverユーザー入力、AIなどに基づいてアクターコントローラーがどのように動くかを決定します。使用可能ですが、拡張することもできます。実際、必要に応じて独自のドライバーを作成できます。注:モーションコントローラーを所有している場合、モーションコントローラーがドライバーです。Sourceキーボード、マウス、ゲームパッドなどからのユーザー入力を収集するために使用されます。基本的なUnity入力ソースが提供されるか、サードパーティの入力ソリューションを使用する入力ソースを作成します。このアプローチを使用すると、任意の入力ソリューションを使用できます。アクタードライバーがアクターコントローラーに指示する方法を変更することにより、アクターの動きを変更することができます(つまり、歩くか飛行するか)。これは、同じシーン内の異なるキャラクターを異なる方法で、または異なるプレーヤーでさえ制御できることを意味します。Managerソリューションを使用して入力を読み取るデフォルトの入力ソースです。キーボード、マウス、Xboxコントローラーでの基本的な移動と表示をサポートしています。Xboxコントローラーを有効にするには、チェックボックスをオンにします。適切な値がUnityの入力マネージャーリストに追加されます(必要な場合)。Activator」プロパティを使用すると、回転/表示をアクティブにする方法を決定できます。「右マウスボタン」に設定すると、アクターは右マウスボタンが押されたときにのみ回転します。クイックコーディングたとえば、UnityInputSource.csファイルは、MCに付属する入力ソースであり、Unityのネイティブ入力ソリューションを利用するために使用されます。次のフォルダーにあります。Assets\ootii\Framework_v1\Code\Input独自の入力ソースを作成するには、UnityInputSource.csをコピーし、などの名前に変更して、クラス名を変更します。これで、入力ソースの必要に応じて関数の内容を変更できます。カスタムアクタードライバーこれらのドライバーは、基本的な動きのケースを処理し、さまざまな状況で機能します。独自のドライバーを作成して、アクターを自由に制御することもできます。最終的に、ドライバーは実際にアクターコントローラーの関数を呼び出しています。ActorController.Move()ActorController.RelativeMove()ActorController.Rotate()独自のドライバーを作成するときに使用できる他の機能がいくつかありますが、上記の機能は基本です。力を適用するためのもう1つの便利な関数は次のとおりです。ActorController.AddImpulse()これはジャンプのようなものに力を加えることができます。ACは物理ベースのコントローラーではなく、入力ベースのコントローラーであるため、AddImpulse()を使用してキャラクターを通常に移動しないでください。パッケージには、使用できるいくつかのアクタードライバーが含まれています。–Assets/ootii/ActorController/Code/Actors/これがデフォルトのドライバーです。キーボード、マウス、およびXboxコントローラーからの入力を受け取り、それをキャラクターの順方向に相対的な動きと回転に変換します。Controller関数を呼び出して、実際にアクターを移動します。Animatorを探します。見つかった場合、ルートモーションデータを照会し、それを使用してキャラクターを移動および回転させます。ルートモーションデータが見つからない場合は、入力を使用してキャラクターを制御します。Agentを使用してアクターを特定のターゲットに移動します。Animatorが見つかった場合、Animatorはルートモーションデータを照会し、それを使用してキャラクターを移動および回転させます。ルートモーションデータが見つからない場合、速度はコンポーネントに設定されます。Codeアクタードライバーから継承します。「内側の」球体が見つかると、これはアクターの体を使用し、それに基づいて回転します。キャラクターが動いている方向。これは、球体が回転しているような印象を与えます。Driverから継承します。他のドライバーと同様ですが、ジャンプを押すと(そしてアクターが壁に面している場合)、壁にジャンプして登ることができます。Driverアクタードライバーのコーディングは、実際には入力を読み取り、アクターコントローラーに何をするかを伝えるだけです。ACをコーディングするには、回転が2つの部分に分かれていることを理解する必要があります。通常、アクターコントローラーの次の機能を使用します。ワールド空間に基づいてアクターを移動します。ローカルスペースに基づいてアクタを移動します。絶対位置の値を強制します。アクターを「上」軸を中心に回転します。この回転は通常「ヨー」と呼ばれます。ヨーとチルトを回転します。絶対回転値を強制します。Controllerによる衝突検出に使用されます。球体とカプセルを使用することにより、人間の形状や他の単純でないキャラクターを表現できます。キャラクターのポーズに合わせて、実行時にこれらの形状を変更する機能もあります。デフォルトのセットアップには2つの形状があります。ボディカプセル–このカプセルは、従来のキャラクターコントローラーに似ていますが、地面から持ち上げられます。これにより、アクターはステップの端まで到達できます。これは、足IKに最適です。Sphere-この球体は空中でのみアクティブです。これにより、オブジェクトを飛び越えるときに足が物に入らないようにします。棚やステップの近くに移動しても、ブロックされることはありません。体の形はコライダーではないことに注意することが重要です。そのため、外部のレイキャストや剛体はそれらに反応しません。外部のレイキャストをキャラクターに当てたい場合は、通常の方法で従来のUnityコライダーをアクターに追加するか、「Unityコライダーを使用」チェックボックスをオンにします。コライダーの代わりにボディシェイプを使用する理由は、通常のUnityカプセルコライダーはあまり柔軟性がないためです。任意に回転したり、異なる変換に結び付けることはできません。キャラクターがアニメーション化しても、その形状は自動的に変化しません。Unityカプセルコライダーが、頭部の変形に合わせて自動的にサイズ変更できないことに注意してください。基本的な方向に固執しています。ボディシェイプカプセルは、関連付けられている変換に合わせてサイズ変更および回転します。したがって、キャラクターの形状は自動的に変更されます。CollidersUnityカプセルコライダーの制限を補うために、各ボディシェイプには、ボディシェイプを使用してUnityコライダーを作成および管理するオプションがあります。Colliders]チェックボックスをオンにするだけで、実行時にコライダーがボディの形状に合わせて作成されます。Unityカプセルコライダーは実際には使用できないため、代わりに球体が使用されます。混乱していますが、複数の球体を使用して、カプセルの位置、サイズ、回転を近似する方法に注目してください。キャラクターの頭が動くと、球体が動きカプセルの形状を保ちます。Rigidbodyコンポーネントをキャラクターに追加しても問題ありません。剛体はキャラクターを制御しようとします。剛体とACが競合していることを意味します。Kinematic」チェックボックスをオンにします。これにより、リジッドボディがキャラクターを制御しようとするのを防ぎます。「地面」は異なるものです。衝突とは、衝突検出により、壁などの別の物体にぶつかったと判断されたことを意味します。接地とは、アクターの直下で地面をテストし、その上に立つことができることを意味します。そのため、衝突を完全に無効にすることができ、キャラクターは引き続き地面を歩いたり、斜面を上ったりできます。衝突を無効にすると、パフォーマンスが大幅に向上します。これは、レール上にあるか、動きが制限されているNPCに最適です。コライダー/Collidersアクターコントローラーは、標準のユニティコライダーと衝突することができます。最速のコライダーは、球、箱、および飛行機です。メッシュコライダーに対する衝突も検出できます。Controllerと同様に、メッシュコライダーと衝突するとパフォーマンスに影響があります。5.3では、ACはUnityの非割り当て物理呼び出しを使用しています。これは、衝突によってパフォーマンスが低下する可能性のあるガベージを作成しないため、モバイルに最適です。これらの呼び出しは、プレーン(およびおそらく他の形状)の背面との衝突を引き起こします。Controllerは、標準Unityのレイヤーを使用して、衝突する対象を決定します。コリジョンセクションでレイヤーを設定するだけで、同じレイヤーにあるオブジェクトやプロップと衝突します。オブジェクトがコリジョンレイヤーに含まれていないレイヤー上にある場合、キャラクターは単にオブジェクトを通過します。Layers」チェックボックスもオンにする必要があります。Colliders影響を最小限に抑えるため、メッシュコライダーを解析し、将来の衝突に備えてその情報を保存します。小さなメッシュの場合、これは最初の影響で実行できます。大きなメッシュの場合、アクターコントローラーでメッシュコライダーを前処理する必要があります。Partitionerコンポーネントを追加します。次に、「開始時に解析」をチェックします。残りのオプションはすべて、エディターでパーティションを視覚化するためのものであり、有効にしないでください。Enable重力を使用するかどうかを決定します。Relative重力が世界の向き(Vector3.up)または地面の法線に基づくかどうかを決定します。壁を歩くには、このオプションを設定する必要があります。Physicsアクターコントローラーは、すべての処理にLateUpdate()関数を使用します。物理レートベースの情報(重力やジャンプの力など)は、フレームレート間で一貫性を保つためにFixedUpdate()で処理されます。これら2つの機能は常に同期しているわけではありません。落下中にどもる場合、このオプションをチェックするとスムーズになります。Gravity(重力)重力の力と方向を決定します。値が設定されていない場合、Unityの重力値を使用します。Relativeフラグによって決定されます。Width(スキン幅)アクターのボディシェイプと、衝突または接地するオブジェクトとの間に許可されたわずかなスペース。Mass(質量)アクターの質量。外力を適用するときにこの値を使用します。Unityの標準を使用します。Start(接地開始)接地のために光線を撮影する場合、これはキャラクターのルートからの高さであり、光線を下方に撮影し始めます。Distance(接地距離)接地線をキャラクターのどのくらい下に射撃するかを決定します。Radius(接地半径)光線に加えて、球体は隙間に落ちるのを防ぐために下向きにキャストされます。この値は、「足」の半径またはアクターの底でなければなりません。Distanceの範囲内にいるキャラクターを地面に押し下げるかどうかを決定します。Groundingがチェックされているときは、キャラクターを強制することもできます。Enabled衝突をテストするかどうかを決定します。Rotations衝突によってキャラクターの回転が停止するかどうかを決定します。外部コライダーがアクターを移動させることを決定します。アクターはただアイドル状態にあるが、コライダーがキャラクターに動いていると仮定します。このオブジェクトを使用すると、コライダーがキャラクターを押し戻して、キャラクターが貫通しないようにすることができます。Unityキャラクターコントローラーのように、コライダーはキャラクターを別のコライダーにプッシュできます。そのため、これには注意が必要です。このオプションを使用すると、パフォーマンスが低下します。控えめに使用してください。Center衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これがその範囲の中心です。Radius衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これは、使用する半径です。エディターでは、衝突テストに使用されるオーバーラップ円を表す明るい灰色の球体が表示されます。「Overlap」設定を使用して、キャラクターの大部分がカバーされるようにします。Enabled角度が最小傾斜角よりも大きいスロープでは、アクターがスライドします。Slopeアクターがスライドを開始する前に、(アクターの下の)スロープの最小角度。Gravityスライドするとき、スライドに適用される重力の割合。これは、表面の摩擦を偽造するのに役立ちます。Slopeアクターが上に移動できる最大傾斜。傾斜がこれより大きい場合、キャラクターは移動を停止します。Stepスロープが実際に開始する地点の終了点を見つけるために内部的に使用される小さな距離。通常、この値を変更する必要はありません。Orientationこれらの機能は、キャラクターが壁や天井を歩くつもりである場合に重要です。これを行うには、キャラクターは歩いている表面の方向を向く必要があります。Ground(地面に向ける)アクターが立っているサーフェスの法線に一致するようにアクターが「アップ」ベクトルを変更するかどうかを決定します。壁を歩くには、このオプションを設定する必要があります。Orientation(オリエンテーションを保つ)アクターがジャンプ中に最後の方向を保持するかどうかを決定します。チェックされていない場合、キャラクターはジャンプ中に自然な向き(Vector3.up)に戻ります。Angle(最小角度)方向の変更を引き起こす最小角度の変更。Distance(最大距離)アクターの向きが自然な地面(Vector3.up)に変わり始める前の地面からの最大値。Freezingこれらのオプションを設定すると、指定した軸の動きと回転を制限できます。Slopeを、バンプを登れるような大きな値に設定します。明らかに、これはキャラクターがその程度以下の傾斜を登ることを意味します。あなたのゲームによっては、それは良い選択肢かもしれません。Slopeを0に設定すると、内部的にデフォルトで70度になります。Colliders小さな斜面からコライダーを取り外します。2本の足を持つ人間の場合、通常は気付かないでしょう。これは、地形を扱う場合に特に有効です。誰かが私に1,000個の岩や小石が地面に散らばっているシーンを見せてもらいましたすべての岩と小石は、丘のコライダーの一部でした。コライダーは複雑で大規模なメッシュでした。そのため、丘の全体的な傾斜は良好でしたが、小さな小石はそれぞれ急斜面になりすぎ、ACは丘を登ろうとしてたどたどしくなりました。これは「現実の幻想」についての私のコメントに行きます。すべての小石をコライダーの一部にすることは現実に近いかもしれませんが、それがあなたのゲームに与えるパフォーマンスの打撃は通常は価値がありません。Stepsコライダーを「スロープ(斜面)」から「ステップ(段差)」に変更します。ACはステップとスロープを異なる方法で処理します。ステップの場合、スムーズにポップアップします。したがって、斜面は斜面のように見えますが、コライダーは実際には90度の面を持つ立方体になります。Slopes急斜面のコライダーをそれほど急ではないものに変更することで逃げることができるかもしれません。階段と坂道をゆっくりと上昇するときほとんどのキャラクターコントローラーには、「ポップアップ」ステップがあります。それは機能しますが、キャラクターが1フレーム低く、次のフレームが高いため、少し耳障りになることもあります。これは、いくつかのステップがある場合に特に当てはまります。あなたはこのポップポップポップ体験を得ることができます。典型的な解決策は、ステップのコライダーとしてランプを使用することです。これにより、階段を上るスムーズな方法が提供されますが、足のIKは個々のステップを認識しません。代わりに、階段で停止した場合、足IKは、自分が坂道に乗っており、足が傾いていると判断します。stepping」と呼ばれる機能が含まれています。基本的に、ポップアップするのではなく、時間をかけてステップアップします。Speed」は、より高いステップに移動する速度(単位/秒)を決定します。Speed」は、下のステップに移動する速度を決定します。Angle」は勾配に使用されます。地面の角度がこの値より急な場合、スムーズなステップを無効にします。キャッチキャッチは、より長い階段やランプを扱うとき、キャラクターがあなたが前進するよりもゆっくりと上昇することです。この場合、キャラクターは沈んでゆっくりと立ち上がっているように見えます。これを修正するには、いくつかのオプションがあります。Speed」を「0」に設定して、スムーズなステップを無効にします。これにより、従来の方法でステップを上下させることができます。速度を上げるこの「キャッチ」が通常発生する理由は、キャラクターが上下に移動するよりも速く前進するためです。そのため、ゲームのプレイに合わせて速度を上げることができます。ステッピングはより速くなり、前方への動きに追いつくはずです。Angle」を下げて、地形などのスムーズな踏み込みを無効にすることができます。実際、「3」は地形に適した数値であることがわかりました。FAQ:急斜面での沈没キャラクターのコライダーがなぜ斜面に沈むのか、何人かの人に尋ねました。ほとんどのキャラクターは完璧なカプセルや球体ではありません。カプセルと球体を使用して衝突領域を定義します。これらは衝突検出が高速であり、単純さを提供し、凹凸のある地面を移動するときに湾曲した底が役立つためです。急な傾斜が問題になる場合があります。これは非常に簡単に視覚化できます。最初の写真では、沈没は許可されていません。代わりに、コライダーを強制的に斜面で停止させます。この場合、キャラクターはもはや「接地」されておらず、実際には空中に浮いています。これにより、キャラクターが浮かんでいるように見えるだけでなく、ACはキャラクターが浮かんでいるとみなし、動きを止めることができます。したがって、ドキュメントで前述したように、グラウンディングとコリジョンは異なる方法で発生します。沈むもう1つの理由は、足IKです。コライダーの形状に厳密に従うと、足が地面に到達することはなく、環境に対してより自然な姿勢を強制することはできません。いえ、これについてはある程度の制御が可能です。ramp」オプションを使用して、コライダーがランプを尊重するかどうかを決定します。公正な警告:コライダーが傾斜路に沈むことを許可することもありますが、コードが重要だと感じた場合のみです。向きは重力ではなく、地面に基づいていることに注意してください。壁の上を歩くクモを取ります...世界の重力は変わりませんが、向きは変わりました。Relative」フラグを使用して、個人の重力を変更することでクモが壁にくっつくようにします。これは向きの変化を引き起こさず、単に彼の重力が彼を地面の法線に引き寄せていることを確認します。クモが壁にいる場合、壁に向かって押され、壁に「接地」されていることを意味します。時々、キャラクターに特定の向きを持たせることができます。実際、クモが壁にジャンプするときにACデモ(demo_Factor)でこれを行います。クモの動きを担当するSpiderDriver.csファイルを確認してください。これを行うには、ACのSetTargetGroundNormal()関数を使用します。Ground」がオンになっている場合、俳優の向きを変更させる地面法線を強制できます。SetTargetGroundNormalの設定に加えて、アクターがこの方向に向くのにかかる速度を変更することもできます。OrientToGroundSpeedでそれを行うことができます。繰り返しになりますが、SpiderDriver.csでこのすべてが発生しています。・167行目:プレイヤーがジャンプを押し、壁が見つかりました。・行175:ジャンプを押すプレーヤーに基づいてOrientToGroundSpeedを変更します・179行目:方向を変えるとスパイダーが上に移動するようにインパルスを追加します・行112:SetTargetGroundNormalが呼び出され、アクターが回転を開始します・行105:アクターが新しい地上ターゲットに到達し、SetTargetGroundNormalがクリアされます考えておくべきこと:アクターが自分の原点を中心に単純に回転すると、おそらく壁や床に埋め込まれてしまいます。そのため、それを防ぐために、衝動や動きを追加する必要があるかもしれません。私は179行目でそれをしますFAQ:ジャンプの追加ジャンプは、いくつかの異なる方法で実装できます。私は、キャラクターにリフトをかける力を使用してから、重力でキャラクターを引き下げます。物理的な力によって動かされた根このアプローチにはいくつかの利点があります。ACは、キャラクターのルートを自分の足元に残しておくのが好きです。それがキャラクターの本当の位置です。そのため、ジャンプでルートを移動すると、オブジェクトの上に簡単にジャンプできます。2.ゲームでは、ジャンプの力を変更するだけで、キャラクターのジャンプの高さを変更できます。3.頭部の変形を使用するように体型を設定すると、体型はキャラクターのポーズに合わせて自動的にサイズ変更されます。ここの設定を参照してください。「ボトム変換」がどのように空であるかに注意してください。ルートに基づいています。「トップトランスフォーム」は頭の骨に基づいています。力を適用するには、次のようにACのAddImpulse関数を呼び出すだけです。_JumpForce);このアプローチを採用する場合は、通常、ジャンプアニメーションでキャラクターが立ち上がらないように設定します。代わりに、彼の足は根元にとどまります。生のアニメーションはそれ自体少し奇妙に見えますが、衝動を追加すると、見栄えが良くなります。Jump/アニメーション制御ジャンプAddImpulseアプローチを使用したくない場合は、ジャンプのアップムーブメントをアニメーションに含めることができます。この場合、ルートモーションはないと仮定しています。このアプローチの課題は、体が空中にある間、キャラクターの根がまだ地面にあることです。ルートはアニメーションで移動しませんこれを補うために、通常、コライダーを移動および/またはサイズ変更して、ジャンプの生涯にわたるキャラクターの位置を表します。体の形でこれを行うには、次のようなコードを使用します。}もちろん、ジャンプの発生時に設定を変更し、ジャンプが完了したら元に戻す必要があります。考えるべきもう1つのことは、ルートがまだ地面にあるため、オブジェクトにジャンプすることは少し難しいことです。その理由は、ルートが実際にジャンプしているボックスに入るからです。:これらのすべての場合、ジャンプ、ルート位置、およびカプセル形状を補正するのはドライバー次第です。ダブルジャンプダブルジャンプを実装する場合、AddImpulse()を再度呼び出す前に、ACの「AccumulatedVelocity」プロパティをクリアする必要があります。その理由は物理学です...ジャンプにAddImpluse()を使用する場合、重力を扱います。現実と同じように、上昇するにつれて速度が低下し(重力が初期ジャンプ速度に対抗するため)、頂点で速度が0になり、下降するにつれて速度が増加します(重力のため)。速度の累積を「AccumulatedVelocity」変数に保存します。したがって、落下して重力が速度を上げると、フレームごとにキャプチャされます。ダブルジャンプに対してAddImpulse()を再度実行すると速度が追加されるため、現在の累積速度に応じて異なる結果を得ることができます。あなたがジャンプの落下側にいて、多くの重力速度が蓄積している場合、ダブルジャンプでは再び上に移動するには不十分な場合があります。AccumulatedVelocityをクリアすることにより、時間の経過とともに重力が増加し、蓄積が最初から始まる衝撃を取り除きます。それで、あなたはあなたの現在の位置からの新しい新鮮なジャンプをするでしょう。AccumulatedVelocityをクリアするには、次のようなコードを実行します。Vector3.zero;よくある質問アクターコントローラが互いに衝突するのを防ぐにはどうすればよいですか?早い段階で覚えているなら、衝突と接地の違いについて話します。2人のアクターが互いに衝突しないようにしたとしても、彼らがお互いを通過するときに奇妙な結果が得られる可能性があります。それは、一方が他方の上に「接地」されることを望むためです。2人のアクターがいるとします。1つはレイヤー#8に、もう1つはレイヤー#9にあります。Layers」に他のキャラクターレイヤーが含まれないようにします。Layers」にはこれらのレイヤーが含まれていないため、衝突しません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。新しくなったMandelbulber2、使ってみた。