# DxLibで３Dキャラクターの移動（基本）

## カメラの違いによるキャラクター移動操作

このサンプルでは、同じプレイヤー操作を使いながら、カメラの種類によって見え方や操作感がどのように変わるかを確認します。

使用するカメラは次の3種類です。

- 固定カメラ
- TPSカメラ
- OTSカメラ

<span style="white-space: pre-wrap;">カメラの種類は </span>`<span class="editor-theme-code">CAMERA_MODE</span>`<span style="white-space: pre-wrap;"> で管理しており、</span>`<span class="editor-theme-code">CAMERA_FIXED</span>`、`<span class="editor-theme-code">CAMERA_TPS</span>`、`<span class="editor-theme-code">CAMERA_OTS</span>`<span style="white-space: pre-wrap;"> の3種類が定義されています。</span>  
<span style="white-space: pre-wrap;">実行中は </span>`<span class="editor-theme-code">Cキー</span>`<span style="white-space: pre-wrap;"> を押すことで、固定カメラ → TPSカメラ → OTSカメラ の順に切り替わります。</span>  
サンプルプログラムをクローンして、実行してみてください。  
[https://github.com/youetsux/radioControlMan](https://github.com/youetsux/radioControlMan "サンプルプログラム")

---

### 共通のプレイヤー操作

プレイヤーの基本操作は、どのカメラでも共通です。

<table id="bkmrk-%E3%82%AD%E3%83%BC%E5%8B%95%E4%BD%9Cw%E5%89%8D%E9%80%B2s%E5%BE%8C%E9%80%80a%E5%B7%A6%E5%9B%9E%E8%BB%A2d%E5%8F%B3%E5%9B%9E%E8%BB%A2c%E3%82%AB"><colgroup><col></col><col></col></colgroup><tbody><tr><th>キー

</th><th>動作

</th></tr><tr><td>W

</td><td>前進

</td></tr><tr><td>S

</td><td>後退

</td></tr><tr><td>A

</td><td>左回転

</td></tr><tr><td>D

</td><td>右回転

</td></tr><tr><td>C

</td><td>カメラ切り替え

</td></tr></tbody></table>

<span style="white-space: pre-wrap;">プレイヤーは </span>`<span class="editor-theme-code">Aキー</span>`<span style="white-space: pre-wrap;"> と </span>`<span class="editor-theme-code">Dキー</span>`<span style="white-space: pre-wrap;"> でY軸方向に回転します。</span>  
<span style="white-space: pre-wrap;">その回転角度から、現在の進行方向ベクトル </span>`<span class="editor-theme-code">dir_</span>`<span style="white-space: pre-wrap;"> を計算しています。</span>

```
float rad = DirectX::XMConvertToRadians(rotY_);dir_ = VGet(sinf(rad), 0.0f, cosf(rad));
```

`<span class="editor-theme-code">Wキー</span>`<span style="white-space: pre-wrap;"> を押すと、進行方向 </span>`<span class="editor-theme-code">dir_</span>`<span style="white-space: pre-wrap;"> に向かって前進します。</span>  
`<span class="editor-theme-code">Sキー</span>`<span style="white-space: pre-wrap;"> を押すと、進行方向と逆向きに後退します。</span>

```
pos_ = VAdd(pos_, VScale(dir_, speed_ * dt));
```

つまり、このサンプルの移動は「カメラの向き」ではなく、「キャラクター自身の向き」を基準にしています。

---

## 固定カメラでのラジコン移動操作

### 固定カメラとは

固定カメラは、カメラの位置と注視点が常に決まっているカメラです。

<span style="white-space: pre-wrap;">このサンプルでは、カメラ位置を </span>`<span class="editor-theme-code">(0, 10, -10)</span>`<span style="white-space: pre-wrap;">、注視点を </span>`<span class="editor-theme-code">(0, 0, 0)</span>`<span style="white-space: pre-wrap;"> に固定しています。</span>

```
VECTOR FIXED_POS    = VGet(0.0f, 10.0f, -10.0f);VECTOR FIXED_TARGET = VGet(0.0f, 0.0f, 0.0f);
```

固定カメラモードでは、プレイヤーが移動してもカメラは動きません。  
常に同じ位置からステージを見下ろすような見え方になります。

```
SetCameraPositionAndTarget_UpVecY(FIXED_POS, FIXED_TARGET);
```

### 固定カメラのサンプル動画

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" height="315" src="https://www.youtube.com/embed/LUn4j4wpv4I?si=lA3FKp4a6dmkfVeu" title="YouTube video player" width="560"></iframe>

### ラジコン操作の特徴

固定カメラでは、画面の上方向とキャラクターの前方向が常に一致するとは限りません。

そのため、操作感としてはラジコンに近くなります。

- `<span class="editor-theme-code">Aキー</span>`：キャラクターが左に向きを変える
- `<span class="editor-theme-code">Dキー</span>`：キャラクターが右に向きを変える
- `<span class="editor-theme-code">Wキー</span>`：キャラクターが向いている方向へ進む
- `<span class="editor-theme-code">Sキー</span>`：キャラクターが向いている方向の逆へ下がる

<span style="white-space: pre-wrap;">例えば、キャラクターが画面手前を向いている状態で </span>`<span class="editor-theme-code">Wキー</span>`<span style="white-space: pre-wrap;"> を押すと、画面上では手前方向に移動します。</span>  
これは、`<span class="editor-theme-code">Wキー</span>`<span style="white-space: pre-wrap;"> が「画面の上へ進む」ではなく、「キャラクターの前へ進む」操作だからです。</span>

### 固定カメラのメリット

固定カメラは、ステージ全体の位置関係を把握しやすいのが特徴です。

プレイヤーがどこにいてもカメラが動かないため、背景や地形の見え方が安定します。  
パズルゲーム、見下ろし型アクション、昔の3Dアドベンチャーゲームなどで使いやすい方式です。

一方で、キャラクターの向きと画面方向がずれるため、慣れるまでは操作が難しく感じることがあります。

---

## TPSカメラによるキャラクター移動

### TPSカメラとは

TPSカメラは、キャラクターの後ろから追いかけるカメラです。  
TPSは Third Person Shooter、または Third Person View のように、三人称視点のゲームでよく使われます。

<span style="white-space: pre-wrap;">このサンプルでは、プレイヤーの進行方向 </span>`<span class="editor-theme-code">playerDir</span>`<span style="white-space: pre-wrap;"> の逆方向にカメラを配置しています。</span>  
つまり、キャラクターの背後にカメラが来るようになっています。

```
VECTOR back = VScale(playerDir, -TPS_DISTANCE);VECTOR camPos = VAdd(playerPos, back);camPos.y += TPS_HEIGHT;
```

<span style="white-space: pre-wrap;">カメラの高さは </span>`<span class="editor-theme-code">TPS_HEIGHT</span>`<span style="white-space: pre-wrap;">、キャラクターからの距離は </span>`<span class="editor-theme-code">TPS_DISTANCE</span>`<span style="white-space: pre-wrap;"> で調整しています。</span>

```
float TPS_DISTANCE = 8.0f;float TPS_HEIGHT   = 4.0f;
```

カメラは、プレイヤーの少し上あたりを見るように設定されています。

```
VECTOR target = VAdd(playerPos, VGet(0.0f, TPS_HEIGHT * 0.5f, 0.0f));SetCameraPositionAndTarget_UpVecY(camPos, target);
```

### TPSカメラサンプル動画

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" height="315" src="https://www.youtube.com/embed/GKnTGfPF0XU?si=hhVZjsAGT-cZIE94" title="YouTube video player" width="560"></iframe>

### TPSカメラでの操作感

TPSカメラでは、カメラがキャラクターの後ろに回り込むため、キャラクターの前方向が画面奥方向になりやすくなります。

そのため、`<span class="editor-theme-code">Wキー</span>`<span style="white-space: pre-wrap;"> を押したときに「画面の奥へ進む」ように見えます。</span>  
固定カメラよりも、プレイヤーの進行方向が直感的に分かりやすくなります。

ただし、このサンプルではカメラがマウス操作で自由に回る方式ではありません。  
キャラクターの向きに合わせてカメラが後ろへ回り込む形です。

### TPSカメラのメリット

TPSカメラは、キャラクターの進行方向と画面の見え方が一致しやすいため、アクションゲームで使いやすいカメラです。

- キャラクターの前方が見やすい
- 移動方向を把握しやすい
- プレイヤーと周囲の位置関係を見やすい
- 3Dアクションや探索ゲームに向いている

固定カメラと比べると、キャラクターを中心にした操作感になります。

---

## OTSカメラによるキャラクター移動

### OTSカメラとは

OTSカメラは、Over The Shoulder の略で、キャラクターの肩越しに見るカメラです。

TPSカメラと似ていますが、カメラがキャラクターの真後ろではなく、少し右側や左側にずれた位置に置かれます。  
このサンプルでは、プレイヤーの後ろに下がりつつ、右方向にオフセットした位置へカメラを配置しています。

```
VECTOR up = VGet(0.0f, 1.0f, 0.0f);VECTOR right = VNorm(VCross(playerDir, up));VECTOR camPos = playerPos;camPos = VAdd(camPos, VScale(playerDir, -OTS_DISTANCE));camPos = VAdd(camPos, VScale(right, OTS_RIGHT_OFFSET));camPos.y += OTS_HEIGHT;
```

OTSカメラ用の距離、高さ、横方向のずれは、次の値で設定しています。

```
float OTS_DISTANCE     = 5.0f;float OTS_HEIGHT       = 2.5f;float OTS_RIGHT_OFFSET = 2.0f;
```

### OTSカメラのサンプル

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" height="315" src="https://www.youtube.com/embed/sV5KZHQ82qk?si=CsKKrdsjErNt6jKI" title="YouTube video player" width="560"></iframe>

### 肩越し視点の作り方

<span style="white-space: pre-wrap;">OTSカメラでは、まずプレイヤーの進行方向 </span>`<span class="editor-theme-code">playerDir</span>`<span style="white-space: pre-wrap;"> から、右方向ベクトル </span>`<span class="editor-theme-code">right</span>`<span style="white-space: pre-wrap;"> を作っています。</span>

```
VECTOR right = VNorm(VCross(playerDir, up));
```

その後、カメラ位置を次のように調整しています。

1. プレイヤー位置を基準にする
2. プレイヤーの後ろに下げる
3. 右方向にずらす
4. 高さを加える

これにより、キャラクターの背後やや右側から見る「肩越し視点」になります。

さらに、注視点も少し左側にずらしています。  
これにより、キャラクターが画面の中央に完全に重なるのではなく、少し横に寄った構図になります。

```
VECTOR target = playerPos;target = VAdd(target, VScale(right, -OTS_RIGHT_OFFSET * 0.5f));target.y += OTS_HEIGHT * 0.5f;
```

### OTSカメラでの操作感

OTSカメラでは、キャラクターの近くから肩越しに前方を見るため、プレイヤーの視点に近い感覚になります。

TPSカメラよりもキャラクターに近いため、前方の対象物や敵を狙うようなゲームに向いています。

- シューティング
- アクション
- ホラーゲーム
- 近距離でキャラクターを見せたいゲーム

などでよく使われます。

一方で、カメラがキャラクターに近いため、周囲全体の状況はTPSカメラより少し見づらくなります。

---

## 3種類のカメラの比較

<table id="bkmrk-%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AE%E4%BD%8D%E7%BD%AE%E6%93%8D%E4%BD%9C%E6%84%9F%E5%90%91%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B2%E3%83%BC%E3%83%A0"><colgroup><col></col><col></col><col></col><col></col></colgroup><tbody><tr><th>カメラ

</th><th>カメラの位置

</th><th>操作感

</th><th>向いているゲーム

</th></tr><tr><td>固定カメラ

</td><td>常に固定位置

</td><td>ラジコン操作に近い

</td><td>パズル、見下ろし型、固定画面アクション

</td></tr><tr><td>TPSカメラ

</td><td>キャラクターの後ろ

</td><td>進行方向が分かりやすい

</td><td>3Dアクション、探索ゲーム

</td></tr><tr><td>OTSカメラ

</td><td>キャラクターの肩越し

</td><td>狙う・見る感覚が強い

</td><td>TPS、ホラー、アクションシューティング

</td></tr></tbody></table>

---

## プログラム全体の流れ

<span style="white-space: pre-wrap;">このサンプルでは、プレイヤーの </span>`<span class="editor-theme-code">Update()</span>`<span style="white-space: pre-wrap;"> の最後で、プレイヤーの現在位置 </span>`<span class="editor-theme-code">pos_</span>`<span style="white-space: pre-wrap;"> と進行方向 </span>`<span class="editor-theme-code">dir_</span>`<span style="white-space: pre-wrap;"> をカメラに渡しています。</span>

```
Camera::Update(pos_, dir_);
```

カメラ側では、その位置と向きを使って、現在のカメラモードに応じたカメラ位置を計算しています。

つまり、処理の流れは次のようになります。

1. キー入力を確認する
2. プレイヤーの回転角度を更新する
3. <span style="white-space: pre-wrap;">回転角度から進行方向 </span>`<span class="editor-theme-code">dir_</span>`<span style="white-space: pre-wrap;"> を作る</span>
4. `<span class="editor-theme-code">W</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">S</span>`<span style="white-space: pre-wrap;"> キーでプレイヤー位置を移動する</span>
5. プレイヤーの位置と向きをモデルに反映する
6. プレイヤーの位置と進行方向をカメラに渡す
7. カメラモードに応じてカメラ位置を更新する

---

## まとめ

固定カメラ、TPSカメラ、OTSカメラは、同じキャラクター移動を使っていても、プレイヤーに与える操作感が大きく変わります。固定カメラでは、カメラが動かないため、キャラクター自身の向きに合わせて操作するラジコン操作になります。TPSカメラでは、カメラがキャラクターの後ろに回り込むため、進行方向が分かりやすく、3Dアクション向きの操作感になります。OTSカメラでは、キャラクターの肩越しから見ることで、狙う・注視する感覚が強くなり、シューティングやホラーゲームのような演出に向いています。

<p class="callout info">おまけ</p>

## 固定カメラ＋固定方向（上下左右）移動＋なめらかな角度変化

ここまでの固定カメラでは、キャラクターの向きを基準にして前進・後退する「ラジコン操作」を説明しました。

このおまけでは、固定カメラ用の別操作として、****画面方向に対して固定された移動****を行います。

サンプルプログラムのURLは  
[https://github.com/youetsux/radioControllman2](https://github.com/youetsux/radioControllman2 "固定方向移動")

ラジコン操作では、

- `<span class="editor-theme-code">A</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">D</span>`<span style="white-space: pre-wrap;"> でキャラクターの向きを変える</span>
- `<span class="editor-theme-code">W</span>`<span style="white-space: pre-wrap;"> でキャラクターの向いている方向へ進む</span>
- `<span class="editor-theme-code">S</span>`<span style="white-space: pre-wrap;"> でキャラクターの後ろへ下がる</span>

という操作でした。

それに対して、固定方向移動では、

- `<span class="editor-theme-code">W</span>`：奥へ移動
- `<span class="editor-theme-code">S</span>`：手前へ移動
- `<span class="editor-theme-code">A</span>`：左へ移動
- `<span class="editor-theme-code">D</span>`：右へ移動

のように、キーと移動方向を固定します。

固定カメラの場合、カメラの位置が変わらないため、画面上の上下左右とワールド座標の前後左右を対応させやすくなります。

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" height="315" src="https://www.youtube.com/embed/c2bLJ5hDIKI?si=lrivtBicecaltv-3" title="YouTube video player" width="560"></iframe>

---

### 固定カメラのときだけ移動処理を切り替える

<span style="white-space: pre-wrap;">このサンプルでは、カメラモードが固定カメラのときだけ </span>`<span class="editor-theme-code">UpdateFixedCameraMove()</span>`<span style="white-space: pre-wrap;"> を使い、それ以外のカメラでは </span>`<span class="editor-theme-code">UpdateFreeCameraMove()</span>`<span style="white-space: pre-wrap;"> を使っています。</span>

```
if (Camera::GetMode() == CAMERA_FIXED){	UpdateFixedCameraMove(dt);}else{	UpdateFreeCameraMove(dt);}
```

これにより、固定カメラでは画面方向に合わせた移動、TPSカメラやOTSカメラではキャラクターの向きを基準にした移動、というように操作方法を分けています。

---

### ワールド固定の前後左右ベクトルを用意する

固定方向移動では、まずワールド空間での前方向と右方向を決めています。

```
const VECTOR forward = VGet(0.0f, 0.0f, 1.0f);const VECTOR right   = VGet(1.0f, 0.0f, 0.0f);
```

ここでは、

- `<span class="editor-theme-code">forward</span>`<span style="white-space: pre-wrap;"> がZ軸プラス方向</span>
- `<span class="editor-theme-code">right</span>`<span style="white-space: pre-wrap;"> がX軸プラス方向</span>

を表しています。

つまり、キャラクターが今どちらを向いているかに関係なく、`<span class="editor-theme-code">W</span>`<span style="white-space: pre-wrap;"> を押したらZ軸プラス方向、</span>`<span class="editor-theme-code">D</span>`<span style="white-space: pre-wrap;"> を押したらX軸プラス方向へ移動するようになります。</span>

---

### キー入力から移動方向を作る

<span style="white-space: pre-wrap;">次に、押されているキーに応じて移動方向 </span>`<span class="editor-theme-code">moveVec</span>`<span style="white-space: pre-wrap;"> を作ります。</span>

```
VECTOR moveVec = VGet(0.0f, 0.0f, 0.0f);if (Input::IsKeepKeyDown(KEY_INPUT_W)) moveVec = VAdd(moveVec, forward);if (Input::IsKeepKeyDown(KEY_INPUT_S)) moveVec = VAdd(moveVec, VScale(forward, -1.0f));if (Input::IsKeepKeyDown(KEY_INPUT_D)) moveVec = VAdd(moveVec, right);if (Input::IsKeepKeyDown(KEY_INPUT_A)) moveVec = VAdd(moveVec, VScale(right, -1.0f));
```

この処理では、押されたキーに対応する方向ベクトルを足し合わせています。

例えば、`<span class="editor-theme-code">W</span>`<span style="white-space: pre-wrap;"> と </span>`<span class="editor-theme-code">D</span>`<span style="white-space: pre-wrap;"> を同時に押した場合は、</span>

```
forward + right
```

となるため、右奥方向への移動になります。

---

### 斜め移動が速くならないように正規化する

`<span class="editor-theme-code">W</span>`<span style="white-space: pre-wrap;"> だけを押した場合、移動方向の長さは </span>`<span class="editor-theme-code">1</span>`<span style="white-space: pre-wrap;"> です。</span>

しかし、`<span class="editor-theme-code">W</span>`<span style="white-space: pre-wrap;"> と </span>`<span class="editor-theme-code">D</span>`<span style="white-space: pre-wrap;"> を同時に押した場合、移動方向は斜めになります。</span>  
このまま移動すると、斜め移動だけ距離が長くなり、移動速度が速くなってしまいます。

そこで、移動方向の長さを求めています。

```
float moveLen = sqrtf(moveVec.x * moveVec.x + moveVec.z * moveVec.z);if (moveLen < 0.0001f) return;VECTOR moveDir = VScale(moveVec, 1.0f / moveLen);
```

`<span class="editor-theme-code">moveLen</span>`<span style="white-space: pre-wrap;"> がほぼ0の場合は、何もキーが押されていない状態なので移動処理を終了します。</span>

キー入力がある場合は、`<span class="editor-theme-code">moveVec</span>`<span style="white-space: pre-wrap;"> を </span>`<span class="editor-theme-code">moveLen</span>`<span style="white-space: pre-wrap;"> で割って、長さ1のベクトルにしています。</span>  
これを****正規化****といいます。

正規化することで、上下左右に移動しても、斜めに移動しても、同じ速度で移動できます。

---

### 移動方向へキャラクターを向ける

固定方向移動では、キャラクターの向きで移動方向を決めるのではなく、入力された移動方向へキャラクターを向けます。

<span style="white-space: pre-wrap;">そのため、まず移動方向 </span>`<span class="editor-theme-code">moveDir</span>`<span style="white-space: pre-wrap;"> から目標のY軸回転角 </span>`<span class="editor-theme-code">targetRotY</span>`<span style="white-space: pre-wrap;"> を計算します。</span>

```
float targetRotY = DirectX::XMConvertToDegrees(atan2f(moveDir.x, moveDir.z));
```

`<span class="editor-theme-code">atan2f()</span>`<span style="white-space: pre-wrap;"> を使うことで、X方向とZ方向の成分から、キャラクターが向くべき角度を求めています。</span>

例えば、

<table id="bkmrk-%E5%85%A5%E5%8A%9B%E7%A7%BB%E5%8B%95%E6%96%B9%E5%90%91%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%E3%81%AE%E5%90%91%E3%81%8Dw%E5%A5%A5%E5%A5%A5%E3%82%92%E5%90%91"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>入力

</th><th>移動方向

</th><th>キャラクターの向き

</th></tr><tr><td>W

</td><td>奥

</td><td>奥を向く

</td></tr><tr><td>S

</td><td>手前

</td><td>手前を向く

</td></tr><tr><td>A

</td><td>左

</td><td>左を向く

</td></tr><tr><td>D

</td><td>右

</td><td>右を向く

</td></tr><tr><td>W + D

</td><td>右奥

</td><td>右奥を向く

</td></tr></tbody></table>

という動きになります。

### 急に向きを変えず、なめらかに回転させる

<span style="white-space: pre-wrap;">目標角度をそのまま </span>`<span class="editor-theme-code">rotY_</span>`<span style="white-space: pre-wrap;"> に代入すると、キャラクターの向きが一瞬で切り替わってしまいます。</span>

<span style="white-space: pre-wrap;">そこで、このサンプルでは現在の角度 </span>`<span class="editor-theme-code">rotY_</span>`<span style="white-space: pre-wrap;"> と目標角度 </span>`<span class="editor-theme-code">targetRotY</span>`<span style="white-space: pre-wrap;"> の差を求め、少しずつ回転するようにしています。</span>

```
float diff = targetRotY - rotY_;while (diff >  180.0f) diff -= 360.0f;while (diff < -180.0f) diff += 360.0f;float rotStep = rotYSpeed_ * dt;rotY_ += (fabsf(diff) < rotStep) ? diff : (diff > 0.0f ? rotStep : -rotStep);
```

<span style="white-space: pre-wrap;">角度の差が </span>`<span class="editor-theme-code">180度</span>`<span style="white-space: pre-wrap;"> を超える場合は、逆回りした方が近いことがあります。</span>  
そのため、`<span class="editor-theme-code">while</span>`<span style="white-space: pre-wrap;"> 文で角度差を </span>`<span class="editor-theme-code">-180度 ～ 180度</span>`<span style="white-space: pre-wrap;"> の範囲に収めています。</span>

<span style="white-space: pre-wrap;">その後、1フレームで回転できる量 </span>`<span class="editor-theme-code">rotStep</span>`<span style="white-space: pre-wrap;"> を使って、少しずつ目標方向へ回転します。</span>

これにより、キーを押した方向へキャラクターが自然に向き直るようになります。

---

### 実際に移動する

<span style="white-space: pre-wrap;">最後に、正規化した移動方向 </span>`<span class="editor-theme-code">moveDir</span>`<span style="white-space: pre-wrap;"> に速度とデルタタイムを掛けて、プレイヤーの位置に加算します。</span>

```
pos_ = VAdd(pos_, VScale(moveDir, speed_ * dt));dir_ = moveDir;
```

`<span class="editor-theme-code">pos_</span>`<span style="white-space: pre-wrap;"> がプレイヤーの位置です。</span>  
`<span class="editor-theme-code">moveDir</span>`<span style="white-space: pre-wrap;"> の方向へ </span>`<span class="editor-theme-code">speed_ * dt</span>`<span style="white-space: pre-wrap;"> 分だけ移動します。</span>

また、`<span class="editor-theme-code">dir_</span>`<span style="white-space: pre-wrap;"> にも </span>`<span class="editor-theme-code">moveDir</span>`<span style="white-space: pre-wrap;"> を入れています。</span>  
これは、カメラ更新時にプレイヤーの進行方向として使うためです。

<span style="white-space: pre-wrap;">プレイヤーの </span>`<span class="editor-theme-code">Update()</span>`<span style="white-space: pre-wrap;"> の最後では、現在位置 </span>`<span class="editor-theme-code">pos_</span>`<span style="white-space: pre-wrap;"> と進行方向 </span>`<span class="editor-theme-code">dir_</span>`<span style="white-space: pre-wrap;"> をカメラに渡しています。</span>

```
Camera::Update(pos_, dir_);
```

---

## ラジコン操作と固定方向移動の違い

<table id="bkmrk-%E6%93%8D%E4%BD%9C%E6%96%B9%E5%BC%8F%E7%A7%BB%E5%8B%95%E6%96%B9%E5%90%91%E3%81%AE%E5%9F%BA%E6%BA%96%E7%89%B9%E5%BE%B4%E3%83%A9%E3%82%B8%E3%82%B3%E3%83%B3%E6%93%8D%E4%BD%9C%E3%82%AD"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>操作方式

</th><th>移動方向の基準

</th><th>特徴

</th></tr><tr><td>ラジコン操作

</td><td>キャラクターの向き

</td><td>向きを変えてから前進する

</td></tr><tr><td>固定方向移動

</td><td>ワールド座標・画面方向

</td><td>押したキーの方向へ直接移動する

</td></tr></tbody></table>

ラジコン操作は、キャラクターを「操作している」感覚が強い方式です。  
一方、固定方向移動は、キャラクターを画面上で直接動かしている感覚に近い方式です。

固定カメラのゲームでは、カメラの向きが変わらないため、固定方向移動の方が直感的に操作しやすい場合があります。

ただし、カメラが回転するゲームで固定方向移動をそのまま使うと、画面方向と移動方向がずれて分かりにくくなることがあります。  
そのため、このサンプルでは固定カメラのときだけ固定方向移動を使い、TPSカメラやOTSカメラでは通常のキャラクター向き基準の移動に戻しています。