プレイヤー機の定量移動

スポンサーリンク

スクリプトの作成

プレイヤー機を操作するスクリプトを作成します。
スクリプトの名前は「PlayerCon」です。
「PlayerCon」の中身を説明します。
・プレイヤー機の移動は左右だけです。
・移動は矢印キーの左右で行っています。
・移動出来る範囲は、左-5.5、右は5.5です。
・プレイヤー機の移動速度は「MOVE_SPEED」で定義しています。
・一度のキー入力でプレイヤー機は一定量移動します。その移動量を定数「MOVE_VALUE」で定義しています。
・一度のキー入力で一定量の移動をすることで、スムーズな操作感となります。

「PlayerCon.cs」

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCon : MonoBehaviour
{
    private const float MOVE_SPEED = 0.04f;//プレイヤー機移動速度
    private const float MOVE_VALUE = 0.5f;//プレイヤー機の移動量
    private const int START_POS_X = 0;//初期のX座標
    private const int START_POS_Y = 0;//初期のY座標

    //(操作)移動したいオブジェクトを設定
    [SerializeField] GameObject p_obPlayer;

    //移動中フラグ
    private bool p_bMoveF;
    private int p_iMoveCn;
    private int p_iMaxMoveCn;
    private int p_iInvX;
    private int p_iInvY;

    private float p_fMoveSpeed;
    private float p_fWkMoveX;
    private float p_fWkMoveY;

    private int p_iPlayerKey;

    // Start is called before the first frame update
    void Start()
    {
        p_fMoveSpeed = MOVE_SPEED;

        //移動中フラグ
        p_bMoveF = false;
        p_iMoveCn = 0;
        p_iMaxMoveCn = Mathf.CeilToInt(MOVE_VALUE / p_fMoveSpeed);
        p_fWkMoveX = 0;
        p_fWkMoveY = 0;
        p_iInvX = 1;
        p_iInvY = 1;

        // 座標を取得
        Vector3 pos = p_obPlayer.transform.position;
        pos.x = START_POS_X;
        pos.y = START_POS_Y;
        pos.z = 0f;

        // 座標を設定
        p_obPlayer.transform.position = pos;
    }

    void Update()
    {
        Vector3 pos = transform.position;

        if (p_bMoveF != true) {
            if ((Input.GetKey("right")) && pos.x < 5.5) {
                p_iInvX = 1;
                p_iInvY = 0;
                p_fWkMoveX = transform.position.x + p_fMoveSpeed;
                p_fWkMoveY = transform.position.y;
                p_bMoveF = true;
            }
            if ((Input.GetKey("left")) && pos.x > -5.5) {
                p_iInvX = -1;
                p_iInvY = 0;
                p_fWkMoveX = transform.position.x - p_fMoveSpeed;
                p_fWkMoveY = transform.position.y;
                p_bMoveF = true;
            }
        }

        if (p_bMoveF == true) {
            //移動
            transform.position = new Vector3 (p_fWkMoveX, p_fWkMoveY, pos.z);
            //次の移動
            p_fWkMoveX = transform.position.x + p_fMoveSpeed * p_iInvX;
            p_fWkMoveY = transform.position.y + p_fMoveSpeed * p_iInvY;

            p_iMoveCn = p_iMoveCn + 1;
            if (p_iMoveCn > p_iMaxMoveCn) 
            {
            //移動の最後に座標の調整
                p_iMoveCn = 0;
                p_bMoveF = false;

                if (p_iInvX == 1) {
                    p_fWkMoveX = p_fWkMoveX / MOVE_VALUE;
                    p_fWkMoveX = Mathf.Floor(p_fWkMoveX) * 0.5f;
                } else if (p_iInvX == -1){
                    p_fWkMoveX = p_fWkMoveX / MOVE_VALUE;
                    p_fWkMoveX = Mathf.Ceil(p_fWkMoveX) * 0.5f;
                }
                if (p_iInvY == 1) {
                    p_fWkMoveY = p_fWkMoveY / MOVE_VALUE;
                    p_fWkMoveY = Mathf.Floor(p_fWkMoveY) * 0.5f;
                } else if (p_iInvY == -1) {
                    p_fWkMoveY = p_fWkMoveY / MOVE_VALUE;
                    p_fWkMoveY = Mathf.Ceil(p_fWkMoveY) * 0.5f;
                }
                transform.position = new Vector3 (p_fWkMoveX, p_fWkMoveY, pos.z);
            }
        }
    }
}

オブジェクトへスクリプトの設定


オブジェクト「Main Camera」の「Inspecter」タブ内のsizeを調整しましょう。とりあえずは「5」で丁度良いと思います。

スポンサーリンク
スポンサーリンク
ImagineWave