UnityUnityメモ

Unityでキャラクターの画面外への移動を防ぐ方法|初心者向け2Dゲーム開発ガイド 

Unity

はじめに

こんにちは、Unityでゲーム開発を楽しんでいるみなさん!
ゲームを作っていると、「キャラクターが画面外に出ちゃった!」という経験、ありませんか?特に2Dゲームでは、キャラクターの動きを制御するのがとても大切です。画面の外に出てしまうと、プレイヤーが操作しづらくなったり、ゲームの楽しさが損なわれる原因になりますよね。

そこで今回は、Unityでキャラクターを画面内に収める方法を一緒に学んでいきましょう!必要なのは少しのスクリプトだけなので、初心者の方でも安心してチャレンジできます。この記事を読めば、キャラクターの移動範囲を簡単に制御できるようになりますよ。

準備ができたら、さっそく始めましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!



1. プロジェクトの準備

2Dプロジェクトを開いたらまずは、Unityでプレイヤーオブジェクトを作成します。

プレイヤーの配置

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックし、「2D Object」→「Sprite」を選びます。
  2. 作成されたスプライトオブジェクトを「Player」と名前を変更します。
  3. インスペクター(Inspector)ウィンドウでスプライトレンダラー(Sprite Renderer)コンポーネントを見つけ、スプライトを設定します(任意の画像を使用できます)。



2. スクリプトを作成する

次に、プレイヤーの動きを制御するスクリプトを作成します。

  1. プロジェクトウィンドウを右クリック「Create」→「C#Script」を選択し、PlayerMoveと名前を付けます。
  2. スクリプトを開き、以下のコードを入力します。

using

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
  • これはUnityでスクリプトを書くときに最初に出てくるお約束みたいな部分です。
  • **UnityEngine**を使うことで、ゲームオブジェクトを動かしたり、キー入力を受け取ったりできます。

[SerializeField] float speed;

[SerializeField] float speed;
  • **speed**はプレイヤーの移動スピードを調整するための変数です。
  • [SerializeField]をつけることで、この変数をUnityのインスペクターで設定できるようになります。
  • たとえば、Unityエディタでこのスクリプトがついたオブジェクトを選択すると、speedの値を変更できます。ゲーム中に速さを調整したいときに便利です。

void Update()

void Update()
  • **Update()**は、Unityが毎フレーム(1秒間に数十回)自動で呼び出す関数です。
  • この中に書かれたコードは、常に動いていると考えてください。プレイヤーの操作をチェックするのに使います。

移動の計算

float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float moveY = Input.GetAxis("Vertical") * Time.deltaTime * speed;
  • ここでは、プレイヤーが矢印キーやゲームパッドで入力した値を受け取っています。
    • **Input.GetAxis("Horizontal")**は「左右の入力」。
    • **Input.GetAxis("Vertical")**は「上下の入力」。
  • 入力の値に**speedTime.deltaTime**を掛けています。
    • **Time.deltaTime**は、前のフレームから今のフレームまでにかかった時間を表しています。これを掛けることで、スムーズで安定した動きを実現しています。

移動範囲を制限

transform.position = new Vector2(
Mathf.Clamp(transform.position.x + moveX, -7.0f, 7.0f),
Mathf.Clamp(transform.position.y + moveY, -4.5f, 4.5f)
);
  • **transform.position**で、オブジェクトの現在位置を指定しています。
  • 新しい位置を**Vector2**(X座標とY座標)として計算します。
  • **Mathf.Clamp**は、数値を特定の範囲内に収めるための便利な関数です。
    • たとえば、**Mathf.Clamp(x, -7.0f, 7.0f)**は、xの値を「-7.0」から「7.0」の範囲内に制限します。
  • このコードでは、プレイヤーが画面外に出ないように範囲を指定しています。
    • X軸の範囲:-7.0 ~ 7.0
    • Y軸の範囲:-4.5 ~ 4.5

全体の流れ

  1. 毎フレーム、**Update()**が呼び出されます。
  2. プレイヤーの入力を受け取り、どれだけ移動するか計算します。
  3. 新しい位置を計算し、画面の範囲内に収めます。
  4. プレイヤーの位置を更新します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    [SerializeField] float speed;

    void Update()
    {
        float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
        float moveY = Input.GetAxis("Vertical") * Time.deltaTime * speed;

        transform.position = new Vector2(
            //移動範囲を制限する
            Mathf.Clamp(transform.position.x + moveX, -7.0f, 7.0f),
            Mathf.Clamp(transform.position.y + moveY, -4.5f, 4.5f)
            );
    }
}

スクリプトをアタッチする

  1. Playerオブジェクトをヒエラルキーで選択します。
  2. 作成したPlayerControllerスクリプトをドラッグ&ドロップして、インスペクターウィンドウのPlayerオブジェクトにアタッチします。



4. テストプレイする

以上の設定が完了したら、再生ボタンをクリックしてゲームをプレイしてみましょう。プレイヤーキャラクターが画面の端からはみ出さないことを確認してください。

これで、プレイヤーキャラクターが画面外に出ないようにする方法を学びました!簡単にできますので、ぜひ自分のゲームに取り入れてみてください。質問や不明な点があれば、コメントで教えてくださいね。それでは、楽しいゲーム開発を!

おすすめのアセット

2Dシューティングゲームに興味がある方は、Unity Asset Storeにある2D Plane Shooting Game Sampleもおすすめです!このアセットには、今回学んだようなキャラクター移動や制御の実践例が含まれており、学びながら使える便利なテンプレートです。これを活用すれば、さらに効率よくゲームを開発できますよ。

ゲーム作りを楽しみながら、少しずつスキルを磨いていきましょう!✨

よくある質問

Q
プロジェクトウィンドウを右クリック「Create」→「C#Script」を選択し、PlayerMoveと名前を付けます。
A

Mathf.Clampの範囲を画面サイズに応じて動的に設定する方法を検討してください。Camera.mainを使って画面サイズを取得するのが便利です。

Q
キャラクターが移動しません。
A

スクリプトがアタッチされているか、Speedが0になっていないか確認してください。

Q
このスクリプトは3Dゲームでも使えますか?
A

基本的には2Dゲーム用ですが、3DでもVector3を使えば似たように制御できます。