Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

このレッスンでは、私たちの Player の基本的な移動ロジックの開発を続けます。

Cave Engine の Logic Bricks を使用して、キャラクターが歩いて走るためのロジックを作成します。この過程で、プレイヤーの入力をキャプチャし、その入力を移動方向に変換し、移動速度を制御し、ビジュアルロジックを整理する方法を学びます。

このレッスンは、以前に作成したジャンプロジックに基づいています。今度は、単一のキー入力に反応するのではなく、複数のキーを同時に読み取り、それを使用して Player がどこに移動するべきかを定義します。

1. シーケンスの追加

Player の移動ロジックを開発し続けるために、Sequence ノードの使用方法を学びます。

Sequence ノードを使用すると、単一の入力から複数の Flow 出力を作成できます。これは、多くのゲームプレイシステムが同じイベントから複数のロジックを実行する必要があるため、便利です。

たとえば、私たちの On Update イベントは、毎フレームジャンプロジックを確認する必要がありますが、毎フレーム移動ロジックも確認する必要があります。すべてを一つの大きく混乱した連鎖として作成するのではなく、Sequence を使用してフローを複数の整理されたブランチに分割できます。

このようにして、同じ On Update イベントは、毎フレーム異なるロジックブロックをクリーンで制御された方法で実行できます。

image.png

2. 移動ロジックの作成

Player の移動を作成するために、最初に Events ノードを追加し、次に Active ノードを追加します。

Active ノードは、キーが現在押されているかどうかをチェックします。これは、キーが一度だけ押されたかどうかを確認するのとは異なります。移動の場合、通常はプレイヤーがキーを継続的に押しているかどうかを知りたいです。なぜなら、キーがアクティブである限りキャラクターは移動し続けるべきだからです。

すべての移動キーについてこれを行います:

  • W 前進
  • S 後退
  • A 左移動
  • D 右移動

Active ノードの出力は Bool 値です。ブール変数は True または False の二つの状態しか持てません。

このブール値を Float に変換すると、次のようになります:

  • 1 値が True の場合
  • 0 値が False の場合

これにより、キーボードの状態を数学的操作に使用できます。

たとえば、S の値を W の値から引いて前進/後退の動きを計算できます。また、A の値を D の値から引いて左右の動きを計算できます。

これが機能するのは、各キーが 0 または 1 のいずれかを返すためです。

たとえば、前進と後退の動きについて:

  • W が押されていて S が押されていない場合、結果は 1 - 0 = 1 となり、Player は前進します。
  • S が押されていて W が押されていない場合、結果は 0 - 1 = -1 となり、Player は後退します。
  • どちらのキーも押されていない場合、結果は 0 - 0 = 0 となり、その軸では移動がありません。
  • 両方のキーが押されている場合、結果は 1 - 1 = 0 となり、相殺されます。

これらの結果を使用して、Make Vector 3 ノードを追加し、計算した値を X および Z 軸に接続し、移動方向を定義します。

次に、最初の Then 出力を Sequence ノードに接続して、他の Then 出力は以前のレッスンで作成したジャンプロジックで使用できます。

最後に、Entity を取得し、その Character Component にアクセスし、Set Walk Direction ノードを使用します。Make Vector 3 で作成したベクトルを方向パラメータに接続し、Character Component が Player をどこに移動させるべきかを認識します。

image.png

次に、Player の移動速度を制御するためのリミッターを作成する必要があります。

移動方向を Set Walk Direction に直接定義するのではなく、まず移動方向をプロパティに保存します。これにより、キャラクターに適用する前にこの方向を変更できるため、より制御が可能です。

Properties タブを開き、新しいプロパティを作成し、そのタイプを Vector3 に変更し、Move Dir に名前を変更します。

このプロパティは、Player の移動方向を保存するために使用され、ロジックの次の調整の基準となります。

image.png

image.png

プロパティの隣に表示されているギアアイコンをクリックし、Change Type を選択してその型を変更します。

その後、Vector3 を選択します。

image.png

image.png

次に、Logic Bricks の Graph に戻り、作成した Move Dir プロパティを設定します。

image.png

Make Vector 3 ノードの出力を Move Dir プロパティの値に接続します。

これにより、移動方向をキャラクターに直接適用するのではなく、そのベクトルをプロパティに保存して次のロジックパートで使用および変更できるようにします。

image.png

Move Dir プロパティにキャラクターの移動方向を保存したので、Float タイプのプロパティを 2 つ作成します:

  • Walk Speed
  • Run Speed

これらのプロパティは、各移動状態における Player の速度を定義します。

ここでプロパティを使用するのは良いプラクティスです。なぜなら、後で移動を調整しやすくなるからです。グラフ内のハードコーディングされた値を探す代わりに、エンティティを選択し、プロパティタブから直接歩行速度や走行速度を調整できます。

image.png

次に、Bool タイプのプロパティを 1 つ作成し、Is Running と名付けます。

このプロパティはキャラクターの走り状態を保存します。これにより、プログラムが Player が現在走っているかどうかを判断でき、Walk Speed と Run Speed の値を選択できます。

image.png

次に、Active ノードを追加して Shift キーが押されているかどうかを確認します。

その後、Set Is Running を使用してこの条件に基づいてプロパティを設定します。Shift がアクティブな場合、Is Running は True に設定され、キャラクターは走っていることを示します。

image.png

次に、Move Dir プロパティに保存されている方向を使用して Walk Direction を定義し、各移動状態に対して正しい速度を適用します。

これを行うために、If ノードを追加して Is Running プロパティが True か False かをチェックします。

結果が True の場合、Move Dir の値を取得し、Run Speed プロパティで乗算します。

結果が False の場合、Move Dir の値を取得し、Walk Speed プロパティで乗算します。

最後に、この乗算の結果を Set Walk Direction ノードに接続します。

これにより、移動方向は同じままですが、その強度は Player が歩いているのか走っているのかによって変わります。

image.png

次に、小さな問題を解決する必要があります。

キャラクターを対角線で移動すると、前進、後退、左右で移動するよりも速く移動することに気付くかもしれません。これは、2 つの移動軸を組み合わせることがより大きな大きさのベクトルを作成するからです。

たとえば、前進のみで移動すると、次のような方向を生成します:

(0, 0, 1)

しかし、前進しながら右に移動すると、次のようなものを生成します:

(1, 0, 1)

その対角線ベクトルは単一軸ベクトルよりも長いため、キャラクターは対角線でより速く移動します。

この動作を修正するために、Move Dir プロパティに保存する前に、方向ベクトルを正規化します。

まず、Make Vector 3 で生成されたベクトルの Length を取得します。

次に、この値が 0 より大きいかどうかを確認するために If ノードを追加します。

この検証は重要です。なぜなら、空のベクトルを正規化すべきでないからです。長さが 0 のベクトルは、移動キーが押されていないことを意味し、正規化する方向がありません。

条件が真の場合、Normalized ノードを使用してベクトルの正規化されたバージョンを取得します。

そうでない場合は、元のベクトルを使用します。

最後に、結果を Set Property ノードの Move Dir に接続します。

これにより、移動方向は保持されますが、その大きさは一貫性を保ち、キャラクターがあらゆる方向に同じ速度で移動することを保証します。

image.png

3. イベントの使用

ロジックブロック内でロジックのフローを構造化する方法はさらに整理されたものです。

コメントや Sequence ノードに加えて、Events を使用してシステムをよりクリーンで理解しやすくすることができます。

イベントを使用すると、特定のロジックブロックを分離し、グラフ内の他の場所から呼び出すことができます。これは、グラフが大きくなるにつれて特に便利です。すべてを On Update に直接接続した大きな連鎖を避けるからです。

新しいイベント Move Player を作成しましょう。

image.png

次に、このイベントをプレイヤーの移動ロジックブロックのフローに接続します。

image.png

これにより、全体の移動ロジックを On Update に直接接続するのではなく、On Update シーケンス内で Move Player イベントを単に呼び出すことができます。

これにより、フローはよりクリーンでモジュール化され、特にプロジェクトのロジックが複雑になるにつれて、理解しやすくなります。

image.png

この時点で、Player には Logic Bricks で作成された基本的な移動システムがあります。

ロジックは現在、移動キーをチェックし、移動方向を計算し、対角移動が速くならないように方向を正規化し、それをMove Dirプロパティに格納し、プレイヤーが走っているかをチェックし、正しい速度を適用し、最後にその結果をCharacter ComponentにSet Walk Directionを通じて送信します。