# パドル（Player）の移動

パドルが左右に移動できるようにしましょう。このスクリプトを使って：

- 左キーと右キーがInspectorで設定できるようにしたい。
- 速度もInspectorで調整できるようにしたい。
- 右か左キーを押したら、設定した速度をリジッドボディに与える（`Rigidbody2D.linearVelocity`）

Scripts フォルダーの中に、新しいスクリプト「PlayerMove」を作成し、上記の機能を実装してみましょう。

## スクリプトの変数

```c#
using UnityEngine;

// パドルを移動するスクリプト
public class PlayerMove : MonoBehaviour
{
    // 速度をInspectorで設定
    [SerializeField]
    private float speed;

    // 左へ移動するキーをInspectorで設定
    [SerializeField]
    private KeyCode leftKey;

    // 右へ移動するキーをInspectorで設定
    [SerializeField]
    private KeyCode rightKey;

    // 物理的動かすためのリジッドボディ
    private Rigidbody2D _rigidbody;
}
```

これで新しい `PlayerMove` のスクリプトを作成し、必要なデータ（変数）を準備ができた。Inspectorで編集するべきの変数に `[SerializeField]` を頭につけ、アクセス修飾子は `private` であっても、Unityで見えるようになる。

リジッドボディは `Start()` で取得するため、`[SerializeField]` は不要で、プログラムの中で代入する予定。

<details id="bkmrk-%E5%A4%89%E6%95%B0%E3%81%AE%E5%85%88%E9%A0%AD%E3%81%AB%E3%81%A4%E3%81%91%E3%82%8B%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-"><summary>変数の先頭につけるアンダーバーについて</summary>

##### 変数の先頭につけるアンダーバーについて

固いルールではないが、開発者の「いいマナー」としてのルールであり、変数名を見るだけで、アクセス権限がわかるためのものである。

- <span style="color: rgb(22, 145, 121);">Unityで編集</span>する<span style="color: rgb(224, 62, 45);">メンバー変数</span>：<span style="color: rgb(35, 111, 161);">小文字</span>で始まる。

```c#
// 速度
[SerializeField]
private float speed;

// 最大体力
[SerializeField]
private int maxHP;

// ステージの名前
[SerializeField]
private string stageName;
```

- クラス内部に使う <span style="color: rgb(22, 145, 121);">`private` </span>の<span style="color: rgb(224, 62, 45);">メンバー変数</span>：<span style="color: rgb(35, 111, 161);">アンダーバー</span>で始まる。

```c#
// 現在の体力
private float _nowHP;

// リジッドボディコンポーネントの参照
private Rigidbody2D _rigidBody;

// アイテムの位置
private Vector3 _itemPosition;
```

- 公開された <span style="color: rgb(22, 145, 121);">`public`</span> <span style="color: rgb(224, 62, 45);">メンバー変数</span>：<span style="color: rgb(35, 111, 161);">大文字</span>で始まる。

```c#
// コインの数
public int Coins;

// 最大体力（読み込み専用）
public int MaxHP {
  get { return _maxHP; }
}

// 現在の体力
public string NowHP
{
  get { return _nowHP; }
  set { _nowHP = Mathf.Clamp(value, 0, _maxHP); }
}
```

- 上記<span style="color: rgb(224, 62, 45);">以外の変数</span>はいつも<span style="color: rgb(35, 111, 161);">小文字</span>で始まる。

```c#
// 引数の変数は：小文字
private int Sum (int a, int b)
{
  // 内部で使う変数も小文字
  int c = a + b;
  return c;
}
```

- <span style="color: rgb(224, 62, 45);">メソッド</span>はいつも<span style="color: rgb(35, 111, 161);">大文字</span>で始まる。

```c#
// 攻撃する
public void Attack()
{
}

// ゲームオーバーになったかを確認
private void IsGameOver()
{
}

// フレーム毎の処理 
private void Update()
{
}
```

</details>## 初期化 - `Start()`

パドルの初期化はほとんどなく、あくまで、リジッドボディの参照を取得しておきたい。このスクリプトはパドルにアタッチするべきなので、`GetComponent` で簡単に取れる。`PlayerMove` クラスに以下のメソッドを追加してください

```c#
private void Start()
{
    _rigidbody = GetComponent<Rigidbody2D>();
}
```

## フレームごとの更新 - `Update()`

フレームごとに、右か左のキーが押されたかどうかを確認し、押されていたら、その向きに移動する。一方、キーが押されていなかったら、パドルを止める（速度をゼロにする）

`PlayerMove` クラスに以下のメソッドを追加してください：

```c#
private void Update()
{
    // 前提として速度はゼロにする。
    var velocity = Vector2.zero;

    // ただし、左キーが押されたら
    if (Input.GetKey(leftKey))
    {
        // x軸の速度を左の方（マイナス軸）にする
        velocity.x = -speed;
    }

    // 右のキーが押されたら
    if (Input.GetKey(rightKey))
    {
        // x軸の速度を右の方（プラス軸）にする
        velocity.x = speed;
    }

    // 最後に、計算した速度をリジッドボディに与える
    _rigidbody.linearVelocity = velocity;
}
```

## 試してみましょう！

<table border="1" id="bkmrk-%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%88%E3%82%92-player-%E3%81%AB%E3%82%A2%E3%82%BF%E3%83%83%E3%83%81%E3%81%97" style="border-collapse: collapse; width: 100%; border-width: 0px;"><colgroup><col style="width: 61.2439%;"></col><col style="width: 38.7144%;"></col></colgroup><tbody><tr><td style="border-width: 0px;">スプライトを Player にアタッチし、右キーと左キーを設定の上、速度を設定してください。そして、ゲーム開始して、動くかどうかを確認してください。

</td><td style="border-width: 0px;">[![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/jxXimage.png)](https://class.illogic.games/uploads/images/gallery/2026-04/jxXimage.png)

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