アマゾンバナーリンク

ディスプレイ広告

スポンサーリンク

【Unity】3Dでキャラクター操作を簡単にできるEasy Character Movement 2の使い方【Asset】

2021年6月14日

こんにちは!ジェイです。今回は3Dアクションゲームを作ろうと思った時に、キャラの操作やカメラワークを簡単に実装できるアセットEasy Character Movement 2の使い方を紹介します。

Image from Gyazo
目次

記事内広告

特徴

ECM2は強力なキャラクターコントローラーで、高度なカスタマイズ性と使いやすさを備えています。どんな種類のキャラクター(プレイヤーやAIがコントロールするもの)にも使用でき、プラットフォーマー、一人称、三人称、アドベンチャー、ポイント&クリックなど、幅広いゲームに対応しています。

さらに、ECM2には、新しい入力システムのカスタムアクション、PlayerInputコンポーネント、一人称、三人称、ターゲットロック、ツインシック移動、ダッシュ、スライド、ラダー、Cinemachine、Boltなど、30以上のデモが含まれています。

そして、InputSystemを採用しているので、新しい入力方法に対応しています。

準備

ECM2を使用するには、InputSystemのインポートおよび.NET 4ランタイム設定が必要ですので、先に設定しておきましょう。まずは、Edit>Project SettingsのPlayerのApi Compatibility Level*を.NET 4.xにします。

次にwindow>Pacage Managerを選んで、以下の様にInputSystemをインポートしましょう。画像では、インポート済みなので、すでにRemoveになってますが、初回時には、Importボタンがあるのでそれをクリックしましょう。

はじめに

ECM2は、既存のプロジェクトに簡単にインポートできるように開発されました。UnityのNew Inputシステムをフルに活用しているため、プロジェクトにインストールする必要があります。ECM2のインポートプロセス中に入力システムパッケージをインストールすることもできますが、ECM2パッケージをインポートする前に、新しい入力システムをプロジェクトにインストールすることを強くお勧めします。
ECM2のインストールが非常に簡単になります。プロジェクトに新しい入力システムを正常にインストール(有効化)したら、ECM2パッケージをインポートして、ECM2のインストールを行います。
ECM2 パッケージをインポートする際、プロジェクトの設定によっては、次のようなダイアログが表示されることがあります。

「Install/Upgrade」ボタンを押して続行します。

デフォルトのインポートユニティパッケージダイアログが表示されますので、ここでインポートするものを選択してください。
samplesフォルダを完全に無視することもできますが、以下のように分離してインポートすることをお勧めします。
デモや多くのサンプルシーンとは別に、ラピッドプロトタイピングのための4つの異なるテンプレートシーンが含まれています。プロトタイプ作成のための4つのテンプレートシーンが含まれています。

Importボタンを押すとECM2のインストールが完了します。

ECM2がプロジェクトに正常にインポートされたら、必須ではありませんが、以下のことをお勧めします。
ECM2のデフォルトコンタクトオフセットと同期させるために、物理のコンタクトオフセットのデフォルト値を修正して、0.001に設定することをお勧めします。

使い方

ECM2 の作業を始める最も簡単な方法は、付属のテンプレートシーン(ECM2Samples\Templates\)を使用することです。
各シーンは、より早くプロトタイピングができるように設計されており、ゲームのカスタムコードを追加するためのカスタムCharacter派生クラスも含まれています。必要に応じて、コードを追加することができます

First Person Template Scene

本作では、一人称視点のプレイヤーキャラクターが登場します。このキャラクターは、キーボードやコントローラーを使ってレベルを移動することができます。また、プレイヤーは、マウスやコントローラを使って周囲を見渡すことができます。

キャラクターはFirstPersonCharacterクラスを継承しています。

Third Person Template Scene

三人称視点のテンプレートでは、カメラがキャラクターの後ろや少し上に配置されたプレイアブルキャラクターが登場します。カメラはキャラクターの後ろと少し上に位置しています。

マウスやキーボード、コントローラーを使ってキャラクターが動くとマウスやキーボード、コントローラーを使ってキャラクターが動くと、カメラはそのキャラクターを追いかけ、肩越しの視点で観察します。
視点である。主人公を強調する視点であり、アクションゲームやアドベンチャーゲームでよく使われます。

キャラクターはThirdPersonCharacterクラスを継承しています。

Side Scroller Template Scene

この横スクロールのテンプレートは、アニメーションモデルとカメラをキャラクターの横に配置しています。
キャラクターの側方にカメラが配置されています。キャラクターは、キーボードやコントローラで操作することができます。
前進、後進、ジャンプの2つの次元に制限されています。レベルの中にはいくつかの棚があり、キャラクターはその間をジャンプすることができます。

キャラクターは、Characterクラスを継承しています。

Top Down Template Scene

トップダウンのテンプレートシーンでは、プレイアブルキャラクターが登場し、カメラはアバターの背後や上方に大きく配置されます。アバターの後ろや上にカメラが配置され、より遠くから見ることができます。

プレイヤーの操作は、キーボードコントローラー、またはマウスで操作し、必要な場所をクリックして、ナビゲーションシステムを使ってキャラクターを移動させます。この視点は、アクションロールプレイングゲームでよく使われます。

キャラクターはAgentCharacterクラスを継承しています。

さらに ECM2 には、フル機能のデモシーン(ECM2\Samples\Demo)と、25 以上の完全にコメントされたサンプル(ECM2\Samples\Examples\)が含まれています。各サンプルのソースコードは完全にコメントされており、参考になると思います。

Features

  • リジッドボディによる汎用キャラクターの移動。
  • カプセルベースのキャラクターコリジョン。
  • Unity New Input Systemとの完全な統合。
  • Cinemachineの統合例。
  • 高度に設定可能で堅牢な、地面と衝突の検出と応答システム。
  • よく知られているCollide and Slideアルゴリズムに基づいた、高度に設定可能で堅牢な、地面との衝突検出および応答システム。
  • 高い段差(カプセルの半径よりも高い)をキャラクターの高さまで登ることができる。
  • 歩く、落ちる、無制限に高さを変えられるジャンプ、しゃがむ、スプリントなど、さまざまな動作モードと状態。
  • 歩行、落下、無制限可変高さジャンプ、しゃがみ、スプリント、飛行、水泳など、さまざまな動作モードや状態があります。
  • 一人称、三人称、エージェントの「ベース」キャラクター。
  • 様々なテンプレートシーン(一人称、三人称、横スクロール、トップダウン)による高速起動。起動が速くなります。
  • カスタム入力アクション、Cinemachineの統合、一人称、三人称、キャラクターイベント、バウンドを含む25以上のサンプル。
  • カスタム入力アクション、シネママシンの統合、一人称、三人称、キャラクターイベント、バウンサー、フライ、スイム、ダッシュ、スライド、ラダーなど、25以上の例があります。
  • 拡張性を考慮して開発されているので、そのまま使用することも、"ベース “となるキャラクターを拡張したりそのまま使ったり、ベースとなるキャラクターを拡張したり、他のスクリプトやビジュアルスクリプトなどのコントローラーを使って簡単に操作することができます。
  • また、他のスクリプトやビジュアルスクリプト(Boltなど)を使ってコントロールすることもできます。
  • 物理ボリューム:水や落下ゾーンなどを簡単に扱うことができ、プロパティの設定も可能です。
  • プロパティを設定できます。
  • 水の浮力を含む、完全に設定可能な摩擦ベースの動き
  • ルートモーションのサポート
  • 親指を使わないプラットフォームの移動。
  • 重力や上昇方向のカスタマイズ(例:マリオギャラクシーのように)。
  • キャラクターが外力、プラットフォームの速度、プラットフォームの移動、回転の影響を受けるか受けないかを完全にコントロール。
  • 外力、プラットフォームの速度、プラットフォームの移動や回転、他の剛体やキャラクターを押すことによるキャラクターの影響の有無を完全にコントロールできます。
  • キャラクターの影響を完全にコントロールできます。
  • 8●キャラクターのイベント(GroundHit、MovementHit、Landed、WillLand、Jumped,ReachedJumpApexなどのキャラクターイベントがあります。
  • 広範囲で設定可能なコリジョンフィルタリング。
  • 既存のプロジェクトに簡単に組み込むことができます。
  • 完全にコメントされたC#ソースコード。明確で読みやすく、修正も容易です。
  • モバイルフレンドリー
  • ガベージコレクタ対応

Package Contents

Docs

Input Actions

キャラクター、一人称、三人称、エージェントのECM2デフォルト入力アクションが含まれています。

Physic Materials

ECM2キャラクターの摩擦のない素材が含まれており、衝突した際に滑るために必要な素材です。

Samples

Demo

ECM2のフル機能を備えたデモシーンと関連アセットを収録

Examples

ここでは、30以上の完全にコメントされた例を見ることができます。

Prefabs

すぐに使えるキャラクターのプレハブが揃っています。

Shared Assets

デモ、サンプル、テンプレート、プレハブで使用されるすべてのアセットを含みます。

Templates

ここには、高速起動のためのさまざまなテンプレートシーンが含まれています。

Source

ECM2の全ソースコードを収録。

Introduction

Easy Character Movement 2は、人型のキャラクターのための一般的な動作モードを備えた動作システムを提供するコンポーネントのセットです。
ヒューマノイドキャラクターの一般的な動作モード(ただし、これに限定されるものではありません)として
歩く」「落ちる」「泳ぐ」「飛ぶ」などがあります。


ECM2の主な目的は、3Dまたは2D(実際には2.5Dですが)でゲームキャラクターを簡単に動かせるようにすることです。
2D(実際には2.5Dですが、3Dベースです)の世界でゲームキャラクターを簡単に動かせるようにし、その上にゲームメカニクスを構築できるようにすることです。

ECM2(略してECM2)は、素晴らしいユーザーからのフィードバックに応えて開発されたもので、非常に優れたECMに最新の機能を追加しています。
ECM2 は、「Collide and slide」と呼ばれる、よく知られた(しかし、それほど簡単には実装できない)衝突検出および応答アルゴリズムに基づいています。
文字制御のための堅牢でよく知られた動作を提供します。このアルゴリズムは古くから存在しており(例えば、初代Quakeで採用されました。
Quakeなどで使われています、現在でも多くの最新ゲームでキャラクターの動きの一部として使われています。
ECM2はECMと同じ手法で開発しましたが、この新しいアルゴリズムのためにいくつかのマイナーな変更が必要でしたが、最終的にはより柔軟で堅牢な、使いやすい汎用のキャラクター・ムーブメント・システムを提供します。

Description

Easy Character Movement 2では、一人のクラスが一つのタスクを担当するのが理想とされる、単一責任主義を採用しています。理想的には、1つのタスクに対して責任を負うべきであると考えています。したがって、Easy Character Movement 2のシステムは、特定のタスクを持ついくつかのクラスで構成されていますが、その中でも最も重要な2つのクラスがあります。それは、CharacterMovementコンポーネントとCharacterクラスです。


CharacterMovementコンポーネントは、地面の検出(e.g.m.)など、幾何学的に関連するすべてのタスクを実行する責任があります。
地面の検出(例:「地面」を歩けるか歩けないかに分類する)、衝突の検出と応答、プラットフォームの処理など、幾何学に関連するすべてのタスクを実行します。


衝突の検出と対応、プラットフォームの移動の処理、キャラクターを新しい位置に物理的に移動させるなど、幾何学的な関連タスクを実行する役割を担っています。


キャラクターを新しい位置に物理的に移動させます。キャラクタークラスは、プレイヤーやAIが操作できるすべてのアバターのベースとなるクラスです。キャラクターとは、ワールド内におけるプレイヤーやAIの物理的な表現です。これは
これは、キャラクタが、プレイヤーやAIの見た目を決定するだけでなく、衝突やその他の物理的な相互作用の観点から、ワールドとどのように相互作用するかを決定することを意味します。

Character Components

キャラクターは以下の要素で構成されています。

  • トランスフォーム
  • リジッドボディ
  • CapsuleCollider(カプセルコライダー)
  • CharacterMovement コンポーネント
  • キャラクタークラス
  • RootMotionController。これはオプションで、ルートモーションを利用したい場合にのみ必要です。
  • これはオプションで、ルートモーションを使用したい場合にのみ必要です。

キャラクターは、前作の Easy Character Movement の BaseCharacterController に似ています。しかし、ECM2ではキャラクターとコントローラを明確に分離しました。ECM2では、キャラクターとコントローラが明確に分離されました。
キャラクターをそのまま使うことができるようになりました。

これは、入力バインディングを簡単に変更できるUnityの新しい入力システムのおかげであり、また、キャラクターを完全にコントロールすることを容易にする新しいデザインのおかげでもあります。
StopJumping、Crouching、StopCrouchingなどのコマンドを入力します。
コントローラーは(ECM2では具体的な表現はありませんが)、キャラクターと人間のプレイヤー(以下、プレイヤー)との間のインターフェースです。

スクリプトやBoltのようなビジュアルスクリプティングシステムの形であっても構いません。
コントローラーを設定する際に考慮すべきことは、どのような機能をコントローラーに持たせるか、そして何をコントローラーに持たせるかということです。
コントローラーにはどのような機能を持たせ、キャラクターの派生クラスには何を持たせるかということです。すべての入力をキャラクタで処理することは可能です。


特に複雑ではないケースでは、すべての入力をCharacterで処理することも可能です。しかし、もしあなたが
しかし、1つのゲームクライアントに複数のプレイヤーがいる場合や、ランタイムに動的にキャラクターを変更できる場合など、より複雑なニーズがある場合は、コントローラで入力を処理した方が良いかもしれません。
この場合、コントローラーが何をすべきかを決定し、キャラクターにコマンドを発行します。
キャラクターに命令を出すことになります。


また、場合によっては、入力処理やその他の機能をControllerに持たせる必要があります。
コントローラーはゲーム中ずっと存在しますが、キャラクターは一過性のものになります。
例えば、デスマッチのようなゲームでは、一度死んでも再起不能になることがあります。


コントローラーはそのままで、キャラクターは新しくなります。この例では、もしこの例では、キャラクターのスコアを保持していれば、スコアはリセットされますが、コントローラのスコアを保持していれば今回の例では、キャラクターにスコアを残しておくとスコアがリセットされますが、コントローラーにスコアを残しておくとリセットされません。

どのような仕組みになっているか

FixedUpdateのたびに、キャラクターはMoveメソッドを呼び出します。
このメソッドは、最後のフレームで蓄積されたすべての保留中の力とインパルスを処理し、CharacterMovement
13Move関数を呼び出して、キャラクターを新しい位置に物理的に移動させます(ジオメトリック関連のすべてのタスクを担当します)。


CharacterMovementのMoveメソッドは、地面の検出を行います(例:「地面」を歩行可能かどうかに分類する)。
地面」を歩けるか歩けないかに分類するなど)した後、OnMoveデリゲートを呼び出して、キャラクターは、現在の移動モードでどのように移動すべきかを決定します。
歩く、落ちる、泳ぐ、など)を決定します。
各移動モードには、速度を計算するための関数があります。


例えば、Walkingは地面を移動するときのキャラクターの物理的な動きを決定し、Fallingは空中での動きを決定します。
FixedUpdate中に移動モードが変更された場合、例えばキャラクターが落下や着地を始めた場合などは、落下や着地など、FixedUpdate中に動作モードが変わった場合、動作モード関数はSetMovementMode関数を呼び出して、キャラクターの動きを新しい動作モードで継続させます。


新しい速度が計算されると、CharacterMovementコンポーネントは、この速度を使って「先を見越して」衝突を抑制した動きを行い、キャラクターの新しい位置を決定して、キャラクターの新しい位置を決定し、所有するキャラクターに最終的な動きを適用します。

キャラクターを作成するには

1.ヒエラルキーウィンドウ上で右クリックし、作成ダイアログを開きます。

2.作成したいキャラクターの種類を選択します。

3.名前の空のキャラクター(ビジュアル表現なし)が作成されます。ECM2_Character, ECM2_AgentCharacter, ECM2_FirstPersonCharacterという名前の空のキャラクターが作成されます。このキャラクターの原点が 0,0,0 であることを確認してください。
そうすることで、キャラクターの視覚的表現(モデルなど)を親にする際のトラブルを避けることができます。

4.この新規作成したゲームオブジェクトに、キャラクターモデル(キャラクターの視覚的表現)をペアレントします。ゲームオブジェクトです。

5.CharacterMovementコンポーネントで、Capsule RadiusとCapsule Heightの値を調整します。
「カプセルの高さ」の値(これにより、キャラクタのカプセルコライダが自動的に設定されます)を調整して、キャラクタのモデルに合うようにします。

6.これで設定は完了です。キャラクターのプロパティは、ゲームのニーズに合わせて自由に調整してください。

Base Characters

Character class

キャラクターは、フル機能を備えたカスタマイズ可能なクラスであり、すべてのゲームのアバターのベースとなります(プレイヤーまたはAIが制御する)。ECM2には、ファーストパーソン、サードパーソン、トップダウンなど、さまざまなゲームジャンルに合わせてカスタマイズされた、いくつかのカスタムキャラクター由来のECM2 には、ファーストパーソン、サードパーソン、トップダウンなど、さまざまなゲームジャンルに合わせてカスタマイズされた、カスタムのキャラクター派生クラスがいくつかあります。
(例:NavMeshAgent)などがあります。これらの「ベース」キャラクターを親クラスとして使用することができます。
(例:派生キャラクタークラスの作成)や、コントローラで使用することができます。

Actions

このキャラクターに関連したアクションアセットを入力します。これは、主にプレイヤーが操作するキャラクターに割り当てられます。割り当てられていない場合、Characterクラスは入力を処理しません。これによりキャラクターを外部から制御することができます。

Rotation Rate

1秒あたりの回転数の変化(degree per second)。0に設定すると、瞬間的な回転を行います。
回転を行います。これは、2D / 2.5Dゲームで横から横へのロック回転を行う場合に特に有効です。


回転モード
キャラクターの現在の回転モードを設定します。

  • None(なし)。None:キャラクターの回転を無効にします。
  • OrientToMovement:入力された移動方向ベクトルに向かってキャラクターを回転させます(回転の変化率は rotationRate)。
  • OrientToCameraViewDirection: rotationRate を回転の変化率として、カメラの現在のビュー方向に向かってキャラクターを回転させます。
  • OrientWithRootMotion: キャラクターの回転にルートモーションの回転を加えます

Max Walk Speed

歩行時の最大対地速度。また、落下時の最大横方向の速度を決める落下時の最大横速度も決定します。

Min Analog Walk Speed

アナログスティックの傾きを最小にして歩いたときに加速すべき対地速度です。
を傾けることができます。

Max Acceleration

最大加速度(速度の変化率)

Braking Deceleration Walking

歩行時の減速で、入力加速度をかけない。これは、一定の反対方向の力で
速度を一定の値だけ直接下げる力です。

Ground Friction

動きのコントロールに影響を与える設定。値が高いほど方向転換が速くなります。もしuseSeparateBrakingFrictionがfalseの場合、ブレーキをかけたとき(入力加速度が0のとき)に、より早く止まれるかどうかにも影響します。

Sprint Speed Multiplier

スプリント時の最大歩行速度の倍率です。

Sprint Acceleration Multiplier

スプリント時の最大加速倍率です。

Max Walk Speed Crouched

歩行時としゃがみ時の最大接地速度。

Crouched Height

キャラクターがしゃがんでいるときのカプセルの高さです。

Crouched Jump

trueの場合、しゃがんだ状態でのジャンプが可能になります(uncrouch character)

Max Fall Speed

キャラクターが落下する際に到達できる最大の垂直速度。例:終端速度。
注:キャラクタがPhysicsVolume内にある場合、この値はPhysicsVolumeのmaxFallSpeedプロパティ値に置き換えられます。

Braking Deceleration Falling

落下時に入力加速度を加えない場合の横方向の減速度。

CharacterMovement component

Falling Lateral Friction

落下時の横方向の動きに適用する摩擦。useSeparateBrakingFrictionがfalseの場合は、ブレーキをかけたとき(入力加速度がゼロのとき)に素早く止まる能力にも影響します。

Air Control

下降時に、キャラクターが利用できる横方向の移動制御量を設定します。0 = コントロールなし、1 = 最大加速度でフルコントロールする。

Jump Max Count

キャラクターが実行できる最大のジャンプ回数です。

Jump Impulse

ジャンプ時の初速(瞬間的な垂直方向の速度)

Jump Max Hold Time

ジャンプを保持する最大時間(秒)です。例:高さの可変ジャンプ。

Jump Pre-Grounded Time

地面にぶつかる前にどれだけ早くジャンプを誘発できるか(単位:秒)

Jump Post-Grounded Time

地面から離れてからどのくらいの時間でジャンプを起こせるか(単位:秒)。ときどき「コヨーテ・タイム」と呼ばれることもあります。

Gravity

このキャラクターに適用される重力。

Can Swim

Trueの場合、キャラクターは泳いだり、流体の体積の中を移動することができます。

Max Sim Speed

最大水泳速度。

Braking Deceleration Swimming

泳いでいるときに、入力加速度をかけないで減速すること。

Swimming Friction

泳ぐ時の動きにかける摩擦。

Buoyancy

水の浮力比。1=中性浮力、0=浮力なし。1より大きくすることも可能です。

Max Fly Speed

最大の飛行速度。

Braking Deceleration Flying

飛んでいるときに加速度をつけないで減速する

Flying Friction

飛んでいるときの動きにかける摩擦。

Mass

このキャラクターの質量を設定します。Rigidbodyの質量と同じです。

Impart External Velocity

trueの場合、内部物理の更新時に外力による速度を付与します。

Impart Platform Velocity

trueの場合、ジャンプや落下の際に、プラットフォームの速度を付与します。

Impart Platform Movement

キャラクターが立っている移動台に合わせて動くかどうか。

Impart Platform Rotation

キャラクターが立っているプラットフォームの回転の変化を受け取るかどうか。

Apply Push Force

リジッドボディに歩いて入るときに、プッシュフォースを適用すべきですか?

Push Force Affect Characters

キャラクターに突っ込むときは、押し付ける力が必要?

Apply Standing Downward Force

立っている剛体に下向きの力をかけるべきか?

Push Force Scale

リジッドボディに歩いて入るときにかかる力(質量と相対速度による)はこの量でスケールされます。

Standing Downward Force Scale

私たちが立っている剛体にかかる力(質量と重力による)は、この量でスケールされます。

Use Root Motion

キャラクターの動きはアニメーションで決めるべき?

Camera

プレイヤーのカメラへの参照。割り当てられている場合、キャラクターの動きはこのカメラを基準にします。
割り当てられていれば、キャラクターの動きはこのカメラを基準にして行われ、割り当てられていなければ、動きはワールド軸を基準にして行われます。アクションと同様、これは主にプレイヤーが操作するキャラクターのためのものです。

ThirdPersonCharacter class

ThirdPersonCharacterは、Characterの派生クラスをカスタマイズしたもので、カメラがキャラクターの後ろや少し上に位置するようなゲームに適しています。
カメラがキャラクターの後ろや少し上に位置するゲーム用にカスタマイズされています。マウスやキーボード、コントローラを使ってキャラクターが動くと、カメラはキャラクターを追いかけ、肩越しの視点になります。主人公を強調する視点であり、アクションゲームやアドベンチャーゲームなどで人気があります。ThirdPersonCameraControllerクラスを使用しています。

Follow

カメラが移動したいオブジェクト(例:ターゲット)

Follow Distance

「Follow」ターゲットの後ろのデフォルトの距離です。

Follow Min Distance

「Follow」ターゲットまでの最短距離です。

Follow Max Distance

「Follow」ターゲットまでの最大距離です。

Look Rate

周りを見渡したときの1秒あたりの回転数の変化(deg / sec)。

Zoom Rate

1秒あたりの追従距離の変化

Lock Cursor

カーソルをロックすべきか?

Invert Look

縦軸を反転させるかどうかを指定します。

Mouse Horizontal Sensitivity

マウス入力時の水平方向の感度で、値が大きいほど動きが速くなります。

Mouse Vertical Sensitivity

マウス入力時の垂直方向の感度で、値が大きいほど動きが速くなります。

Controller Horizontal Sensitivity

コントローラー使用時の水平方向の感度で、値が大きいほど動きが速くなります。

Controller Vertical Sensitivity

コントローラー使用時の垂直方向の感度で、値が大きいほど動きが速くなります。

Clamp Pitch Rotation

クランプはピッチ回転が必要ですか?例:上/下)

Min Pitch Angle

クランプピッチ回転が有効な場合、最小ピッチ角(度)を決定してください。

Max Pitch Angle

クランプピッチ回転が有効な場合、最大ピッチ角(度)を決定してください。

Camera Collision Filter

カメラはこれらのレイヤー上の障害物を避けます。

Camera Radius

カメラが障害物にどれだけ近づけるかを指定します。

Ignored Colliders

障害物として無視されるコライダーのリスト

AgentCharacter class

AgentCharacterは、カスタマイズされたCharacter派生クラスで、ナビゲーションとパスファインディング機能を追加します。パスファインディング機能(NavMesh、NavMeshAgent)を追加したカスタマイズされたCharacter派生クラスです。これにより、ナビゲーションメッシュ(プレイヤーやAI)を使って、ゲームワールド内をインテリジェントに移動できるキャラクターを作成できます。以下のプロパティでCharacterクラスを拡張します。

Auto Braking

エージェントは、目的地までのオーバーシュートを避けるために、自動的にブレーキをかけるべきでしょうか?もしそうならエージェントは目的地に近づくと自動的にブレーキをかけます。

Braking Distance

目標位置からブレーキングを開始するまでの距離

Stopping Distance

目標位置からこの距離内で停止

FirstPersonCharacter class

FirstPersonCharacterは、カスタマイズされたCharacter派生クラスで、一人称視点で見たプレイヤーキャラクターを特徴としています。一人称視点で見たプレイヤーキャラクターが特徴です。このキャラクターは、キーボードやコントローラを使用してレベル内を移動することができます。また、プレイヤーはマウスやコントローラを使って周囲をマウスやコントローラを使って、周囲を見渡すことができます。これには、キャラクターとカメラの回転を処理するために、あらかじめ定義された階層、つまりピボットのセットが必要です。この階層は、Cinemachineカメラに見られるものと似ており、非常に柔軟で滑らかな回転を可能にします。

First Person Character Hierarchy

Root

これは、その名の通り、一人称キャラクターのルートピボットとして機能します。Yaw-Rotation(キャラクターの回転は常に変化しません)、これはよりスムーズな回転を実現するために必要です。

Eye

これはカメラの親であり、キャラクターに対するカメラの位置を定義します。これが扱うのはPitch-Rotationを処理します。

Camera

物理的なカメラ 例:世界をキャプチャしてプレイヤーに表示するデバイス。FirstPersonCharacterはCharacterクラスを継承しており、以下のプロパティを持っています。

Root Pivot

FirstPersonCharacterヒエラルキーのRoot pivot GameObjectです。Yaw-Rotationはこれに適用されます。

Eye Pivot

FirstPersonCharacterヒエラルキーのEye pivot GameObjectです。ピッチローテーションは適用されます。

Eye Height

デフォルトのEyeの高さ(例:Walking)。目のピボットの高さを変更します。

Eye Height Crouched

キャラクターがしゃがんでいるときの目の高さ。目のピボットの高さを変更します。

Forward Speed Multiplier

キャラクターが前方に歩いている間のスピードの倍率

Backward Speed Multiplier

キャラクターが後ろ向きに歩いている間のスピードの倍率

Strafe Speed Multiplier

キャラクターが横に歩いている間のスピード倍率

FirstPersonCharacterでは、CharacterLookコンポーネントを使用しています。これはデータのみのコンポーネントで、「見た目」の動作を設定します。

Lock Cursor

マウスカーソルをロックするかどうかを決定します。

Inver Look

縦軸を反転させるかどうかを決定します。

Mouse Horizontal Sensitivity

マウス入力時の水平方向の感度で、値が大きいほど動きが速くなります。

Mouse Vertical Sensitivity

マウス入力時の垂直方向の感度で、値が大きいほど動きが速くなります。

Controller Horizontal Sensitivity

コントローラー使用時の水平方向の感度で、値が大きいほど動きが速くなります。

Controller Vertical Sensitivity

コントローラー使用時の垂直方向の感度で、値が大きいほど動きが速くなる

Clamp Pitch Rotation

ピッチの回転がminPitchAngleとmaxPitchAngleの間でクランプされるかどうかを決定します。
maxPitchAngleの間で固定するかどうかを決定します。

Min Pitch Angle

クランプピッチ回転が有効な場合、最小ピッチ角(度)を決定してください。

Max Pitch Angle

クランプピッチ回転が有効な場合、最大ピッチ角(度)を決定してください。

CharacterMovement component

CharacterMovementコンポーネントは、地面の検出(例:「地面」を「歩ける」「歩けない」に分類する)など、衝突の検出と応答、プラットフォームの移動と回転の処理など、幾何学に関連するすべてのタスクを実行します。
衝突の検出と対応、プラットフォームの移動と回転の処理、そしてキャラクターを新しい位置に物理的にキャラクターを新しい位置に物理的に移動させます。


以前のECMバージョンでは、CharacterMovementコンポーネントは、キャラクターの速度の計算と更新を担当していましたが、これがECM2では、この処理がCharacterクラスに移されました。
この変更により、キャラクター(およびその派生カスタムクラス)がどのように移動するかを決めることができるようになりました。例えば、ECM2 には、堅牢で設定可能な摩擦モデルが含まれています。


設定可能な摩擦モデルが含まれており、キャラクターの物理的な特性(例:Accord)に基づいてキャラクターの新しい速度を計算します。例えば、ECM2 には、キャラクターの物理的特性(加速、減速、摩擦、浮力など)に基づいてキャラクターの新しい速度を計算する、堅牢で完全に設定可能な摩擦モデルが含まれています。2Dゲームのロックマンのように瞬間的に速度を変化させたい場合や、全く新しい摩擦モデルなどもあります。あとは、以下の作業を行うだけです。
キャラクターのCalcVelocityメソッドを新しいモデルでオーバーライド(拡張)します。


このメソッドでは、以下のフィールドが編集可能です。

Constrain To Plane

ロックされた軸に沿った動きができないように、キャラクターを拘束します。これは特に2Dゲームを開発する際には、キャラクターのZ軸方向の動きを止めることができます。

Capsule Radius

キャラクターのカプセルコライダの半径です。これは、自動的にCapsuleColliderを自動的に設定します。

Capsule Height

キャラクターのカプセルコライダの高さです。これは、自動的にCapsuleColliderを自動的に設定します。

Slope Limit

歩行可能な斜面の最大角度(度数)

Step Offset

有効なステップの最大の高さ(メートル単位)(キャラクターの身長まで)

Perch Offset

キャラクターの位置からエッジまでの水平距離がこれよりも近い場合、キャラクターが表面のエッジに止まることができます。キャラクターは、下の歩行可能な面から下の歩行可能な面から stepOffset 以内であれば、キャラクターは落ちません。

Unperch Offset

キャラクターの位置から端までの水平距離がこれより大きい場合、キャラクターが表面の端から外れることを許可します。キャラクターは、下の歩行可能な面から下の歩行可能な面から stepOffset 以内であれば、キャラクターは落ちません。

Perch Additional Height

棚の上に止まる場合、歩行可能な床からどれくらいの高さに止まれるかを判断する際に、stepOffsetにこの追加の距離を加えます。なお、ステップアップの開始時にはstepOffsetが適用されます。

これにより、キャラクターが縁にぶら下がったり、地面から少し高い位置に立つことができるようになり、縁にぶら下がったり、地面から少し高い位置に踏み出すことができるようになります。

Collide With Triggers

キャラクターがトリガーに衝突するかどうかを判断します。

Ground Mask

歩行可能な地面とみなすレイヤーを決定します。

Ground Probing Distance

グランドディテクションを行う際のキャストの最大長を決定します。目安としては、キャラクターのコライダ半径以上に設定してください。

Ground Detection

CharacterMovementコンポーネントは、地面の検出を行う役割を担っています。
キャラクターのカプセルコライダーの下にある「地面」を「解析」して、そのキャラクターが歩ける地面に立っているか
歩行可能な地面なのか、歩行不可能な地面なのかを判断します。その後、キャラクターはこの情報を使って、それに応じて速度を更新します。
地面の検出は、カプセルがキャラクターの下方向に沿って以下の距離までカプセルをキャストし、ヒットしなければ、それ以上のテストは必要ないので、この関数は終了します。
一方、ヒットした場合には、衝突した「地面」が歩行可能かどうかを判断するための追加のテストを行います。
衝突した「地面」が歩けるか歩けないかを判断するための追加テストを行います。
その結果はCharacterMovementのgroundHit および lastGroundHit(最後のフレームのグランドヒットの結果)プロパティで見れます。

Walkable and Non-Walkable Ground

CharacterMovementの各パラメータは、キャラクターの下にある地面が歩行可能かどうかを解釈する方法に影響します。
キャラクターの下の地面が歩けるか歩けないかの解釈に影響します。地面の検出段階で最初にテストされるパラメータは、slopeLimitで、キャラクタが歩ける最大の傾斜を示します。

例えば、キャラクターの上方向のベクトルとヒットした法線の角度がslopeLimitよりも小さい場合です。しかし、これだけでは、これだけでは、面の角やエッジにぶつかったときに正確な判断を下すのに十分な情報ではありません。

この限界を克服するために、最初のカプセル・スイープの後に、さらに2回の短いレイキャストを行い、キャラクターが棚の上に立っているかどうかを判断します。

ledgeとは

  • エッジの片側に地面がない場合。
  • エッジの片側が歩けない地面の場合(例:キャラクターのアップベクトルとの角度がslopeLimitより大きい場合ベクトルの角度が slopeLimit よりも大きいなど)
  • 辺の片側が歩行可能な地面であるが、stepOffset+perchAdditionalHeightより遠い場合に perchAdditionalHeight を加えた値になります。

棚が検出されると、その棚に関連する(perchOffset,unperchOffset、perchAdditionalHeight)パラメータを使って、キャラクターがその棚の上に立てるかどうかを判断します。

キャラクターは棚の上(空いている側)に立つことができます。

  • キャラクターの位置からレッジまでの水平方向の距離がperchOffset.
  • 3キャラクターが棚から歩いて降りる場合(例:水平方向の速度が棚の前方ベクトルと同じ方向を向いている。歩いている場合(例:水平方向の速度がレッジの前方ベクトルと同じ方向を向いている)、レッジまでの水平方向の距離がunperchOffsetよりも小さい場合。
  • キャラクターの下の地面がstepOffsetよりも近い場合はプラスperchAdditionalHeight

ヒットが歩行可能でない場合(例:壁に当たった)、次のような追加テストを行います。
歩行可能な段差(例:高さがキャラクターの半径より小さい)なのか、登れる段差(例:高さがキャラクターの半径より大きい)なのかを判断します。登れる段差(例:高さがキャラクターの半径よりも大きい)かを判断するために追加のテストを行います。

PhysicsVolume component

PhysicsVolumeは、3次元ゾーンを定義し、レベル内のエリアの動作を変更するためのヘルパーコンポーネントです。
物理ボリュームは、物理的な設定がキャラクターに影響を与えるゾーンです。一般的な用途としては、プレイヤーが泳ぐ必要のある水辺の環境を作成するために使用されます。CharacterMovementComponentクラスは、現在のフィールドを使用して、所有しているキャラクターが環境内をどのように移動するかを調整します。
キャラクターが新しいPhysicsVolumeに入ると(例:その中心がPhysicsVolumeの中に入った場合)には、OnPhysicsVolumeChangedメソッドを呼び出し、PhysicsVolumeChangedイベントを発生させます。
ネストされたPhysicsVolumeの動作例は、デモシーンにあります。

Priority

2つのPhysicsVolumeが重なった場合に、どちらのPhysicsVolumeが優先されるかを決定します(値が大きいほど優先)

Friction

CharacterMovementを使用しているCharacterが移動する際に、ボリュームによって適用される摩擦の量を決定します。
この値が高ければ高いほど、ボリューム内を移動するのが難しく感じられます。

Max Fall Speed

CharacterMovementを使用したキャラクターの落下時の終端速度を決定します。

Water Volume

ボリュームに水のような流体が含まれているかどうかを判断します。有効にすると、キャラクターは水泳モードになります(キャラクターが泳ぐことができる場合)

Character Input

ECM2では、Unityの新しい入力システムを活用し、ベースキャラクター(Character、ThirdPersonCharacter)ごとにカスタマイズされた入力アクションアセットが用意されています。


ベースキャラクター(キャラクター、三人称キャラクター、一人称キャラクター、エージェントキャラクター)ごとにカスタマイズされた入力アクションアセットが用意されています。) キャラクターにインプットアクションアセットを割り当てると
、入力を代行してくれます。各「ベース」キャラクターには、対応するインプットアクションアセットが含まれています。

注:キャラクターの入力アクションアセットを拡張するには、同梱の入力アクションアセットを複製して、そのコピーを使ってカスタムの入力アクションを追加することをお勧めします。複製し、そのコピーを使ってカスタムの入力アクションを追加することをお勧めします。こうすることで、ECM2がアップデートされても修正内容が失われることはありません。

Character Input Actions Asset

Characterクラスには、デフォルトのInput Actionを使用するためのコードが含まれており、各InputActionとそれに対応するイベントハンドラの定義が含まれています。

protected InputAction movementInputAction { get; set; }
protected InputAction jumpInputAction { get; set; }
protected InputAction crouchInputAction { get; set; }
protected InputAction sprintInputAction { get; set; }

そして、それに対応する入力イベントハンドラと関数。

protected virtual Vector2 GetMovementInput()
{
if (movementInputAction != null)
return movementInputAction.ReadValue<Vector2>();
return Vector2.zero;
}
protected virtual void OnJump(InputAction.CallbackContext context)
{
if (context.started || context.performed)
Jump();
else if (context.canceled)
StopJumping();
}
protected virtual void OnCrouch(InputAction.CallbackContext context)
{
if (context.started || context.performed)
Crouch();
else if (context.canceled)
StopCrouching();
}
protected virtual void OnSprint(InputAction.CallbackContext context)
{
if (context.started || context.performed)
Sprint();
else if (context.canceled)
StopSprinting();
}

Creating a custom Character

カスタムキャラクターを作成するには、新しいクラス(例:MyCharacter)を作成し、含まれている「ベース」キャラクター(例:Character、ThirdPersonCharacter、ThirdCharacter)を使用する必要があります。
「ベース」キャラクター(例:Character、ThirdPersonCharacter、FirstPersonCharacter、AgentCharacter)を親クラスとして使用します。


FirstPersonCharacter、AgentCharacterなど)を親クラスとして使用し、その機能をすべて継承してその機能をすべて継承し、ゲームの仕組みに合わせて拡張します。例えば、新しいCharacter派生クラスを作成する場合。

public class MyCharacter : Character
{
// Add your game custom code here…
}

新たに作成したMyCharacterクラスを使用するには、キャラクタのGameObject(Unity Editor)のCharacterクラスをMyCharacterクラスに置き換えます。

MyCharacterにカスタムInputActionを追加する

これは、Characterベースのクラスに新しいInputActionを追加するときのガイドラインです。ベースのクラスに新しいInputActionを追加する際の指針を示しています。

  1. キャラクターのデフォルトの入力操作アセット
    ECM2_Character_InputActions)を複製し、名前を “Custom Input Actions “とします。
  2. Custom Input Actions アセットをダブルクリックして、Action Editor を開きます。
  3. “Interact “という名前の新しいInputActionを、Player Controls Actions Mapに追加します。以下のようになります。

新しいInteract InputActionの状態を実際に読むことができるようにするために、入力イベントをリッスンするためのOnInteract入力イベントハンドラを作成します。ECM2には、プレイヤーの入力を設定するための定義済みの
メソッドが用意されています。

MyCharacterクラスに戻り、以下のコードを追加します。

public class MyCharacter : Character
{
// Interact InputAction
private InputAction interactInputAction { get; set; }
// Interact InputAction Handler
private void OnInteract(InputAction.CallbackContext context)
{
if (context.started)
Interact();
35else if (context.canceled)
StopInteracting();
}
// Setup player input actions.
protected override void SetupPlayerInput()
{
// Setup base input actions (eg: Movement, Jump, Sprint, Crouch)
base.SetupPlayerInput();
// Setup Interact input action handlers
interactInputAction = actions.FindAction("Interact");
if (interactInputAction != null)
{
interactInputAction.started += OnInteract;
interactInputAction.canceled += OnInteract;
}
}
}

キャラクターのSetupPlayerInputメソッドを使って、OnInteractの入力イベントのハンドラで入力イベントをリッスンしています。しかし、アクションが何かをするためには、最初に有効にする必要があります。これには、個別にアクションを有効にする方法と、アクションマップを使って一括で有効にする方法があります。ここでは前者を使用します。


ここでは、前者の方法を採用します。キャラクターのOnOnEnableメソッドとOnDisableメソッドを拡張してメソッドを拡張して、Interact Input Actionをそれぞれ有効と無効にします。

OnOnEnable and OnOnDisable

このおかしな名前の理由は、ECM2ではベースクラスで使われている。
ECM2では、ベースクラスで使用されているMonoBehaviour関数を拡張することができないからです(例:OnEnable、OnDisable、Update,FixedUpdateなど)を拡張することができず、代わりにMonobehaviour関数名に従ってオーバーライドする独自の関数セットを定義します。


代わりに、オーバーライドする独自の関数セットを定義します。Monobehaviourの関数名に従い、"On “のプレフィックスを追加します。そのため、MonoBehaviourのOnEnable関数は、私たちにとってのOnOnEnableになります。

// Initialize this class.
protected override void OnOnEnable()
{
// Init Base Class
base.OnOnEnable();
// Enable our custom input actions
interactInputAction?.Enable();
}
36

同じように、OnOnDisable Characterメソッドを使って、入力を無効にします。

// De-Initialize this class.
protected override void OnOnDisable()
{
// De-Init Base Class
base.OnOnDisable();
// Disable our custom input actions
interactInputAction?.Disable();
}

ここでは、Character 派生クラスにカスタム入力を追加するために必要な手順をまとめています。
カスタム入力アクションを追加するための完全にコメントされた動作例は、同梱されているサンプルの一部として見ることができます。

Character Controller

前述したように、キャラクターはコントローラーに「憑依」することができ、ECM2では具体的な表現はありませんが
、コントローラーは、キャラクターと、それを操作する人間のプレイヤー(またはAI)との間のインターフェイスとなります。Bolt のようなビジュアル・スクリプティング・システムです。

ECM2では、いくつかのコントローラの例がありますが、最も基本的な例は、PlayerInputコンポーネントを使った最も基本的な例です。

同梱されているキャラクターコントローラのサンプルシーンを参照してください。(ECM2\Examples\1.-Input\3.-PlayerInput Characterコントローラー)を参考にしてください。

Character Movement Modes

ECM2 のキャラクタークラスでは、Walking、Falling、Flying、Swimming、Custom などの動作モードの概念が導入されています。
歩行、落下、飛行、水泳、カスタムなどです。各動作モードには、事前に定義されたルールとプロパティがあります。
とプロパティがあり、ワールド内でのキャラクターの動きを決定します。


これは、キャラクターの状態(例:ジャンプ、攻撃、死などの論理的な状態)と多少関係があります。
キャラクターの状態(ジャンプ、攻撃、死亡などの論理的な状態)と多少関連がありますが、混同してはいけません。
キャラクターをどのように移動させるかを決めることです。

例えば、「フライング・ムーブメント・モード」は、キャラクターが論理的に飛んでいる状態であることを示唆しています。
しかし、フライング・ムーブメント・モードが行うのは、キャラクターが今どのように動いているかを判断することです。
例えば 重力の影響を無視して空中を移動すると、キャラクターは地面に拘束されずに、重力の影響を無視して空中を移動すると、キャラクターは地面に拘束されず、垂直方向の速度が維持されます。

The Character MovementMode

  • None:キャラクターの動きを無効にします。内部的には、キャラクタのリジッドボディをキネマティックにして、いかなる力の影響も受けないようにします。これは、以前の ECM バージョンのこれは前の ECM バージョンの一時停止に代わるものです。
  • Walking:歩行可能な面を重力の影響を受けずに移動します。摩擦の影響を受けます。キャラクターは地面に拘束され、入力された垂直方向の速度は無視されます。
  • Falling:キャラクターが空中で落下したり、重力の影響を受ける空中や歩行不可能な面からキャラクターが落下する場合です。キャラクターは地面に拘束され、入力された垂直方向の速度は無視されます。
  • Flying:重力の影響を受けずに空中を移動することで、キャラクターは地面に拘束されず、垂直方向の速度が維持されます(例:Fly up or down)。
  • 泳ぐ:流体(水など)の中を、重力と浮力の影響を受けながら、地面に拘束されず、垂直方向の速度が維持された状態で移動すること。例:上へ泳ぐ、下へ泳ぐ。
  • カスタム。ユーザー定義のカスタム動作モード。サブモード。

キャラクターの移動モードは、デフォルトでWalkingになっています。キャラクターの移動モードを変更するには、SetMovementMode関数を使用します。OnMovementModeChanged関数が呼び出され、MovementModeChangedイベントが発生します。

OnMovementModeChangedメソッドは、特定のモードを開始するための特別な処理を行います。例えば、地面の拘束の有効化/無効化、StopJump、ジャンプカウントのリセットなどです。

注目すべきは、WalkingとFallingのモードは、キャラクターの接地状態に反応するため、自動的に管理されることです。
キャラクターの接地状態に応じて自動的に管理されます。キャラクターが地面に拘束されている間、もしキャラクターが
が歩行可能な地面にいる場合は歩行モードが有効になり、地面にいない場合、または歩くことができない地面にいる場合は、Falling(落下)の動作モードになります。

一方、Flying移動モードは、必要に応じて明示的に有効・無効を切り替える必要があります。飛翔状態を解除するには、落下移動モードを使用するのが安全です。自動的にWalkingに移行します。例えば、以下のようになります。

// Enter flying mode
SetMovementMode(MovementMode.Flying);
...
// Exits flying mode
SetMovementMode(MovementMode.Falling);

水泳の動作モードは手動で有効/無効を切り替えることができますが、物理ボリュームを使用すると自動的に管理され、キャラクターが水の物理ボリュームに入ると有効になり、水の物理ボリュームから出ると無効になります。

注意すべき点は、デフォルトではキャラクターが水泳移動モードの間はジャンプできないことです。しかし、ECM2の多くの機能と同様に、ゲームのニーズに合わせて簡単に変更することができます。デモシーンと水泳のサンプルシーンでは、必要に応じて水泳中にジャンプを行う方法をを行う方法を紹介しています。

Moving a Character

キャラクターを動かすには、キャラクターのSetMovementInput関数を使って、ワールド空間の方向ベクトルを入力します。例:キャラクターを動かしたい方向を指定します。

// Poll movement InputAction
var movementInput = GetMovementInput();
// Add movement input relative to world axis
Vector3 movementDirection = Vector3.zero;
movementDirection += Vector3.right * movementInput.x;
movementDirection += Vector3.forward * movementInput.y;
SetMovementDirection(movementDirection);

一方、キャラクター(またはキャラクター派生クラス)にインプットアクションアセットを割り当てると派生クラスに割り当てた場合は、ユーザーの入力を実行して、そのHandleInputメソッドを使用します。Characterクラスを拡張する場合は、このHandleInputメソッドを使用して、独自の入力を行う必要があります。

カメラへの相対移動

デフォルトでは、キャラクタークラスにカメラを割り当てると、キャラクターの動きは、このカメラを基準にして動きます。これは主にプレイヤーが操作するキャラクターのためのものです。

カメラに対するキャラクターの相対的な移動を手動で行うには、インクルードヘルパーの.relativeTo 拡張子を使用すると、ベクターが与えられた変換します。

// Poll movement InputAction
var movementInput = GetMovementInput();
// Add movement input relative to world axis
Vector3 movementDirection = Vector3.zero;
movementDirection += Vector3.right * movementInput.x;
movementDirection += Vector3.forward * movementInput.y;
// Make movementDirection vector relative to camera’s transform
movementDirection = movementDirection.relativeTo(cameraTransform);
SetMovementDirection(movementDirection);

Input Action Commands

キャラクタ(およびその派生クラス)には、SetMovementDirection関数のほかに、あらかじめ定義された入力アクションコマンドがあります。
キャラクター(およびその派生クラス)には、あらかじめ定義された入力アクションコマンドのセットが含まれています。
例えば、Jump、StopJumping、Crouch、StopCrouchingなどのアクションを実行します。

通常、これらのコマンドは、「下」や「上」などの入力イベントに応じて使用されます。

  • ジャンプを開始します。
  • StopJumping(ストップジャンプ): キャラクターのジャンプを停止します。
  • Sprint(スプリント): キャラクターにスプリントの開始を要求します。
  • StopSprinting : キャラクターのスプリント動作を停止します。
  • Crouch(クラウチ) : キャラクターにクラウチングの開始を要求します。
  • StopCrouching : キャラクターのクラウチングを停止します。

Character Rotation

キャラクターは、自由に回転させることができますが(回転を変更する)、一般的な回転/向きのモードを扱う機能がすでに含まれています。

Character RotationMode

収録されている回転モードは以下の通りです。

  • None : キャラクターの回転を無効にします
  • OrientToMovement:与えられた入力移動方向ベクトルに向かって、rotationRate を回転変化率として、キャラクターを回転させます。
  • OrientToCameraViewDirection: rotationRate を回転変化率として、カメラの現在のビュー方向にキャラクターを回転させる。
  • OrientWithRootMotion: OrientWithRootMotion: キャラクターの現在の回転にルート モーションの回転を追加します。

キャラクターのデフォルトの回転モードは、必要に応じて SetRotationMode 関数を使ってエディタから設定したり、ランタイムで変更することができます。一方、GetRotationMode()関数を使用して、キャラクターの現在の回転モードを取得できます。


現在の回転モードに基づいて、キャラクターの回転はそのUpdateRotation メソッドで変更されます。また、このメソッドを拡張して、カスタムの回転を実行したり、デフォルトのモードを完全に置き換えることもできます。


また、このメソッドを拡張して、カスタムの回転を実行したり、デフォルトのモードを完全に置き換えることもできます。
さらに、以下の関数を使用して、キャラクタの回転を直接変更することができます。

● SetRotation.
● RotateTowards.
● AddYawInput.
● AddPitchInput.
● AddRollInput.

Character Position Right Up and Forward

キャラクタクラスには、キャラクタの位置や向きの情報にアクセスするための以下の様なメソッドがあります。
GetPosition()、GetRightVector()、GetUpVector()、GetForwardVector()です。これらのメソッドは、transform.positionやtransform.upなどよりも優先されるべきです。例えば FirstPersonCharacter の場合、transform.forward vector が変わらないことがあります。

Adding Forces to a Character

ECM2で導入された変更点の一つとして、リジッドボディベースではあるものの、キャラクターのリジッドボディは、計算された位置にキャラクタを物理的に移動させるための「トランスポート」として使用されるので、直接使用してはいけません。
そのため、キャラクターのキャラクタに力を加えるには、キャラクタのAddForce関数を使うことをお勧めします。

このAddForce関数は、UnityのAddForceと同じような動作をしますが、前者の方が正しくの方が正しく動作アルゴリズムに準拠しているので、そちらを推奨します。

LaunchCharacter function

新たに導入された関数であるLaunchCharacterは、次のような便利なヘルパー関数です。
キャラクタの速度を明示的に変更しながら、動きのアルゴリズムに従うことができる便利なヘルパー関数です。

public virtual void LaunchCharacter(Vector3 launchVelocity, bool
overrideVerticalVelocity = false, bool overrideLateralVelocity = false)

これはAddForceとは異なり、キャラクターの速度成分(水平および垂直)を直接変更(追加または置換)することができます。これは非常に柔軟性があり、キャラクタにインパルス(瞬間的なベロシティの変化など)を加える場合に適しています。

これを利用して、バウンサーを実装したり、キャラクターをダッシュさせたり、スライドさせたり、スピードアップさせたりすることができます。動きのアルゴリズムに安全に従うことができます。

Ground Constraint

ECM2では、これまでのECMと同様に、歩行時やスプリント時にキャラクターが地面から飛び出すのを防ぐために
Constraint to Ground(地面への拘束)機能を実装しています。(以前はsnap to groundと呼ばれていました)

これにより、キャラクターは常に歩行可能な地面を維持することができます。しかし、その結果として、キャラクターが地面から離れることができるタイミングをシステムに知らせる必要があります。
飛んだり、泳いだり、ジャンプしたりするときなど、地面から離れることが許されるときをシステムに知らせなければなりません。

これを実現するために、CharacterMovement ConstrainToGround関数を使用します。また、PauseGroundConstraintで一時的に(N秒)地上拘束を無効にします。

例えば、バウンサーを実装する場合。

// キャラクターが地面から離れるように、地面の制約を一時停止する
PauseGroundConstraint();
// キャラクターに垂直方向のインパルスを与える
LaunchCharacter(Vector3.up * 20.0f)。

Animating your Character

キャラクタークラスには、アニメーション関連のメソッドAnimateがあります。このメソッドを使用してアニメーター関連のコードを処理することができますが、これは必須ではなく、必要であれば安全に無視することができます。
キャラクタは、キャラクタのモデルが特定の方法でアニメーションされることや、アニメーションされることを必要としないからです。

キャラクタのアニメーションを外部のアニメーションコントローラで処理し、キャラクタの状態を照会することは、まったく問題ありません(実際に推奨されています)。
イベントをキープしたりして、アニメーションとキャラクターの物理的な状態を同期させます。

Querying Character State

Characterクラスには、以下のようなメソッド、イベント、デリゲートが用意されており、それらを使ってキャラクターの情報を読み取ることができます。
キャラクターの情報を読み取るために、さまざまなメソッドやデリゲートが用意されています。GetPosition(), GetRotation(), GetVelocity(),IsWalking(), isFalling(), IsOnWalkableGround(), などです。

これにより、キャラクターの現在の状態に関する有用な情報を提供し、特にアニメーションを完全に同期させるために使用することができます。

Characterクラスが提供する情報に加えて、CharacterMovementコンポーネント(例えばGetCharacterMovement()メソッド)を使ってさらに情報を得ることができます。
コライダの寸法の取得と設定、衝突検出関数へのアクセス、さらには新しい地面関連情報のセットを計算することもできます。地面に関連する情報(例:歩行可能か、段差があるか、地面までの距離など)を新たに計算することもできます。

Using Root Motion

ルートモーションとは、アニメーションの中にモーションが組み込まれていて、コードではなくアニメーションが
コードではなく、アニメーションがどれだけ動くかを決定します。

Character 派生クラスでルートモーションを使用するには、モデルの GameObject に RootMotionController コンポーネントを追加する必要があります。RootMotionController コンポーネントをモデルの GameObject に追加します。
このRootMotionControllerはアニメーションの速度や回転などをCharacterに与える役割を果たします。

さらに、ルートモーションの使用を有効または無効にするには、キャラクターのプロパティである useRootMotion を有効にする必要があります。

キャラクターがルートモーションで動かされると、アニメーションがキャラクターの動きを完全にコントロールします。
例えば、プロシージャルな動きをすべて置き換えることになります。そのためmaxWalkSpeedやmaxFallSpeedなどのプロパティは無視され、キャラクターの動きはアニメーションによって駆動されるからです。

では、ルートモーションを使うメリットは何でしょうか?

コリジョンカプセルをモデルのあるべき場所に固定することができ、アニメーションで加速と減速を利用することができます。アニメーションに加速と減速を利用することができ、足の滑りやその他のアーティファクトを排除できます。
アーチファクトがなくなり、プログラミングの作業負荷が軽減されます。

プレイヤーが操作するキャラクターにルートモーションを使用できますか?

できます。ただし、ジョイスティックの軸で加速度の大きさをコントロールするのではなく、どのアニメーションをどのくらいの速さで再生するかを制御します。キャラクタの制御、再生するアニメーションをコントロールします。 例えば、もっと速く歩きたいなら、速く歩くアニメーションを再生してください。90度回転したいなら、90度回転するアニメーションを再生します。

垂直方向の根元の動きにも対応していますか?

ただし、キャラクターが「飛行」モードである必要があります。

動作モードと論理状態を混同してはいけない」とコメントしたのを覚えていますか?これは、それを明確にするための良いケースです。

Character Events and Handlers

Characterクラスには、ローカル(Character派生クラスなど)や外部(Controllerなど)に対応するための様々なイベントやハンドラが用意されています。
ローカル(例:Character 派生クラス)または外部(例:Controller)に対応するために使用できます。

Events

// キャラクターが「地面」のコライダに当たったときにトリガーされます。
public event GroundHitEventHandler GroundHit;
// キャラクターがコライダの中に入ってヒットしたときに発生します。
public event MovementHitEventHandler MovementHit;
// キャラクターが歩行可能な地面にいなかった(最後のフレーム)ときに、歩行可能な地面に当たった場合に発生します。
歩行可能な地面に当たったときに発生します。
public event LandedEventHandler Landed;
// キャラクターが歩行可能な地面に当たったときに発生します。
public event WillLandEventHandler WillLand;
// ジャンプが正常に行われ、キャラクターが地面から離れようとしているときに発生します。
地面から離れようとしたときに発生します。
public event JumpedEventHandler Jumped;
// キャラクターがジャンプの頂点に達したときに発生します(例:垂直方向の速度が正から負に変化した
頂点に達したときに発生します(例:垂直方向の速度が正から負に変わったとき)。) notifyJumpApex == trueの場合のみトリガーされます。
public event ReachedJumpApexEventHandler ReachedJumpApex;
// LaunchCharacter...など、キャラクターが起動されたときに発生します。
public event LaunchedEventHandler Launched;
// キャラクターがしゃがんだときにトリガーされます。
public event CrouchedEventHandler Crouched;
// キャラクターがしゃがむのをやめたときに発生します。
public event UncrouchedEventHandler Uncrouched;
// キャラクターが新しい物理ボリュームに入ったときにトリガーされます。
public event PhysicsVolumeChangedEventHandler PhysicsVolumeChanged;
// MovementModeが変更された後にトリガーされます。
public event MovementModeChangedEventHandler MovementModeChanged;

Event Handlers

protected virtual void OnGroundHit(ref GroundHit prevGroundHit, ref GroundHit
groundHit)
protected virtual void OnMovementHit(ref MovementHit movementHit)
protected virtual void OnLanded()
protected virtual void OnWillLand()
protected virtual void OnJumped()
protected virtual void OnReachedJumpApex()
protected virtual void OnLaunched(Vector3 launchVelocity, bool
overrideVerticalVelocity, bool overrideLateralVelocity)
protected virtual void OnCrouched()
protected virtual void OnUncrouched()
protected virtual void OnPhysicsVolumeChanged(PhysicsVolume newPhysicsVolume)
protected virtual void OnMovementModeChanged(MovementMode prevMovementMode,
int prevCustomMode)

キャラクター派生クラス(例:カスタムキャラクター)を作成する場合、そのイベントをキープすることはできますが
その “On “メソッドを拡張することをお勧めします。その方がシンプルでわかりやすく、かつ高速です。例えば、以下のようになります。

// キャラクターの OnLanded メソッドを拡張します。
// キャラクターが歩行可能な地面に着いたときに呼び出されます。
protected override void OnLanded()
{
// ベースメソッドの実装を呼び出す
base.OnLanded();
Debug.Log("Landed!");
}

しかし、"On “ハンドラメソッドを拡張する際には、常にそのメソッドの基本実装を呼び出すことが重要です。
メソッドベースの実装を呼び出すことが重要です。なぜなら、この実装は、他のタスクのトリガーとなるからです。

一方、OnReachedJumpApexイベントを受信するためには、最初にnotifyJumpApexプロパティをtrueに設定しなければ、このイベントはトリガーされません。

protected override void OnJumped()
46{
// ベースメソッドの実装を呼び出す
base.OnJumped();
// ジャンプエイペックスのイベント通知を有効にする
notifyJumpApex = true;
Debug.Log("Jump!");
}
protected override void OnReachedJumpApex()
{
// ベースメソッドの実装を呼び出す
base.OnReachedJumpApex();
Debug.Log("Reached jump apex!");
}

ThirdPersonCharacter class

これはCharacterクラスを拡張し、典型的な三人称視点の動きをコントロールする機能を追加したものです。
三人称視点のゲームを作成する際には、このクラスを親クラスとして使用する必要があります。

ThirdPersonCharacterはThirdPersonCameraControllerクラスを使用していますが、ECM2には、3人称視点のカメラをコントロールするCinemachineを使った3人称視点のキャラクターが追加されています。Cinemachineはカメラを制御するために使用します。

FirstPersonCharacter class

これは、Characterクラスを拡張し、典型的な一人称視点の動きのためのコントロールを追加したものです。このクラスは
一人称視点のゲームを作るときは、このクラスを親クラスとして使うべきです。

Characterクラスを拡張し、GetEyeForwardVector()(カメラの表示方向)、GetEyeRightVector()などの追加機能や、
AddYawInput()やAddEyePitchInput()などの入力アクションコマンドが追加されます。その他の機能もあります。

ここで重要なことは、よりスムーズな回転を実現するために、ファーストパーソンキャラクターは、FirstPersonCharacterはキャラクターの回転を特殊な方法で処理しています。
Yaw-RotationをRoot Pivot Transformに適用する代わりに、GetForwardVector()、GetRightVector()、GetUpVector()メソッドを使って、キャラクタの方向ベクトルを問い合わせることが重要です。最新の値が返されることが保証されています。

AgentCharacter class

AgentCharacterはCharacterクラスを拡張し、ナビゲーションとパスファインディングの機能を追加します。
機能(NavMesh、NavMeshAgent)を追加しています。これにより、ナビゲーションメッシュ(プレイヤーまたはAIが制御)を使用して、ゲームワールド内をインテリジェントに移動できるキャラクターを作成できます。

AgentCharacterを動かすにはどうすればいいですか?

プレイヤーが操作するキャラクターの場合は、キーボードやコントローラー、マウスを使って操作することができます。
マウスで操作できます(例:クリックで移動)。さらに、MoveToLocation()関数が追加されています。
この関数は、(ワールドスペース内の)位置を受け取り、NavMeshAgentを使用して指定されたポイントにインテリジェントにナビゲートするようにキャラクターに指示します。

Platforms

プラットフォームとは、プレイヤーが移動したり、回転したりする特殊な「動的な地面」のことです。
プラットホームは、プロシージャルに、またはアニメーションで動かすことができます。PlatformMovementクラスを継承していなければなりません。プラットフォームの位置、回転、速度をCharacterMovementに提供します。
プラットフォームは、以下のコンポーネントで構成されています。

● Transform.
● Kinematic Rigidbody.
● Collider.
● PlatformMovement derived class.

Procedurally Moving a Platform

キャラクターと同じように、動くプラットフォームを作るには、PlatformMovementクラスを拡張した新しいスクリプトを作成し、そのOnMove()メソッドをオーバーライドする必要があります。
PlatformMovementクラスを継承した新しいスクリプトを作成し、そのOnMove()メソッドをオーバーライドして、移動を行います。

public sealed class MyPlatform : PlatformMovement
{
public static float EaseInOut(float time, float duration)
{
return -0.5f * (Mathf.Cos(Mathf.PI * time / duration) - 1.0f);
}
protected override void OnMove()
{
float t = EaseInOut(Mathf.PingPong(Time.time, moveTime), moveTime);
position = Vector3.Lerp(_startPosition, _endPosition, t);
}
}

上のコードを見るとわかるように、OnMove()メソッドを使ってプラットフォームの位置(必要に応じて回転も)を更新しています。内部的にPlatformMovementは、最新のプラットフォームの速度と角速度を計算します。
最新のプラットフォームの速度と角速度を計算し、CharacterMovementがそれを使ってキャラクターを動かすことができます。

Moving a Platform with Animation

アニメーションベースの作成手順は、上記で説明したものと同様です。PlatformMovementの派生クラスを作成し、そのOnMoveメソッドで位置(と回転)を位置(と回転)を更新します。しかし、重要な違いの一つは、PlayableDirector
を使用して、プラットフォームのアニメーションを手動で再生し、プラットフォームの位置と回転を更新します。

また、アニメーターの更新モードが「Animate Physics」になっていることを確認してください。

public sealed class AnimatedPlatform : PlatformMovement
{
private PlayableDirector _director;
protected override void OnMove()
{
// 手動でアニメーションを更新
_director.time = Time.time % _director.duration;
_director.Evaluate();
49// 位置と回転をアニメーションの変換で更新する
(アニメーションで変更)
position = transform.position;
rotation = transform.rotation;
}
プライベートボイド Awake()
{
// PlayableDirectorコンポーネントのキャッシュ
_director = GetComponent<PlayableDirector>();
}
}

キャラクタクラスでは、キャラクタが動くプラットフォームの影響を受けるかどうかを、プロパティやデリゲートを使って決めることができます。移動中のプラットフォームの勢いを維持したい、残しておきたい場合は、impartPlatformsVelocityプロパティの値をtrueに設定し、キャラクターがプラットフォームに沿って回転するのを防ぎたい場合は、impartPlatformRotationプロパティ値を false に設定します。プラットフォームの運動量を増加させたい場合は、ImpartPlatformVelocity()メソッドを使用して、PlatformVelocityをスケーリングします。

Demo

これは、ECM2の機能のほとんどを示す、フル機能のサンプルシーンです。

Examples

各サンプルにはECM2 がどのように動作するか、またゲームのニーズに合わせてどのように拡張するかを理解するのに役立ちます。

Input

Default Input Actions

この例では、カスタムコードを使用せず、すぐに調整可能なデフォルトのCharacterを使用しています。

Custom Input Actions

この例では、Characterの派生クラスで使用する新しいInputActionを追加する手順を示しています。派生クラスで使用する新しいInputActionを追加する手順を示します。

PlayerInput Character Controller

この例では、Character 派生クラスを「所有」する方法を示しています。
コントローラーの最も基本的な例で、例えばキャラクターを外部からコントロールすることができます。

この例では、外部からアニメーションさせたキャラクター(UnityCharacterAnimator)を使用しています。
Unitys PlayerInputコンポーネントを使用して、プレイヤーの入力アクションをコントローラ内で処理しています。
コントローラ(MyCharacterController)内でプレイヤーの入力操作を行います。

これはキャラクターを制御するものですが、ThirdPersonCharacterのような派生クラスでも同じ手順が適用されます。
派生したクラス(ThirdPersonCharacter、AgentCharacterなど)も同様です。

Old Input Examples

これには、Unityの新しい入力システムを無視して、古い入力システムに置き換える方法を示す、いくつかの例が含まれています。必要に応じて他の入力システムを使用することができます。

Animation

Character Animator

この例では、現在の状態を読み取ったキャラクタを外部からアニメーションさせて、キャラクタのAnimatorに供給するために、現在の状態を読み取って外部からアニメーションさせる方法を示しています。

Characterクラス(およびその派生クラス)には、アニメーション関連のメソッド、Animateを使用してアニメーション関連のコードを処理することができますが、外部のアニメーションコントローラを使用することをお勧めします。

Root Motion

Root Motionで動かし、Root Motionで向きを変えたアニメーションキャラクターが登場します。
従来のECMバージョンとは異なり、ECM2では、キャラクターの動作モードや状態に応じて、ルートモーションを自動的に有効/無効にすることはありません。
この例では、キャラクターがジャンプしたときに、キャラクターの動きがすぐに止まります。
この「制限」を克服するためには、キャラクターの動作モードや論理的な状態に応じて、必要に応じて手動でルートモーションを切り替えるか、ルートモーションベースのジャンプを使用します。現在では、ルートモーションが有効になると完全に制御されます。

Root Motion Toggle

前述の例では、ルート・モーション・ベースの動きの使用をトグル(有効/無効)する方法を示しました。
モーションベースの動きを切り替える方法を示しています。この例では、キャラクターは歩くルートモーションのみで
ルートモーションのみでキャラクターを動かします。

この例では、Character OnMovementModeChanged メソッドを使用してルートモーションを切り替えています。
キャラクタが歩行動作モードにあるときは有効にし、そうでないときは無効にします。

OnMovementModeChangedは、キャラクターが現在の移動モードを変更するたびに呼び出されます(例:SetMovementMode)
このメソッドは動きに依存したコードを処理します(例:地面の拘束の有効/無効ジャンプのキャンセル、ジャンプカウンターのリセットなど、動きに依存するコードを追加するのに最適な場所です(例:移動モードの入力/終了)。

Events

Character Events

この例では、Character(例:カスタムキャラクター)の派生クラスを作成し、そのメソッドを拡張して、そのメソッドを拡張して、多くのCharacterイベントに対応しています。

Character Controller Events

この例では、キャラクタコントローラが、制御されるキャラクタのイベントを利用する方法を示します。イベントを利用して、コントローラがキャラクタのイベントに応答する方法を示しています。

Platforms

Scripted Platform

この例では、プロシージャル(スクリプトで制御された動き)な動きをするプラットフォームを作成する際の手順を紹介します。スクリプトで制御された動き)のプラットフォームを作成する手順を示します。この例では、PlatformMovement 派生クラスを作成し、その OnMove() を使用してプラットフォームの移動を行います。

Tweenエンジンを使ってプラットフォームを動かす場合も、同様の手順を踏む必要があります。

Animated Platform

この例では、アニメーションで制御された動きのムービングプラットフォームを作成する手順を示します。派生クラスのPlatformMovementを作成し、そのOnMove()を使ってプラットフォームの移動を行う方法を示しています。

また、PlayableDirectorコンポーネントを使用して、必要に応じてアニメーションを更新しています。

Gameplay

Third Person Controller

この例では、三人称のコントローラを実装する方法を示します。このコントローラは、キャラクターを所有し、ThirdPersonCameraを使用します。

Target Lock

この例では、Characterを拡張してターゲットロックの仕組みを実装しています。ロック中、キャラクターは自動的に現在のターゲットを見ています。

Twin-Tick Movement

この例では、キャラクターを拡張して、多くのトップビューシューティングゲームに見られるようなツインスティック動作を
実装しています。そして、ここでは、キャラクターの動きと回転(照準)が、分離されているので、異なる方向に移動して撃つことができます。

Bouncer

この例では、Character LaunchCharacter関数を利用している。バウンサーを実装しています。

LaunchCharacterを使うと、簡単で便利な方法で直接キャラクターの速度を変更することができます。
コンポーネントベースでキャラクターのベロシティを直接変更する(加算またはオーバーライド)ことができます。
可能であれば、キャラクターのベロシティを設定するよりも優先されるべきです。これはキャラクターの動作モードを変更するものではありません。

Dash

基本的なダッシュ
この例では、Characterクラスを拡張して、ダッシュ状態を追加しています。これは、完全なキャラクターに新しい「アクション」を追加する方法を示した完全な例です(この例ではダッシュアクション)。
ECM2 のキャラクターに機能を追加する際には、ここで紹介したガイドラインを参考にしてください。

キャラクターに特別な機能を追加する場合、そのキャラクターのOnMoveメソッドを使用し(オーバーライドし)、これを使って新しい状態(例:Dashing)を処理します。また、同じOnMoveメソッドで、同じOnMoveメソッドを使って新しいカスタムモードを追加することは可能ですが(全く問題ありません)、キャラクタークラスには、Characterクラスには、カスタムの移動モードを処理する専用のメソッドOnCustomMovementModeがありますので、そちらをご利用ください。

ここで実装されているダッシュの仕組みは、ダッシュの持続時間(秒)と希望のダッシュ衝動を設定する必要があります。
ダッシュ時間が終了すると、キャラクターはデフォルトの状態(例:歩行)に戻ります。

ここで注意したいのは、キャラクターの動きは常に現在の物理的な設定(MaxAcceleration、BrakingDecelerationWaling、GroundFrictionなど)の影響を受けるということです。
キャラクターの動きは、常に現在の物理的な設定(MaxAcceleration、BrakingDecelerationWaling、GroundFrictionなど)の影響を受けます。
そのため、ダッシュインパルスを現在の摩擦(歩行、転倒、落下)の影響を受けずに行うためには、brakingFrictionプロパティを利用します。
これを有効にすると(useSeparateBrakingFriction = true)、キャラクターの現在の摩擦をbrakingFrictionに割り当てられたフリクションをバイパスすることができます。

また、OnMovementHitを使用して、キャラクターが歩けない面(壁など)にぶつかったときにダッシュを止めるようにします。歩くことができない面(壁など)にぶつかったときにダッシュを止めるようにします。

ダッシュを移動モードにしてはどうでしょうか?

移動モードは、キャラクターの速度とその更新方法を直接変更するものであることを忘れないでください。
を変更します。例えば、Walkingでは、入力された垂直方向の速度を無視して、キャラクターの速度を歩行可能な面に沿って再設定します。

歩行可能な面に沿ってキャラクターの速度を再設定し、自動的に落下移動モードに変更するモードに自動的に変更する、などです。このように、もしDashingを移動モードとして実装するとなるとダッシュを実現するためには、すでに実装されている機能の多くを再現する必要があります。

理想的な動作モードは、他の動作モードでは実現できない動作であることです。

Advanced Dash

ここで実装されているダッシュのメカニズムは、前バージョンよりも完全な実装となっています。今回実装されたダッシュメカニックは、以前のバージョンよりも完全な実装となっており、追加の物理的特性(最大速度、ブレーキ・減速など)を考慮しています。キャラクターがダッシュできるか?ダッシュ中のキャラクターの回転を無効にする。ダッシュ中のキャラクターの回転を無効にする、などです。

ダッシュは衝突(壁など)したとき、ダッシュボタンを離したとき、またはキャラクターの速度が最大速度以下になったときに終了します。キャラクターの速度がmaxWalkSpeed以下になるとダッシュは終了します。

Slide

この例では、Characterを拡張して、FPSゲームに見られるようなスライド機構を実装する方法を紹介します。
キャラクターを拡張して、FPSゲームに見られるようなスライド機構を実装する方法を紹介します。これは以下のように動作します。

スライドさせるには、キャラクターがスプリントしている状態でしゃがみ入力を行う必要があります。一方で逆に、以下の場合はスライドが終了します。

  • キャラクターが落下しています。
  • 歩けない場所(例:壁)にいる場合。
  • キャラクターの速度が maxWalkSpeedCrouched より小さい。
  • キャラクターがしゃがむのを解除します。

ご覧の通り、この例はDashingの実装に非常に近いものとなっています。
これらの例は、Characterクラスで使用されている同じガイドラインに従っており、必須ではありませんが、Characterに追加機能を追加する際には、強制ではありませんが、キャラクターに機能を追加する際にはこのガイドラインに従うことをお勧めします。ここでの特別な違いは、Crouch/Uncrouchイベントハンドラーを使用してスライディング状態を開始/終了していることです。追加の入力は必要ありません。

これらのガイドラインは、強制ではありませんが、コードを読みやすくしたり、コードをきれいにしたりするのに役立ちます。コードをすっきりさせることができます。例えば、スライディング状態を追加するには、次のようにします。

IsSliding()
キャラクターは現在スライドしているか判定します。
CanSlide()
キャラクターがスライドできるかどうかを判定します。
スライド()
スライドを開始します。通常、入力イベント(例:Onボタンダウン)に応じて呼び出されます。
StopSliding()
キャラクターのスライドを停止します。通常、入力イベントに応じて呼び出されます (例: On
ボタンアップ)
Sliding()
スライド状態を処理します。
OnMove()
OnMoveメソッドをオーバーライドして、状態ハンドラであるSliding()を追加します。

Planet Walk

この例では、ThirdPersonCharacterとThirdPersonCameraを拡張して、Mario Galaxyのような「Planet Walk」の動きを実装しています。マリオギャラクシーのような “Planet Walk “を実装し、キャラクターが惑星を歩き回れるようにしています。この例では、キャラクターとカメラの回転を、惑星の曲率に合わせて更新しています。

Slope Speed Modifier

この例では、現在の坂道の角度に応じてキャラクターの速度を変更し、坂道を上るときには速度を落とし、坂道を下るときには速度を上げる方法を示しています。

これを実現するために、AnimationCurveを使って坂道の速度を変更する要素を定義します。ここでは、カーブのX軸が斜面の角度を、Y軸がスピードモディファイアを定義しています。負の角度は坂道を下ることを意味します。

キャラクターは署名された斜面の角度を使って、斜面の速度曲線を調べ、現在の速度修正値を得て、最大速度を更新します。
現在の速度修正値を取得し、それに応じてmaxWalkSpeedを更新します。

Fly

キャラクタークラスにはデフォルトで飛行モードがありますが、飛行中のキャラクターの動きを決めるのはユーザーの責任です。キャラクターをどのように動かすかは、ユーザーの責任です。移動モードは、キャラクターを移動させる際のルールを設定するだけです。この例では、キャラクターの飛行移動モードを利用した飛行メカニックを実装しています。
飛んでいるときには、キャラクターはビューの方向に沿って移動でき、垂直方向にも移動できます。

Swimm

キャラクタークラスには、デフォルトで「泳ぐ」という動作モードが含まれていますが、泳いでいるときにキャラクターをどのように動かすか(例:上に泳ぐ、下に泳ぐなど)は、ユーザーの責任です。
キャラクターを動かす際のルールを設定するだけです。この例では、キャラクターの飛行モードを利用して、泳ぐ仕組みを実装しています。

Ladders

これは重要な例で、カスタムの動作モードとサブステートを実装する方法を示すものです。

この例では、キャラクターを拡張してはしごの仕組みを追加します。
この動作モードには、Climbingステート(例:Climbing)一連のClimbingの状態(例:None、Grabbing、Grabbed、Release)が含まれます。

これまでの例と同様に、新しい動作モードやステートを追加する際には、以前に定義したガイドラインに従うことに注意してください。新しい動作モードや状態を追加する際のガイドラインに従っています。

基本的には、プレイヤーがインタラクトキー(E)を押したとき、それがラダートリガーの範囲内であれば、Climbコマンドが実行されます。
ラダートリガーの範囲内であれば、Climbコマンドが実行され、クライミングメカニックが実行されます。
キャラクターが登れるかどうかをチェックし、適切に反応します。

登ることが許可されると、Climbメソッドは現在の移動モードを次のように新しいカスタム動作モードに変更します。

SetMovementMode(MovementMode.Custom, (int) CustomMovementMode.Climbing);

注目すべきは、SetMovementModeは現在のカスタムステートIDとしてintパラメータを受け取るので、構造体からint型にキャストする必要があります。

OnMovementModeChangedメソッドを使用して、新しい移動モードを処理します。また、ジャンプのキャンセル、地面拘束の無効化/有効化など、必要な追加設定を行います。

キャラクターの移動モードが Climbing になると、Climbing メソッドは以下の処理を行います。ラダーパスに沿ってキャラクターを移動させ、それに合わせてクライミングの状態を更新します。

特筆すべきは、カスタムのClimbing移動モードを処理するためにnCustomMovementModeメソッドを使用していることです。カスタム移動モードを追加する際には、OnMoveよりもこのメソッドを使用することをお勧めします。

キャラクターは要求に応じてクライミング動作を終了する(ラダーを離す)か、ラダーの出入り口のいずれかに到達すると
のいずれかに到達した場合に終了します。登りの動作モードを終了するには、落下の動作モードに変更します。

これは必要に応じて(キャラクターが歩ける場所にいるなど)自動的にWalkingに切り替わる、やや「インテリジェント」な状態であり、デフォルトの出口移動モードとして使用できます。

Change Gravity Direction

この例では、キャラクターを拡張して、ランタイムに重力方向を変更する方法を示します。ここでは、重力の方向を上下に切り替えて、それに合わせてキャラクターを回転させます。

キャラクターを回転させて、新しい重力方向に合わせます。キャラクターを回転させると、すべての動きは
これにより、キャラクターは壁や天井などを歩くことができます。天井などを歩くことができます。

重力の方向を切り替えるには、キャラクターがジャンプまたは落下しているとき(例:接地していないとき)にEキーを押します。UpdateRotationメソッドをオーバーライドして、新しい重力方向に対してキャラクターを回転させます。

Fall Damage

この例では、キャラクターのイベントハンドラを利用して、キャラクターが最後に接地した位置を記録する方法を示しています。最後に接地した位置を記録しておき、着地したときに落下距離(最後に接地した位置からキャラクターの現在の位置までの距離)を計算するだけです。
最後に接地した位置から、キャラクターの現在の位置までの距離を利用して、ゲームのルールに基づいて、キャラクターがダメージを受けるかどうかを判断することができます。

Teleporter

この例では、v1.0.1の新しいTeleportPosition、SetYaw関数を使用して、キャラクターを正しくテレポートする方法を示します。TeleportPosition, SetYaw 関数を使用しています。

Cinemachine

ここでは、Cinemachineの機能を活用するためにキャラクターを変更する方法を示す例を紹介します。なお、これらの例はCinemachineのパッケージに依存しないように、パッケージとして提供されています。これらの例をインポートする前に、必ずCinemachineパッケージをプロジェクトにインストールして下さい。

First Person

この例では、FirstPersonCharacterを修正して、Cinemachineベースのカメラを利用できるようにします。

FirstPersonCharacterのデフォルトのカメラをCMのものに置き換え、プロシージャルなしゃがみのアニメーションをCinemachineベースのものに置き換えています。プロシージャルなしゃがみのアニメーションをCinemachineベースのものに変更します。

Third Person

Cinemachineを使ってCharacterを拡張し、3人称の基本的な動きを実装する方法を紹介します。
の動きを実装するためにCharacterを拡張する方法を示します。この例では、Cinemachine 2.6で導入された3人称視点のフォロー動作を利用しています。
この例では、Cinemachine 2.6で導入された3人称のフォロー動作を利用しています。

Path Following

この例では、キャラクターを拡張してパスフォローの動作を実装する方法を示します。Cinemachine Pathを使ってキャラクタの動きを動かしています。

パスをたどる場合、基本的にはキャラクタの現在の位置からパス上の目標位置までの移動方向のベクトルを計算します。
キャラクターの現在の位置からパス上の目標位置までの移動方向ベクトルを計算し、目標位置までの距離が
“目標位置までの距離が「十分に近い」場合、キャラクターの速度に基づいてパス内の位置(次の目標位置)を更新します。
の速度に基づいてパス内の位置(次の目標位置)を更新し、キャラクターをパスに沿って移動させます。

注意していただきたいのは、これはパスフォローの動作を実装したものであり、ハードロックのパスフォローではないということです。これは、AIに適した、より流動的で自然なパスフォローを提供するためで、パトロールなどに適しています。

Bolt

ここでは、Boltを使ったキャラクターの活用例をご紹介します。注意点
これらの例は、Boltパッケージへの依存を防ぐためにパッケージとして含まれています。

これらの例をインポートする前に、必ずBoltパッケージをプロジェクトにインストールしてください。
の例を参照してください。

まとめ

様々な動作やカメラワークが揃っていて、まさに3Dアクションゲームを作るためのアセットですね!現時点でかなり新しい技術を使っているアセットなので、長く使える技術を習得するという意味でも非常に有用だと思います。

アイコンはチノマロンさんからお借りしました。

+3