Skip to main content

パドル(Player)の移動

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

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

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

スクリプトの変数

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] は不要で、プログラムの中で代入する予定。

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

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

  • Unityで編集するメンバー変数小文字で始まる。
// 速度
[SerializeField]
private float speed;

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

// ステージの名前
[SerializeField]
private string stageName;
  • クラス内部に使う private メンバー変数アンダーバーで始まる。
// 現在の体力
private float _nowHP;

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

// アイテムの位置
private Vector3 _itemPosition;
  • 公開された public メンバー変数大文字で始まる。
// コインの数
public int Coins;

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

// 現在の体力
public string NowHP
{
  get { return _nowHP; }
  set { _nowHP = Mathf.Clamp(value, 0, _maxHP); }
}
  • 上記以外の変数はいつも小文字で始まる。
// 引数の変数は:小文字
private int Sum (int a, int b)
{
  // 内部で使う変数も小文字
  int c = a + b;
  return c;
}
  • メソッドはいつも大文字で始まる。
// 攻撃する
public void Attack()
{
}

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

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

初期化 - Start()

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

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

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

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

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

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

試してみましょう!

スプライトを Player にアタッチし、右キーと左キーを設定の上、速度を設定してください。そして、ゲーム開始して、動くかどうかを確認してください。

image.png