ホーム » 「アセット」タグがついた投稿

タグアーカイブ: アセット

CorgiEngineの情報があるところと覚書

2Dアクションゲームが作れるアセット。
2Dアクションの基本はだいたい網羅されてて、カスタマイズもできる。
いつもアセットストアの目立つところにあるので、きっと良いものに違いない。
気になって購入した。

今は、使い方を覚えようと情報集め中。
CorgiEngineの情報があるところメモしたよ。

◆公式ドキュメント

◆公式YouTube

◆CorgiEngine-1-とりあえず使ってみる/げんとめブログ

◆Corgi Engineを勉強中 Part.1〜最小のシーンを作る

◆Unity&CorgiEngineを使ったアクションゲーム作り ~アニメーションと当たり判定①~

◆Corgi EngineのNPCのAIを細かく砕く


とりあえずやってみたこと。

●MinimalLevelという最低限必要なものだけがあるシーンがあり、それをコピーする。
●キャラクターを追加するのは、任意のゲームオブジェクトに「Character」というコンポネートを追加。それをプレイヤーとして使いたい場合は、コンポネート内の「Autobuild Player Character」それ以外のAI(敵とかNPC)にしたい場合は、「Autobuild AI Character」を押す。
●色んな能力が追加されるので、いらないものを外したり、変更したりでオリジナルのキャラクターにしていく。
英語なのがネックなだけで、欲しい能力はチェックして、変更したい場合は数値をいじったり、いらないのは外すという素直な作りなので、理解しやすいと思う。

ジェットパックがいらないと思ったら「Character Jetpack」のチェックを外せばいけました。
デフォで2段ジャンプだったので1度でいいと思ったら、「Character Jump」の中の項目「Number Of Jumps」の数値を1に変更したらOKでした。
落下中ジャンプができてしまうのをできないようにしたいと思ったら、「Character Jump」の中の項目「Jump Restrictions」の選択タブを「Can Jamp On Ground」にしたらできた。


とりあえずやってみたのはここまで。
どんな機能があるのかは、学習中であります。

Archery Motion Packドキュメント和訳

Archery Motion Pack
Unityアセット。矢のような発射物撃つための基礎パック。
Motion Controller v2 と連動してるので、ついでに購入しました。

Motion Controller v2 を併せて購入しないと使用できないので注意。
Motion Controller同様に、ドキュメントが英語の為、日本語和訳したものをメモ。覚書。


モーションパック/Motion Packs
モーションコントローラーのUIがわずかに変更され、「Packs」のボタンが追加されました。
「Packs」ボタンを押すと、プロジェクトにインポートされたモーションパックがリストされます。パックを選択すると、パックに関する詳細情報が提供されます。
この場合、「Archery」パックを選択すると、Archery Packの詳細がリストされます。
各パックには異なるオプションが表示される場合があります。アーチェリーパックの場合、各オプションについて説明します。下部の「Setup Pack」ボタンをクリックすると、チェックされたオプションが実行されます。

Animator Layer
装備、保管、および攻撃の動きをどのレイヤーに適用するかを決定します。  これにより、歩行中に装備と射撃が可能になります。

Create Mecanim
このオプションは、パックのモーションで使用されるMecanimサブステートマシンを作成/再作成するために使用されます。
これがまさに通常のモーションで行うことです。
ここでショートカットを作成します。

Create Motions
これは実際に弓の動きを作成するオブジェクトです。 Movement Styleオプションに基づいて、特定のモーションが有効化および無効化されます。

Create Input Aliases
オンにすると、モーションで使用されるすべての必要な入力エイリアスがUnityの入力マネージャーで作成されます。これは、プロジェクト全体で行う必要があるだけです。

Create Inventory
在庫ソリューションがない場合、このオプションは「基本在庫」コンポーネントを作成し、キャラクターに追加します。

Create Attributes
属性ソリューションがない場合は、このオプションは、「基本属性」コンポーネントを作成し、キャラクターに追加します。

Create Core
キャラクターにアクターコアがない場合、自動的に作成されます。

通常、「セットアップパック」を押す前に、これらのオプションをすべてチェックしたままにします。
ただし、キャラクターをカスタマイズして他のアセットを含めると、基本的なインベントリソリューションが不要になる場合があります。

Inputs
ほとんどの場合、キャラクターの移動と制御にはUnityの標準入力を使用します。 ただし、武器の照準や鞘のようなものをサポートするために、いくつかの新しい入力エントリが追加されています。

これらすべての追加エントリには、「キーボード」エントリとXboxコントローラーエントリがあります。

モーションコントローラーと入力ソースの標準に従って、特別なキー(Bow-Unsheatheなど)が必要な各モーションでは、入力エントリを変更できます。
これらをアクションエイリアスと呼び、モーションをトリガーします。
 たとえば、Bow – Unsheatheは上記の「Sheathe Bow」エントリを使用します。

このアプローチを使用すると、「アクションエイリアス」を設定するか、エイリアスが表すキーまたはボタンを変更することで、モーションが使用する入力エントリを変更できます。

キーまたはボタンの変更方法は、使用している入力ソリューションによって異なります。
  標準のUnity Input Managerの場合、「編集| プロジェクト設定… | Unityのメニュー項目を入力します。

アクターコア/Actor Core
前述したように、アクターコアはすべてのキャラクターに存在し、キャラクターの意思決定とロジックの一部を表します。
アクターコアを持つキャラクターに矢が当たると、ダメージを受けて適切に反応するのはアクターコアです。

オブジェクトが破損または破壊されないオブジェクトである場合、Actor Coreは必要ないことに注意してください。

アクターコアは非常に基本的なものです。次のプロパティがあります。

Attribute Source(属性ソース)
アクターの属性を含むコンポーネント。

Health ID(ヘルスID) ヘルス値を保持する属性のIDである文字列。

Is Alive オブジェクトがまだアクティブかどうかを決定する単純なブール値。

Damaged Motion
ダメージが矢から取られたときにアクティブにするモーションの名前。

Death Motion
アクターが死ぬほどのダメージを受けたときにアクティブにするモーションの名前。

Code Summary
内部的に、Actor Coreにはいくつかの重要な機能があります。

OnDamaged()
この関数は、ActorCoreを持つオブジェクトに影響を与えるときにArrowCoreによって呼び出されます。
これは、矢がヒットしたキャラクターとダメージの程度をキャラクターに伝える方法です。
この関数では、ActorCoreは属性ソースに体力の程度を尋ねます。
ダメージがこのヘルスを超えると、キャラクターは死にます。

OnDeath()
この関数は、ダメージがキャラクターの体力を超えた場合にOnDamaged関数によって呼び出されます。

死のアニメーションが終了すると、モーションコントローラーは無効になります。

IActorCore Interface
独自の「actor heart beat」MonoBehaviourがある場合、 IActorCoreインターフェイスをクラスに追加し、これを無視するだけです。繰り返しますが、目標はモジュール式で交換可能にすることです。
基本属性/Basic Attributes

Actor Core内に単にヘルス属性を保存することもできましたが、属性を管理している可能性のあるRPGアセットをサポートするのに十分なモジュール性を確保したかったのです。

あなたが以前から思い出すなら、私は属性ソースについて話しました。ソースは、使用されているソリューションに関係なく属性を取得するために使用できる単なるブリッジです。この「基本属性」コンポーネントは、RPG属性アセットの非常に基本的なバージョンです。すべての属性ソースと同様に、IAttributeSourceインターフェイスを実装します。

この方法で属性を実装することにより、ゲームに新しい属性を追加できます。
Archeryアドオンでは、1つの属性のみが重要です。

HEALTH キャラクターが実際に持っている現在の健康。覚えている
これは、上記のアクターコアで使用したIDです。

コードの要約
属性ソースとして、次の機能を使用できます。

GetAttributeValue()この関数は、指定された名前の属性の値を返します。

SetAttributeValue()この関数は、名前を指定して属性の値を設定します。

イメージできるように、これらの2つの関数は、キャラクターの現在の健康状態を取得して保存するために、Actor Coreによって使用されます。
アクターコアは、「健康」属性に基づいて、キャラクターが単に損傷したか殺されたかを判断します。

基本インベントリ/Basic Inventory
使用する在庫ソリューションにはIInventorySourceインターフェースを実装する必要があります。これにより、情報を取得する方法がわかります。

私の「基本インベントリ」ソリューションは非常に基本的なものですが、インベントリソースです。
私の実装には3つのリストが含まれています。
アイテム、スロット、武器セット。

アイテムリストには、キャラクターがインベントリに持っているすべてのアイテムとそれらのいくつかのプロパティが含まれています。

スロットリストは、アイテムの使用状況を表します。
したがって、「LEFT_HAND」スロットは、左側に装備されているものを定義します。
「READY_PROJECTILE」スロットは、使用可能な矢を決定します。
左の例では、キャラクターには弓(「Longbow_01」)と矢のセット(「Arrow_01」)があります。
現在、彼は左手に何も持っていませんが、彼の矢筒は矢のセットを持っています。

武器セットを使用すると、アイテムをグループ化して、装備と保管を同時に行うことができます。
たとえば、「武器セット2」にはLongbow_01とArrow_01が含まれます。別の武器が私の剣と盾になると想像できます。

アイテム/Items
各アイテムには次のプロパティがあります。
ID アイテムを一意に識別する単純な文字列。
Equip Motion アイテムの装備に使用されるモーションの名前
Store Motion アイテムを保存するために使用されるモーションの名前
Instanceアイテムである編集時に作成されたインスタンス
Resource Pathこれは、アイテムを表すプレハブを見つけることができるUnityリソースフォルダーのパスです。
この値を使用して、時間が来たら弓と矢を作成します。
スロット/Slots

各スロットには次のプロパティがあります。
ID –スロットを一意に識別する単純な文字列。
アイテムID 現在スロットにあるアイテムのID。空の値は、スロットが空であることを意味します。

アイテムの変更
武器セット(武器セット2など)を装備すると、武器セットのアイテムが装備されます。 これらの武器セットアイテムは、どのアイテムがどのスロットに入るかを定義します。 したがって、スロットのアイテムが更新されます。

そのため、デフォルトでは「READY_PROJECTILE」スロットには「Arrow_01」アイテムが表示されます。 「Arrow_01」アイテムは、アイテムの「リソースパス」プロパティを使用してスポーンする矢印を定義するプレハブの場所を示します。

新しい種類の矢印を作成するとしましょう… [アイテム]セクションに新しいアイテムとして追加し、「Arrow_02」などのIDを付けて、リソースパスを新しいプレハブに設定します。 次に、スロットにアイテムを設定する武器セットアイテム(「READY_PROJECTILE」)で、エントリの「アイテムID」の値を「Arrow_01」から「Arrow_02」に変更します。

矢を別の方法で変更する場合は、[スロット]セクションでアイテムIDを直接変更できます。

コードの要約
インベントリソースとして、次の機能を使用できます。

GetResourcePath()指定されたアイテムのリソースパスを取得します。
EquipItem()指定されたスロットに指定されたアイテムを装備します。
GetEquippedItemID()指定されたスロット内のアイテムのアイテムIDを取得します。
ClearSlot()指定されたスロットからアイテムを削除します。 これらの関数は、弓と矢を作成し、弓を装備/装備解除するためにアーチェリーの動きで使用されます。 繰り返しますが、必要なインベントリソリューションを使用できます。しかしながら、 そのソリューションは、IInventorySourceインターフェイスを実装する必要があります。
レチクル/Reticle
シーンにレチクルを追加するのは、付属のCrosshair Fill Circleスクリプトを使用するだけです。

BGテクスチャは、レチクルの背景画像です。
カスタマイズするには、画像を置き換えるだけです。

塗りつぶしテクスチャは、弓に動力が供給されているときにBGテクスチャをオーバーレイするものです。 このテクスチャも置き換えてください。

弓の動きにより、レチクルが自動的に有効化、無効化、および更新されます。


パックには、ゲームで使用できる弓が含まれています。弓のプロパティをカスタマイズすることも、ガイドラインに従って独自の弓を作成することもできます。

弓は、モデル、コア、プレハブの3つの部分で構成されています。

弓モデル
このモデルは、実際にはボーン付きのスキンメッシュです。このようにして、引き戻すときに弓を曲げることができます。この弓は、Mayaで作成、リギング、およびスキン作成されました。

IKを使用してジョイントを曲げるので、弓をアニメートする必要はありません。

スケルトンのルートは、矢が置かれる場所です。

画像は、Mayaの弓とボーンの配置方法を示しています。
特定の数のボーンは必要ありません…しかし、追加するほど曲線は滑らかになります。

弦の中心にもボーンがあります。それが「nock」であり、矢を固定する場所です。
したがって、nockを戻すと、弦と矢も戻ります。

骨の名前
使用する必要がある4つの重要な名前があります。
「root」はスケルトンを開始するボーンです。
「nock」は、弦の中央の骨です。
「upper1」は、曲げる弓の上部にある最初のボーンです。
「lower1」(図示せず)は、曲げる弓の一番下の最初のボーンです。
Bow Coreは、トランスフォーム階層でこれらのトランスフォーム名を探します。

ボウコア/Bow Core
弓の芯は弓の鼓動です。弓の曲がり方、力などを制御します。
キャラクターの左手のボーンがどのように作成されるかわからないため、補正するために「Local Position(ローカル位置)」と「Local Rotation(ローカル回転)」の値を含めます。

これには試行錯誤が必要ですが、左手の骨に対する弓の位置と回転をオフセットできます。

MountPointsを使用している場合、これらについて心配する必要はありません。

弓にはオーバードロー(またはパワーアップ)する能力があるため、ドローパワーとインパクトパワーは範囲です。

引き力は、弓がどれだけ遠くに飛ぶかを決定します。
この値は、飛行する前に矢印に加える力の大きさです。
したがって、オーバードローがない場合、上の画像は1600の値を使用します。100%オーバードローがある場合、2000の値を使用します。

これらの値は、矢印の剛体のAddForce()関数で使用されます。

Impact Powerは、矢印が剛体に衝突するときに使用する乗数です。

これにより、弓自体が矢印の力を超える力を追加できます。これは、矢印のヒット強度を上げるのに役立ちます。

弓プレハブ/Bow Prefab
最後の部分は、弓のプレハブ自体です。弓が装備されたら、プレハブをインスタンス化します。

プレハブを構築するとき、プレハブの原点がハンドルと一致し、前方を向くように、弓のスキンメッシュを配置します。これにより、キャラクターの手に入れるのが簡単になります。

ご想像のとおり、プレハブにはBow Coreと、プレハブに固有の変更した設定が保持されます。

複数のプレハブを作成することで、ロングボウ、ショートボウ、さらに遠くに発射するマジックロングボウなどを作成できます。

矢/Arrow
弓と同様に、矢をカスタマイズできます。
矢印も、モデル、コア、プレハブの3つの部分で構成されています。

矢モデル/Arrow Model 
矢印モデルは単なる静的メッシュです。方向と起源以外に特別なことは何もありません。

Unityでは、順方向を矢印の順方向にする必要があります。

起源については、私はそれを矢じりの先端に置くのではなく、もっと後ろに置きます。その理由は、ターゲットに矢印を埋め込むときに、矢印がターゲット内にあるように見せたいからです。

アローコア/Arrow Core
アクターコアおよびボウコアと同様に、アローコアはアローの鼓動です。衝突を検出し、衝突が発生したときに反応する方法です。
Embed Distanceは、ターゲットが衝突したときに矢をターゲットにプッシュする少し余分な量です。
ほとんどのキャラクターにはボディメッシュから離れたコライダーがあるため、これを行います。これにより、矢印が実際に頭または胸の中にあるように見えます。

Tail Distanceは、矢を元に戻すとき、弦からの距離を決定するために使用するものです。矢を引き戻すためのオフセットのようなものだと考えてください。

矢がターゲットに影響を与えると、Max Ageによって矢の有効期間(秒単位)が決まります。0に設定すると、矢はそれ自体を破壊しません。

Impact Powerは、ターゲットが剛体である場合にターゲットに適用される力の基本的な大きさです。

これが、Unityの物理学の下でターゲットを移動させる原因です。
最終的な力の大きさは、この値に弓の衝撃力を掛けたものになります。

Damageは、ダメージ範囲です。
Minは、弓の特性と同様に、オーバードローされていない場合の最小ダメージ。
Maxは、弓が100%オーバードローされている場合の最大ダメージ。

どちらの場合も、ターゲットにIActorCoreコンポーネントがある場合にのみダメージが適用されます。
Arrowプレハブ
矢印のプレハブには、剛体を含める必要があります。
リジッドボディは、実際に矢印を前進させるものです。
弓が発砲すると、リジッドボディのAddForce()メソッドを呼び出し、その方向に矢印を送信します。

独自のプレハブを構築するときは、Arrow Coreコンポーネントが無効になっていることを確認してください。
矢を放つときに有効にします。

コライダー
矢印プレハブにはコライダーがありません。

多くのテストを通じて、コライダーは矢印ではうまく機能しないことがわかりました。代わりに、矢印が飛ぶときに短いレイキャストを使用します。

このレイキャストは、ヒットしたものや角度などについて、より正確でタイムリーな情報を提供します。

Motions
前に、各モーションの簡単な説明をしました。ここで、モーションプロパティについて詳しく説明します。

ベーシックアイドル/Basic Idle
弓を手に持つシンプルなアイドルアニメーション。

Rotate With Input-マウス(右スティック)の移動に合わせてキャラクターが回転するかどうかを決定します。

Rotate With Camera-カメラの方向に合わせてキャラクターが回転するかどうかを決定します。

Rotation Speed -回転する1秒あたりの度数。

Use Pivot Animations-回転中にピボットアニメーションを使用するかどうかを決定します。回転は90度未満の増分で行われる可能性があるため、アニメーションが過剰になる可能性があります。必要に応じて使用できます。

基本アイテム装備/Basic Item Equip
装備する右弓を決定してから装備するUnsheatheアニメーション。

Action Alias-弓を装備する入力エントリ

Bow Resource Path-インベントリソースを使用しない場合は、弓プレハブへのリソースパスをインスタンス化します。

Inventory Source–弓のリソースパスを取得する在庫ソース。
空のままにした場合、在庫ソースがこのキャラクターにあるかどうかを確認します。

Equip Slot ID-弓を配置するインベントリソースのスロットID。

Bow Ready Slot ID –インベントリソースのスロットID。どの弓を装備する必要があるかを示します。 基本アイテムストア/Basic Item Store
弓を片付け、通常の(弓ではない)アイドル状態に戻ります。

Action Alias–弓を装備解除する入力エントリ

Inventory Source –弓を装備していないと言うために使用する在庫ソース。

Equip Slot ID–クリアするインベントリソースのスロットID。

Basic Walk Run Pivot
移動中、手に弓を持つ動き。
この移動スタイルは、より「アドベンチャー」スタイルであり、軌道カメラで使用する場合、キャラクターはカメラに向かって歩くことができます。

Default to Run–キャラクターがデフォルトで走行または歩行するかどうかを決定します(アクションエイリアスによって反転します)。

Run Action Alias-[Default to Run]オプションに基づいてキャラクターの走行(または歩行)をトリガーするために使用します

Walk Speed-0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Run Speed-0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Rotation Speed-回転する1秒あたりの度数。
Basic Walk Run Store
移動中、手に弓を持つ動き。
この動きのスタイルは、より「シューター」スタイルであり、常にキャラクターが前方を向いています。ストラフィングをサポートします。

Similar to the standard WalkRun …モーションと同様に、WalkRunPivotまたはWalkRunStrafeのみを有効にします。両方ではありません。

Default to Run–キャラクターがデフォルトで走行または歩行するかどうかを決定します(アクションエイリアスによって反転します)。

Run Action Alias-[Default to Run]オプションに基づいてキャラクターの走行(または歩行)をトリガーするために使用されます。

Walk Speed-0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Run Speed -0より大きい場合、ルートモーションをオーバーライドし、一定の速度(1秒あたりの単位)を作成します。

Rotate With Input-マウス(右スティック)の移動に合わせてキャラクターが回転するかどうかを決定します。

Rotate With Camera-カメラの方向に合わせてキャラクターが回転するかどうかを決定します。

Rotation Speed-回転する1秒あたりの度数。

Stop Delay – Mecanimブレンドツリーを支援するために、停止する前に追加する小さな遅延。
Basic Ranged Attack
矢印を発射するために使用されるモーション。

Attack Action Alias –弓を撃つようにキャラクターをトリガーするために使用されます。

Rotate With Input-マウス(右スティック)の移動に合わせてキャラクターが回転するかどうかを決定します。

Rotate With Camera-カメラの方向に合わせてキャラクターが回転するかどうかを決定します。

Rotation Speed -回転する1秒あたりの度数。

Horizo​​ntal Angle –左腕のヨー(左/右回転)をオフセットするIK値。これは、弓を向けるのに役立ちます。

Vertical Angle-左腕のピッチ(上下の回転)をオフセットするIK値。これは、弓を向けるのに役立ちます。

Quick Horizontal Angle -クイックショットを行うときに左腕のヨー(左/右回転)をオフセットするIK値。
これは、弓を向けるのに役立ちます。

Quick Vertical Angle –クイックショットを行うときに左腕のピッチ(上下の回転)をオフセットするIK値。
これは、弓を向けるのに役立ちます。

Arrow Resource Path -インベントリソースを使用しない場合、インスタンス化する矢印プレハブへのリソースパス。

Inventory Source –弓のリソースパスを取得する在庫ソース。空のままにすると、在庫ソースがこのキャラクターにあるかどうかを確認します。

Arrow Ready Slot ID –どの矢印を装備する必要があるかを示すインベントリソースのスロットID。

Release From Camera –デフォルトでは、矢印は弓の現在の位置から発射します。 ただし、アニメーションによっては、矢印が小さな角度で発射される場合があります。
 矢印を完全に制御したい場合は、代わりにカメラから撮影してください。 これは、肩越しモードに特に役立ちます。

Release Time–アニメーション内で矢印をリリースするとき。

Default Draw Force-弓から値が設定されていない場合、矢印を発射するデフォルトの力。
Basic Damaged
アクターが矢印に当たったときに使用されるアニメーション。
Basic Death
アクターが矢印で殺されたときに使用されるアニメーション。

NPC
Archery Motion PackはNPCをサポートしています。
これを行うには、PCと同じようにNPCを設定します。
次に、さらにいくつかの変更を加えます。

最初に、変換を使用して動きを決定するようにアクタコントローラが設定されていることを確認します。
次に、入力ソースまたはカメラリグが自動的に設定または検出されないことを確認します。
最後に、NPCにはNPCSの他のコンポーネントとともに「戦闘員」コンポーネントを追加する必要があります。
Code
これらの変更により、NPCを制御する準備が整いました。
Node Canvas、Behavior Designer、またはその他のAIドライバーのいずれかを使用するか、コードを使用してNPCを制御できます。
アセットには、見て、使用するためのデモといくつかのNPCコードが含まれています。

デモ:Assets \ ootii \ _Demos \ MotionControllerPacks \ Archery \ Demos \ Scenes \ demo_NPC_Shooter

AIコード:Assets \ ootii \ _Demos \ MotionControllerPacks \ Archery \ Demos \ Scenes \ AMP_NPC_Controller

通常の移動ロジックに加えて、NPCが矢を発射できるようにする実際のコードは次のとおりです。

CombatMessage lMessage = CombatMessage.Allocate();
lMessage.ID = CombatMessage.MSG_COMBATANT_ATTACK;
lMessage.Attacker = gameObject;
lMessage.Defender = Target.gameObject;
mMotionController.SendMessage(lMessage);
CombatMessage.Release(lMessage);

NPCアーチャーが弓を装備している場合、この「攻撃」メッセージを送信すると、ディフェンダーに向かって発砲します。
防御側の代わりに射撃する方向を設定することもできます。 防御者の代わりに、メッセージに「HitDirection」vector3変数を設定するだけです。

Camera Controllerドキュメント和訳

3人称視点、1人称視点、トランジションなどのゲームカメラを管理するために使用される Unityのアセット。35ドル。購入しました。
ドキュメントが英語PDFなので、日本語翻訳したものをメモ。覚書。

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


カスタムクイックスタート
このクイックスタートでは、プロジェクトがあり、Camera Controllerを使用してカメラを管理することを想定しています。
1. Unity 5プロジェクトを開きます。
2. Camera Controllerアセットをダウンロードしてインポートします。
3.シーンのルートに新しいGameObjectを追加します。
4.「Camera Controller」コンポーネントを新しいGameObjectに追加します。
[コンポーネント| ootii | カメラリグ| カメラコントローラーのメニューアイテム。
5.カメラのスタイルを選択します
6.カメラが追従するキャラクターを設定します。
7.必要に応じてオプションを設定します。
概要
Camera Controllerは、Adventure Cameraが実行したことすべてを実行します。
AAA品質の3人称カメラであることに加えて、カメラコントローラーは1人称カメラ、MOBAカメラ、カットシーンカメラなどでもあります。
カスタマイズ可能な「モーター」を使用して、カメラコントローラーはシーンカメラを駆動して、プレイヤーにスムーズで機能豊富なエクスペリエンスを作成します。
モーターを有効または無効にすることで、Camera Controllerは3Dゲームに適合します。
私の他の資産と同様に、Camera Controllerは拡張できるように構築されています。
すぐに使用できるモーターの使用に加えて、カメラの位置と回転を管理するための独自のモーターを作成できます。
次に、トランジションモーターを使用して、異なるカメラモーターをブレンドできます。

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


 Camera Controller
これは、カメラモーターのメインコンポーネントおよびマネージャーです。

カメラコントローラーはエディターGUIを処理しませんが、モーターが想定どおりに動作することも確認します。

衝突検出や視野ズームなどのコア機能は、モーターではなくカメラコントローラーで実行されます。

Camera Controllerには、BasicとAdvancedの2つのビューがあります。

基本ビューは、デフォルト値を使用したクイックセットアップに使用されます。
基本的なビューでは、ボンネットの下にカメラモーターが追加されます。
 次に、これらのモーターにデフォルト値を設定して、選択した動作を作成します。

詳細表示では、カメラのモーターに直接アクセスできます。

ここで、値を変更したり、モーターを追加したりできます。

Input Sources
全員が同じ入力ソリューションを使用した場合、これは必要ありません。
ただし、Unityのネイティブ入力ソリューションを使用する人、Easy Inputを好む人、Asset Storeにある他のアセットを使用する人もいます。

つまり、入力を取得する一般的な方法が必要であるため、モーションを1回コーディングして、任意のソリューションからユーザー入力を取得できます。 それが入力ソースです。入力を取得する一般的な方法。好みの入力ソリューションを「input source」にラップすることにより、MCとモーション自体が入力ソースを使用して、選択された入力ソリューション。

カメラコントローラーには、Unityのネイティブソリューションを使用してユーザー入力を取得する方法を知っている「Unity Input Source」が含まれています。
Easy Inputには「Easy Input Source」が含まれており、必要に応じて他の「Input Sources」を作成して、お気に入りのソリューションを操作できます。

アクションエイリアス/Action Aliases
モーター全体で、「アクションエイリアス」を使用して、入力が発生したかどうか、モーターを起動するタイミングかどうかを確認します。
アクションエイリアスは、キープレスまたは入力条件に付けられるわかりやすい名前であり、その仕組みを理解せずに問い合わせることができます。
例を見てみましょう…
3人称固定モーターには、デフォルト値が「Camera Rotate Character」であるアクションエイリアスプロパティがあります。
モーターはこの値を使用して、アンカーとともにアンカーを回転させる必要があるかどうかを確認します。

カメラ:
bool lShouldRotate = InputSource.IsJustPressed(“Camera Rotate Character”);

モーターは、入力がどのように処理されたかをあまり気にしません。
trueまたはfalseの値が返されることに注意してください。
これは、Unityが入力システムで行うこととまったく同じです(上記を参照)。


Camera Motors/カメラモーター
カメラモーターは、入力または環境に基づいてカメラを移動および回転させます。

カメラコントローラーには、7つのモーターが組み込まれています。

1st Person View(一人称視点)

モーターは一人称視点のゲームに使用され、プレイヤーの目を表します。

3rd Person Fixed(3人称固定)

3人称ゲームで使用すると、モーターはポールでプレイヤーに取り付けられているように動きます。
このモーターは、3人称シューティングゲームに最適です。

3rd Person Follow –(3人称フォロー)

3人称ゲームで使用され、ロープで取り付けられているようにプレーヤーの後ろにドラッグします。このモーターは、現代の3人称アドベンチャーゲームを模倣しています。

Fixed Motor(固定モーター)

このモーターの位置と回転は固定されています。

Spline Motor(スプラインモーター)

経路を設定でき、モーターは経路をたどります。これはカットシーンに最適ですが、動きを終えたり、ゲーム内で視覚的な手がかりを提供したりします。

Top Down View(トップダウンビュー)

最新のMOBAや戦略ゲームで見られるようなカメラの動きを提供します。 このモーターはトップダウンエクスペリエンスを提供し、ディアブロスタイルのゲームにも使用できます。

Transition Motor(移行モーター)

このモーターを使用すると、あるモーターから別のモーターにブレンドできます。 ユーザー入力、カットシーンなどに基づいてさまざまなビューを作成するのに最適です。

衝突
カメラコントローラーは、衝突処理に「視線」の障害を使用します。
つまり、衝突は物理オブジェクトのようには処理されません。
これにはいくつかの理由があります。

1.典型的な物理オブジェクトでは、キューブはカメラの球体コライダーをキャラクターまたはアンカーから非常に遠くに押し出すことができます。
典型的な物理的衝突を許可した場合、プレーヤーはカメラの制御を失います。
2.カメラとターゲットの間に物体が来た場合、実際に衝突が発生しない可能性があります。したがって、物理反応はありません。

最良の結果を得るには、キャラクターのコライダーがカメラの衝突半径よりも広いことを確認する必要があります。

この方法では、カメラテストが壁をスキミングし、距離全体にわたって無効な結果を返すような状況にはなりません。

カメラは安全な場所がない状況に対処するために最善を尽くしますが、奇妙な状況を防ぐことが最善です。

デバッグ
カメラコントローラーは、ランタイム中にアンカーとオフセットが画像にどのように適合するかを示すデバッグモードをサポートしています。
オフセットを理解することが重要であり、モーターとモーターのプロパティで詳細を確認できます。ただし、デバッグを有効にするには、次の手順を実行します。

1.「Graphics Manager」スクリプトをシーンの「Main Camera」に追加します。
2.デバッグアイコンの下の[Show Debug Info]チェックボックスをオンにします。
これを行うと、アンカー、オフセット、フォーカスポイントを視覚化できます。

カメラコントローラーのセットアップ/Camera Controller Setup
クイックセットアップの手順に従うと、カメラコントローラーが新しいGameObjectに追加されます。
カメラコントローラーをキャラクターの子として追加することは絶対にしないでください(一人称設定の場合でも)。
クイックセットアップの後、階層は次のようになります。
GameObjectを「Camera Rig」と名付けました。これは、メインカメラを動かすものだからです。 それがカメラコントローラーの追加対象です。
メインカメラのGameObjectをレンズと考えてください。 その変換は次のように見える必要があります。
メインカメラのトランスフォームを完全にクリアすることにより、カメラリグ(カメラコントローラーゲームオブジェクト)の動きと回転に追従します。

次に、必要に応じて入力ソースとアンカーのプロパティを設定します。
入力ソースは、カメラコントローラーがキーを押す、マウスを動かすなどのユーザー入力を取得する方法です。
アンカーは、カメラが追従しているオブジェクトです。 通常、これはあなたのキャラクターです。


Force Update
通常、このプロパティはユーザーが直接設定するものではありません。
このプロパティは、カメラが独自の更新サイクルを実行するか、ootiiキャラクターコントローラーからの更新サイクルを使用するかを決定します。
ootiiキャラクターコントローラーを使用している場合、このチェックボックスはオフになります。そうでない場合は、確認する必要があります。
この区別の理由は、カメラをキャラクターコントローラーの後に走らせたいからです。
ootiiキャラクターコントローラーを使用する場合、それを保証する別の更新サイクルを実行します。


Key Properties
Camera Controllerには、設定が必要ないくつかの重要なプロパティがあります。

Input Source

これは、マウス、キーボード、またはコントローラーから入力を取得する方法です。
カメラが回転、ズームなどのタイミングを決定するために使用する入力ソースを設定します。

Force Update

通常、このプロパティはユーザーが直接設定するものではありません。

このプロパティは、カメラが独自の更新サイクルを実行するか、ootiiキャラクターコントローラーからの更新サイクルを使用するかを決定します。
ootiiキャラクターコントローラーを使用している場合、このチェックボックスはオフになります。
そうでない場合は、確認する必要があります。
この区別の理由は、カメラをキャラクターコントローラーの後に走らせたいからです。 ootiiキャラクターコントローラーを使用する場合、それを保証する別の更新サイクルを実行します。

Anchor(アンカー)

これはカメラがフォローしているキャラクターです。 常にアンカーが必要なわけではありませんが、通常は必要です。

Anchor Offset(アンカーオフセット)

通常、キャラクターのルートは足元にあります。 ほとんどのカメラは頭を追いかけたいと思っています。 したがって、このオフセットを使用して、カメラが追従する最終アンカーポイントを表すことができます。
一部のモーターは異なるオフセットを使用する場合があることに注意してください。 これらの場合、モーター固有のプロパティがあります。 ただし、これらのオフセットでさえ、ここで設定したアンカー+アンカーオフセットに基づきます。

Invert Pitch(反転ピッチ)

このオプションは、入力からヨーおよびピッチするすべてのモーターの反転を設定するグローバルな方法を提供します。


Camera Styles/カメラスタイル
[基本]ビューの[カメラスタイル]セクションは、クイックセットアップを支援するためのものです。
必要なモーターを追加し、プロパティを設定し、開始を支援します。
スタイルが設定されたら、モーターのプロパティを微調整して、カメラを希望どおりに動作させることができます。

一人称スタイルは、標準の一人称カメラの動作を設定します。
3人称スタイルは、標準的な3人称カメラの動作を設定します。
MOB Styleは、標準のトップダウンカメラの動作を設定します。


Options/オプション
基本的なカメラスタイルを選択すると、スタイル固有のオプションが表示されます。
繰り返しますが、これらは簡単なセットアップのためだけであり、最終的にはモーターのプロパティを直接変更します。

基本ビューを使用してカメラをセットアップするか、直接詳細ビューに移動できます。


Camera Motors/カメラモーター カメラモーターリストは、ほとんどのプロパティを管理する場所です。
ここでは、必要に応じてモーターを追加および削除します。
モータータイプが異なるプロパティで複数回追加される場合があります。
これにより、すべてのスタイルのゲームプレイをセットアップできます。


衝突特性/Collision Properties
衝突プロパティは、個々のモーターではなく、カメラコントローラー自体によって管理されます。そのため、これらのプロパティはモーターリストの外にあります。 このカメラは、視線を遮るアプローチを採用しています。このように、オブジェクトがカメラとアンカーの間に来た場合、ビューがブロックされないように、カメラはアンカーの近くに移動します。これは、カメラの周りに球体を置くだけの従来の衝突検出とは少し異なります。このアプローチは、AAAゲームで見られるものを模倣しています。
Is Colliding Enabled(衝突が有効)
衝突を有効または無効にします

Collision Layers(コリジョンレイヤー)
カメラが衝突するGameObjectレイヤー。

Radius(半径)
この半径は、衝突テスト領域のサイズを表します。
半径は、クリッププレーンの近くでカメラを覆うのに十分な大きさであることが重要です。 そうでない場合、近くのクリッププレーンが壁や他のオブジェクトを貫通する可能性があるため、クリッピングが発生する可能性があります。

Min Distance(最小距離)
カメラが取得できるアンカーまでの最小距離。 場合によっては、衝突があったとしても、カメラをアンカーに直接乗せたくない場合があります。 ここでその距離を設定できます。

Recovery Speed(リカバリー速度)
ビューが遮られると、カメラはアンカーに近づきます。 ビューが遮られなくなった場合、「ポップ」する必要はありません。 代わりに、この速度を使用して、カメラを通常の位置にゆっくりとスムーズに戻すことができます。


ズームプロパティ/Zoom Properties
カメラコントローラーは、ズームインに標準的な視野アプローチを使用します。
このアプローチは、望遠鏡がカメラをターゲットに近づけないため、望遠鏡がどのように機能するかに似ていますが、代わりにレンズが視野を変えて視野を拡大します。
このアプローチは、カメラを動かさない場合うまく機能します。
カメラを前方に移動すると、キャラクターとカメラの間に障害物が来る危険があります。
Is Zooming Enabled
ズームできるかどうかを決定します。

Zoom Action Alias
ズームインおよびズームアウトに使用する入力エイリアス。 デフォルトでは、「カメラズーム」はマウスホイールに関連付けられています。

Range
最小視野(最大ズーム)および最大視野を決定します。 通常、最大値はデフォルトの視野です。 値を0に設定すると、ゲームの読み込み時に自動的に設定されます。

Speed
ズームインとズームアウトの速度を決定します。


フェードプロパティ/Fade Properties
フェードプロパティを使用すると、カメラがキャラクターに近すぎると、キャラクターがフェードアウトして見えなくなります。

フェード速度が終了すると、レンダラーを無効にして、キャラクターメッシュがレンダリングされないようにすることができます。
メッシュは、透明なマテリアルが関連付けられている場合にのみ「優雅にフェードイン」することに注意してください。 マテリアルが不透明な場合、メッシュはフェードできません。 ただし、レンダラーを無効にすることはできます。
Is Fade Enabled
フェードが発生するかどうかを決定します。

Fade Distance
フェードが発生する距離です。

Fade Speed
アルファ値がフェードインおよびフェードアウトするまでの変化の速さを示す速度(秒単位)。

Disable Renderers
フェードアウトが完了したら、レンダラーを無効にするかどうかを決定します。


シェイクのプロパティ/Shake Properties
カメラの振動は、カメラコントローラーコンポーネントの関数を呼び出すことにより、コードを介して行われます。

Camera Controllerへの参照を取得することにより、次の呼び出しを行うことができます。
mCameraController.Shake(0.02f、1f、0.5f、1f);
「Shake」機能には次のシグネチャがあります。
・範囲–ランダムな動きが中心からどれだけ離れているか。
・強度X – X軸の動きの乗数(左/右)。
・強度Y – y軸の動きの乗数(上/下)。
・継続時間-シェイクする時間(秒単位)。

プロパティでは、おそらく振動強度曲線に気づいたでしょう。 この曲線を使用すると、揺れの持続時間にわたって適用される強度(または乗数)を指定できます。 曲線が設定されていない場合(フロート0を意味します)、それを基本曲線に変換します。

この方法で、強度は最初の0から中央の1に、最後に0に戻ります。 ランダム化されたシェイク値へのこの乗数は、シェイクへのスムーズなランプアップとランプダウンを作成します。
曲線を変更して、より急激な揺れを作成できます。
モーターとモーターのプロパティ
各モーターは、さまざまな方法でカメラを制御します。カメラに関連付けられたプロパティは、モーターの動作を定義するのに役立ちます。

とはいえ、ほとんどすべてのモーターに共通するプロパティがいくつかあります。

Name
カメラモーターに設定できる名前。
これは、コードでカメラモーターを検索する場合に便利です。

Enabled
モーターを起動できるかどうかを決定します。

Use Rig Anchor
通常、カメラコントローラーのアンカーとアンカーオフセットプロパティを使用します。これらはすべてのモーターに対してグローバルに設定されています。

ただし、このプロパティのチェックを外すと、このモーターのカスタムアンカーとアンカーオフセットを設定できます。

Offsets
「Anchor Offset(アンカーオフセット)」に加えて、このモーターに固有のオフセットを設定できます。


Offsets/オフセット
このカメラのモーターの高度な機能の1つは、アンカー+アンカーオフセットからのオフセット機能です。
これは、真のAAA 3人称カメラの動作を可能にするため重要です。
このグラフィックは、さまざまなアンカープロパティとオフセットプロパティを明確にするのに役立ちます。
AnchorOffset = {0、2、0}
Offset= {-1.0、0、0}

トゥームレイダーの例

下の画像は同じシーンのララを示していますが、カメラは彼女の周りを回っています。 白い線は画面の中心です。 カメラがララのすぐ後ろにないことが簡単にわかります。 代わりに、オフセットがあります。

このオフセットは、カメラがLaraを周回する方法に関係なく尊重されます。 したがって、前の説明を考えると、カメラのセットアップは次のように考えることができます。


衝突とフェージング/Collisions and Fading
前述のように、マスターコリジョンフラグとフェージングフラグはカメラコントローラーで設定されますが、各モーターには、特定のモーターで機能を有効にするかどうかを決定するフラグもあります。
すべてのレンダラーをフェードさせる(デフォルト)か、[Set Fade Renderers]チェックボックスをオンにして、特定のモーターによってどのレンダラーがフェードされるかを選択できます。

[Set Fade Renderers]チェックボックスをオンにすると、レンダラーリストが表示されます。
ここで、どのトランスフォームのレンダラーがフェードインおよびフェードアウトするかを正確に指定できます。

カメラごとにフェードする特定のレンダラーを指定すると便利です。
ただし、3人称カメラと1人称カメラを混在させようとしている場合は、キャラクターに特定の2つのモデルが必要になる可能性があります。


一人称視点モーター/1st Person View Motor
一人称モーターは、従来の一人称ゲームを模倣しています。
キャラクターの(アンカー)の目であるかのようにカメラを回転させることができます。

Yaw は、キャラクターの上軸を中心とした回転です。

Pitch は、カメラの右軸を中心とした回転です。

Speed カメラが軸を中心に回転する速度を決定します。

Range カメラが各軸を周回できる距離の制限を設定します。ヨーの場合、-180および180を使用すると、制限がなくなります。

ピッチについては、カメラが上下逆さまにならないように常に制限があります。

Invert ピッチの反応が異なるように、垂直入力値を反転します。

Smoothing より滑らかな回転を作成するために、軌道に速度ベースのスムージングを提供します。適切な値は0〜0.3です。

Anchor Rotates キャラクターコントローラーがキャラクター(アンカー)を回転させるかどうかを決定するために使用されます。その場合、同期を保つために後処理を行う必要があります。

Rotate Anchor ヨーに合わせてアンカーを回転させるかどうかを決定します。

Rotate Anchor Alias アンカーの回転が発生するかどうかを決定する入力エイリアス。

この方法では、右マウスボタンのようなものが押された場合にのみ回転します。

通常、この値を空白のままにしておくと、Rainbow Sixのようなゲームを模倣するので、常にカメラでキャラクターを回転させることができます。

モーションコントローラーを使用している場合…
このモーターでウォークランストラフェモーションを使用します。


3人称フォローモーター/3rd Person Follow Motor
3人目は、Tomb RaiderやShadows of MordorなどのAAAアドベンチャーゲームのカメラに似たカメラの動作を追跡します。
カメラは、ロープで固定されているかのように、キャラクター(アンカー)の後ろにドラッグします。
これは、キャラクターがカメラの周りを回転できることを意味します。

Yawは、キャラクターの上軸を中心とした回転です。

Pitch は、カメラの右軸を中心とした回転です。

Speedカメラが軸を中心に回転する速度を決定します。

Range カメラが各軸を周回できる距離の制限を設定します。

ヨーの場合、-180および180を使用すると、制限がなくなります。
ピッチについては、カメラが上下逆さまにならないように常に制限があります。

Invertピッチの反応が異なるように、垂直入力値を反転します。

Smoothing より滑らかな回転を作成するために、軌道に速度ベースのスムージングを提供します。 適切な値は0〜0.3です。

Distanceカメラの焦点からの望ましい距離。


サードパーソン固定モーター/3rd Person Fixed Motor
サードパーソンフォローと同様に、このカメラは、サードパーソンシューティングゲームやホルダーアドベンチャーゲームで見られるようなAAAエクスペリエンスを提供します。
このモーターを使用すると、カメラはキャラクター(アンカー)の後ろに移動します。
まるで金属製のポールに取り付けられているかのようです。
これは、キャラクターが左または右をストラフするときに、カメラが回転する代わりにストラフすることを意味します。

Yawは、キャラクターの上軸を中心とした回転です。

Pitchは、カメラの右軸を中心とした回転です。

Speedカメラが軸を中心に回転する速度を決定します。

Range カメラが各軸を周回できる距離の制限を設定します。
ヨーの場合、-180および180を使用すると、制限がなくなります。
ピッチについては、カメラが上下逆さまにならないように常に制限があります。

Invertピッチの反応が異なるように、垂直入力値を反転します。

Smoothingより滑らかな回転を作成するために、軌道に速度ベースのスムージングを提供します。適切な値は0〜0.3です。

Distanceカメラの焦点からの望ましい距離。

Rotate Anchorヨーに合わせてアンカーを回転させるかどうかを決定します。

Rotate Anchor Alias アンカーの回転が発生するかどうかを決定する入力エイリアス。この方法では、右マウスボタンのようなものが押された場合にのみ回転します。


固定モーター/Fixed Motor
このモーターは、最も単純なモーターの1つです。 カメラの固定位置と回転を提供するだけです。

Position Offset アンカーおよびアンカーオフセットからのオフセット。
Rotation Offset アンカーの回転からのオフセット。


スプラインモーター/Spline Motor
スプラインモーターは、パスをたどるカメラを作成するために使用されます。 有効にすると、カメラは指定された経路に沿って移動し、別のモーターに移行するか、単にループを継続します。

Path パスであるSplineオブジェクトを含むGameObject。

Auto Start モーターが作動するとすぐにカメラがパス上で動き始めるかどうかを決定します。

Speed カメラが移動する1秒あたりの単位。

Look To Anchor 移動するときに常にアンカーに面するようにカメラを回転させるかどうかを決定します。

Look To Path カメラが常に移動方向に向くように回転するかどうかを決定します。

Loop 完了後にカメラがパスを再開するかどうかを決定します。

Activate End Motor パスが完了したときに新しいモーターをアクティブにするかどうかを決定します。

Index Activate End Motorがチェックされているときにアクティブにするモーターのインデックス。


トップダウンビューモーター/Top-Down View Motor
このモーターは、MOBAs、戦略ゲーム、およびディアブロのようなトップダウンアクションゲームに使用されます。 「世界観」を提供し、さまざまな方法でパンできます。

Min Bounds-カメラが移動できる最小の世界境界。

Max Bounds-カメラが移動できる最大の世界境界。

アンカーフォロー/Anchor Following
Follow Anchor-カメラがアンカーにロックするかどうかを決定します。

Action Alias-設定すると、カメラがキャラクター(アンカー)にロックされるかどうかを決定する入力エイリアス。

V. Distance(アンカー)からカメラがとどまる垂直距離。

Use View Direction –-カメラがアンカーに焦点を合わせるためにカメラの角度を使用するか、カメラの位置がアンカーの位置と一致するかを決定します。

Allow Disconnecting-別の形式のパンを使用するときに、アンカーの追跡を無効にするかどうかを決定します。

Grip Panning
グリップパンは、地形をクリックしてドラッグすると発生します。実際には、地形が引っ張られているように見えても、カメラは動いています。

Action Alias–パンが発生するかどうかを決定するために使用される入力エイリアス。通常、これはマウスの左ボタンに関連付けられています。

Speed-グリップをパンするときにカメラが移動する1秒あたりの単位。

Edge Panning
マウスカーソルが画面の端に移動すると、エッジパンが発生します。端に近づくと、カメラはその方向に移動します。

Border –パンを開始するためにマウスが必要とするエッジからのピクセル数。

Speed –エッジパン時にカメラが移動する1秒あたりの単位。
Input Panning
これは、特定のキーが押されたときに発生します。 通常、これはWASDまたは矢印キーです。

Forward, Back, Left, Right Alias -方向のパンが発生するかどうかを決定する入力エイリアス。

Speed-入力パンニング時にカメラが移動する1秒あたりの単位。


トランジションモーター/Transition Motor
移行モーターは、あるモーターから別のモーターにカメラをスムーズに移動するために使用されます。
これは、プレイヤーがキャラクターを制御したり、ゲームの途中でカメラスタイルを変更したりすることで終わるカットシーンを持つのに最適です。

このモーターは、最初の2、3のプロパティが与えられると、自己作動する唯一のモーターです。

Action Alias –アクティブ化をトリガーする入力エイリアス。

Input Type–キーダウンまたはキーアップでアクティベーションを行うかどうかを決定します。

Only In Start –「Start」モーターがアクティブなモーターである場合にのみ、起動のモーターテストを行うかどうかを決定します。

Start Index–移行用の「開始」モーターのインデックス。
End Index –遷移の「終了」モーターのインデックス。
Transition Time-移行にかかる秒数。
他のすべてのモーターと同様に、一度に複数の移行モーターをセットアップできます。 これにより、さまざまなカメラのセットアップがあり、異なる時間にそれらに移行できます。


スプライン/Splines

スプラインは、点と接線を使用して作成される単なるパスです。
Bezier SplineコンポーネントをGameObjectに追加することにより、パスを作成できます。
上の図では、3つのポイントがあります(2つしか表示されていない場合でも)。
これは、スプラインが「ループ」に設定されているためです。
したがって、最初のポイントと最後のポイントは同じ位置を共有します。

ポイントをクリックして選択し、必要に応じて移動できます。

ポイントを選択した状態で、「Insert Point」を押して、選択したものの前のポイント。

接線をクリックして移動すると、パスの形状を変更できます。

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関数を呼び出して、実際にアクターを移動します。
Animator Driver – Assets / ootii / ActorController / Code / Actors / CharacterControllers / Drivers Actor Driver
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つの形状があります。
ボディカプセル–このカプセルは、従来のキャラクターコントローラーに似ていますが、地面から持ち上げられます。これにより、アクターはステップの端まで到達できます。これは、足IKに最適です。

Foot Sphere-この球体は空中でのみアクティブです。これにより、オブジェクトを飛び越えるときに足が物に入らないようにします。ただし、棚やステップの近くに移動しても、ブロックされることはありません。

体の形はコライダーではないことに注意することが重要です。そのため、外部のレイキャストや剛体はそれらに反応しません。外部のレイキャストをキャラクターに当てたい場合は、通常の方法で従来のUnityコライダーをアクターに追加するか、「Unityコライダーを使用」チェックボックスをオンにします。

コライダーの代わりにボディシェイプを使用する理由は、通常のUnityカプセルコライダーはあまり柔軟性がないためです。任意に回転したり、異なる変換に結び付けることはできません。つまり、キャラクターがアニメーション化しても、その形状は自動的に変化しません。
例えばUnityカプセルコライダーが、頭部の変形に合わせて自動的にサイズ変更できないことに注意してください。
また、基本的な方向に固執しています。
ただし、ボディシェイプカプセルは、関連付けられている変換に合わせてサイズ変更および回転します。したがって、キャラクターの形状は自動的に変更されます。
Unity Colliders
Unityカプセルコライダーの制限を補うために、各ボディシェイプには、ボディシェイプを使用してUnityコライダーを作成および管理するオプションがあります。
[Use Unity Colliders]チェックボックスをオンにするだけで、実行時にコライダーがボディの形状に合わせて作成されます。
球は簡単です。 ただし、Unityカプセルコライダーは実際には使用できないため、代わりに球体が使用されます。
少し混乱していますが、複数の球体を使用して、カプセルの位置、サイズ、回転を近似する方法に注目してください。
キャラクターの頭が動くと、球体が動きカプセルの形状を保ちます。
Rigidbodyコンポーネントをキャラクターに追加しても問題ありません。 ただし、剛体はキャラクターを制御しようとします。 つまり、剛体とACが競合していることを意味します。 これを修正するには、リジッドボディの重力を無効にし、「Is Kinematic」チェックボックスをオンにします。 これにより、リジッドボディがキャラクターを制御しようとするのを防ぎます。
Collisions vs. Grounding/衝突対接地
「衝突」と「地面」は異なるものです。
衝突とは、衝突検出により、壁などの別の物体にぶつかったと判断されたことを意味します。
接地とは、アクターの直下で地面をテストし、その上に立つことができることを意味します。
そのため、衝突を完全に無効にすることができ、キャラクターは引き続き地面を歩いたり、斜面を上ったりできます。衝突を無効にすると、パフォーマンスが大幅に向上します。 これは、レール上にあるか、動きが制限されているNPCに最適です。
コライダー/Colliders
アクターコントローラーは、標準のユニティコライダーと衝突することができます。 最速のコライダーは、球、箱、および飛行機です。 ただし、メッシュコライダーに対する衝突も検出できます。
ただし、UnityのCharacter Controllerと同様に、メッシュコライダーと衝突するとパフォーマンスに影響があります。

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

これを行うには、Moos Colliderオブジェクトを持つゲームオブジェクトにootii Mesh Partitionerコンポーネントを追加します。 次に、「開始時に解析」をチェックします。

残りのオプションはすべて、エディターでパーティションを視覚化するためのものであり、有効にしないでください。
アクターコントローラーの詳細設定
Grounding
Is Gravity Enable
重力を使用するかどうかを決定します。

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
Is Collision Enabled
衝突をテストするかどうかを決定します。

Stop Rotations
衝突によってキャラクターの回転が停止するかどうかを決定します。

Allow Pushbacks 
外部コライダーがアクターを移動させることを決定します。

アクターはただアイドル状態にあるが、コライダーがキャラクターに動いていると仮定します。このオブジェクトを使用すると、コライダーがキャラクターを押し戻して、キャラクターが貫通しないようにすることができます。
ただし、Unityキャラクターコントローラーのように、コライダーはキャラクターを別のコライダーにプッシュできます。そのため、これには注意が必要です。

このオプションを使用すると、パフォーマンスが低下します。控えめに使用してください。

Overlap Center
衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これがその範囲の中心です。

Overlap Radius
衝突検出を実行する場合、まずキャラクターの範囲内にオブジェクトがあるかどうかを確認します。これは、使用する半径です。

エディターでは、衝突テストに使用されるオーバーラップ円を表す明るい灰色の球体が表示されます。 「Overlap」設定を使用して、キャラクターの大部分がカバーされるようにします。
Sliding
Is Sliding Enabled
角度が最小傾斜角よりも大きいスロープでは、アクターがスライドします。

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度になります。
Remove Colliders
小さな斜面からコライダーを取り外します。小さな傾斜がある場合、キャラクターがその上にぶつかることは本当に重要ですか? 2本の足を持つ人間の場合、通常は気付かないでしょう。
これは、地形を扱う場合に特に有効です。

誰かが私に1,000個の岩や小石が地面に散らばっているシーンを見せてもらいましたすべての岩と小石は、丘のコライダーの一部でした。コライダーは複雑で大規模なメッシュでした。
そのため、丘の全体的な傾斜は良好でしたが、小さな小石はそれぞれ急斜面になりすぎ、ACは丘を登ろうとしてたどたどしくなりました。

これは「現実の幻想」についての私のコメントに行きます。
すべての小石をコライダーの一部にすることは現実に近いかもしれませんが、それがあなたのゲームに与えるパフォーマンスの打撃は通常は価値がありません。

Slopes to Steps
コライダーを「スロープ(斜面)」から「ステップ(段差)」に変更します。
ACはステップとスロープを異なる方法で処理します。
ステップの場合、スムーズにポップアップします。したがって、斜面は斜面のように見えますが、コライダーは実際には90度の面を持つ立方体になります。
Slopes to Slopes
急斜面のコライダーをそれほど急ではないものに変更することで逃げることができるかもしれません。
FAQ: 階段と坂道をゆっくりと上昇するとき
ほとんどのキャラクターコントローラーには、「ポップアップ」ステップがあります。
それは機能しますが、キャラクターが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ファイルを確認してください。

これを行うには、ACのSetTargetGroundNormal()関数を使用します。この機能を使用すると、AC設定で「Orient To Ground」がオンになっている場合、俳優の向きを変更させる地面法線を強制できます。

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);
このアプローチを採用する場合は、通常、ジャンプアニメーションでキャラクターが立ち上がらないように設定します。代わりに、彼の足は根元にとどまります。生のアニメーションはそれ自体少し奇妙に見えますが、衝動を追加すると、見栄えが良くなります。
Animation Controlled Jump/アニメーション制御ジャンプ
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;
  }
もちろん、ジャンプの発生時に設定を変更し、ジャンプが完了したら元に戻す必要があります。 考えるべきもう1つのことは、ルートがまだ地面にあるため、オブジェクトにジャンプすることは少し難しいことです。 その理由は、ルートが実際にジャンプしているボックスに入るからです。 例えば:
これらのすべての場合、ジャンプ、ルート位置、およびカプセル形状を補正するのはドライバー次第です。 ダブルジャンプ
ダブルジャンプを実装する場合、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」にはこれらのレイヤーが含まれていないため、衝突しません。

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));
 }
}

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

Archery Motion Packもやってみる。


「Motion Controller v2 」と同じ方が作ったアセットが色々ある。
弓矢で攻撃ができるアセットArchery Motion Packと、
剣と盾のアセット Sword & Shield Motion Pack を併せて購入。

とりあえず今日は弓矢のアセットがどんなものなのかを試してたところ。
導入の手順が結構ややこしくて、手間取ってた。
独自の仕様と付き合わなきゃいけないみたい。

でもまあ、モーションの動きの生々しさと操作性はとても良い。
こういうのは自力では作れない。やっぱり買ってよかったと思う。

こういう基本的なシステムはアセットに頼るだけ頼って、
他の部分に力を入れていけたらなあと思う次第。

スチームチャレンジ3日目

2年前ぐらい前。
Unity内部で簡単にモデリングができるアセット「 ProBuilder 」が無料化した。ちょっとそれをやってみたいと思った。
Unity2019.2.17f1の時点では ProBuilder 2.xになってた。
ヴァージョンは新しいほうがいいだろう。

ステージエディットぐらいなら、これで色々できるみたい。
ダンジョンとかはこれでいこうと思うんだ。

公式の解説ページはこちら
詳しい使い方について紹介してるブログはこちら

早速試してみた。
ちょっといじってみただけだけど、階段とか押し出し機能が良い感じ。
全部は把握してないけど、これだけでも充分素晴らしい。

ダンジョンとか、室内のステージとかは、これでいこうと思う。
まだどんなゲームになるかわからないけど、どんどん形にしていきたい。

管理人

ハンドルネーム:タケハタ
本名:波田野剛望(はたのたけみ)

お絵描きとゲームが好きなオス。
2020年の目標は、スチームでゲームをリリースすること。