プレイヤー機の定量移動
スクリプトの作成
プレイヤー機を操作するスクリプトを作成します。
スクリプトの名前は「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」で丁度良いと思います。