今回はUnityで「1マスずつ移動する方法」の実装メモです。
キー入力で、あらかじめ決められた距離(1マス)を移動する感じです。一昔前のトップダウン式の2DRPG・シミュレーション系のゲームはほぼこのような動きをしますね。
はじめに
Unityのインストール方法・日本語化は下記から。
Unityのヴァージョン
今回使用するのは「Unity 2020.3.21f1」ヴァージョン。2Dで作成していきます。
プロジェクト名を適当に入力して「作成」

作成開始
さっそく作成していきます。アセットストアから色々持ってきた方が早く作成できますが、今回はゼロベースで動きを理解しながら実装していきます。
事前準備
まずはマス目となる画像を適当にペイントで作成。
サイズは32px×32px。背景をねずみ色にして、適当に枠線を引いた感じです。無しでも良いですが、あった方が動きの確認がしやすいです。

この画像をImagesフォルダを作成して入れておきます。

床の作成
空のオブジェクトを作成、名前をGroundsにします。

配下にgroundの空のオブジェクトを追加、コンポーネントを追加から、「スプライトレンダラー」を追加。

スプライトに作成したground画像をセットして、プレハブ化しておきます。

プレハブを複製して、縦と横に適当に並べます。

一旦、下記の様な感じに5個並べます。
タイルを使って全体にセットする方法もありますが、今回は「移動」を軸に置いてるのでマス移動が分かる感じでOK。

プレイヤーの作成
次にプレイヤー(動かすもの)をセット。2Dオブジェクトから「スプライト」の「円」を追加。

名前をPlayerにして、色は分かりやすく赤色にしておきます。

PlayerMoveと言う名前でスクリプトを作成して、Playerにくっつけます。

スクリプトの中身は下記に変更。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { [SerializeField] private float speed; private float distance; private Vector2 move; private Vector3 targetPos; private void Start() { distance = 1.6f; targetPos = transform.position; } void Update() { move.x = Input.GetAxisRaw("Horizontal"); move.y = Input.GetAxisRaw("Vertical"); // if (move != Vector2.zero && Vector3.Distance(transform.position, targetPos) < 0.5f) if (move != Vector2.zero && transform.position == targetPos) { targetPos += new Vector3(move.x * distance, move.y * distance, 0); } Move(targetPos); } private void Move(Vector3 targetPosition) { transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime); } }
簡単に説明すると、distanceはマスの間隔。1マスが大きい場合はこの数値が大きくなり、小さい場合は小さくなります。
targetPosは移動先となる位置をセットする変数です。初期はオブジェクトの位置、キー操作で位置情報を変更します。
Input.GetAxisRaw(“Horizontal”)、Input.GetAxisRaw(“Vertical”)は上下左右が入力されたときに±1がセットされます。
Vector3.MoveTowardsで移動元、移動先、移動速度をセットすると、セットした移動速度で移動していきます。

試しに動かしてみて1マスづつ動けばOK。
コメント部分は下の行と入れ替えると、先行入力を受け付ける感じに。