UnityでのキャラクターX軸移動制限

2024年9月19日

UnityでキャラクターのX軸の移動を特定の範囲内に制限する方法を学び、ゲームプレイ中にキャラクターが画面外に出ないように制御します。この資料では、既存のコードに制限を追加する具体的な方法についても触れます。

背景

キャラクターが画面外に出てしまうと、ゲームプレイのバランスが崩れる場合があります。そのため、キャラクターが動ける範囲を制限することが重要です。この資料では、キャラクターのX軸移動を制限するための簡単なスクリプトの実装と、既存のプロジェクトに移動制限を追加する方法を紹介します。


ステップ1: 基本的なX軸の移動制限スクリプト

以下のコードは、キャラクターが minX と maxX の範囲内でしか移動できないように制限するサンプルです。

using UnityEngine;

public class CharacterController : MonoBehaviour
{
    public float speed = 5f;  // キャラクターの移動速度
    public float minX = -5f;  // X軸の最小値
    public float maxX = 5f;   // X軸の最大値

    void Update()
    {
        // 左右の入力を取得
        float moveInput = Input.GetAxis("Horizontal");

        // 現在のポジションを取得
        Vector3 position = transform.position;

        // X軸方向の移動
        position.x += moveInput * speed * Time.deltaTime;

        // X軸の移動制限
        position.x = Mathf.Clamp(position.x, minX, maxX);

        // ポジションを更新
        transform.position = position;
    }
}

スクリプト説明

  • minX と maxX を用いて、キャラクターのX軸の移動範囲を指定します。
  • Mathf.Clamp 関数で、X座標が設定された範囲を超えないようにします。

ステップ2: 既存コードにX軸移動制限を追加する

既存のコードサンプル

既にキャラクターの左右移動やジャンプを実装しているプロジェクトに、X軸の移動制限を追加する手順です。例えば、以下のようなコードがある場合:

void Update()
{
    // ジャンプする
    if (Input.GetKeyDown(KeyCode.Space) && this.rigid2D.velocity.y == 0)
    {
        this.animator.SetTrigger("JumpTrigger");
        this.rigid2D.AddForce(transform.up * this.jumpForce);
    }

    // 左右移動
    int key = 0;
    if (Input.GetKey(KeyCode.RightArrow)) key = 1;
    if (Input.GetKey(KeyCode.LeftArrow)) key = -1;

    // スピード制限
    float speedx = Mathf.Abs(this.rigid2D.velocity.x);
    if (speedx < this.maxWalkSpeed)
    {
        this.rigid2D.AddForce(transform.right * key * this.walkForce);
    }

    // X軸の移動制限を追加
    Vector3 position = transform.position;
    position.x = Mathf.Clamp(position.x, minX, maxX);
    transform.position = position;
}

追加された部分

  1. minX と maxX を宣言し、X軸の移動範囲を設定します。
  2. Mathf.Clamp を使用して、キャラクターのX軸の位置が設定範囲を超えないように制御します。

完全なコードサンプル

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

public class PlayerController : MonoBehaviour
{
    Rigidbody2D rigid2D;
    Animator animator;
    float jumpForce = 680.0f;
    float walkForce = 30.0f;
    float maxWalkSpeed = 2.0f;

    // 移動制限のためのX軸の最小・最大値
    float minX = -5.0f;  // X軸の最小値
    float maxX = 5.0f;   // X軸の最大値

    void Start()
    {
        Application.targetFrameRate = 60;
        this.rigid2D = GetComponent<Rigidbody2D>();
        this.animator = GetComponent<Animator>();
    }
    
    void Update()
    {
        // ジャンプする
        if (Input.GetKeyDown(KeyCode.Space) && this.rigid2D.velocity.y == 0)
        {
            this.animator.SetTrigger("JumpTrigger");
            this.rigid2D.AddForce(transform.up * this.jumpForce);
        }

        // 左右移動
        int key = 0;
        if (Input.GetKey(KeyCode.RightArrow)) key = 1;
        if (Input.GetKey(KeyCode.LeftArrow)) key = -1;

        // プレイヤーの速度
        float speedx = Mathf.Abs(this.rigid2D.velocity.x);

        // スピード制限
        if (speedx < this.maxWalkSpeed)
        {
            this.rigid2D.AddForce(transform.right * key * this.walkForce);
        }

        // X軸の移動範囲を制限する
        Vector3 position = transform.position;
        position.x = Mathf.Clamp(position.x, minX, maxX);
        transform.position = position;

        // 画面外に出た場合は最初から
        if (transform.position.y < -10)
        {
            SceneManager.LoadScene("GameScene");
        }
    }

    // ゴールに到達
    void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("ゴール");
        SceneManager.LoadScene("ClearScene");
    }
}

結論

この技術資料では、UnityでキャラクターのX軸の移動を特定の範囲内に制限する方法を紹介しました。既存のコードに制限を追加する際は、Mathf.Clamp を活用して簡単に実装できます。この方法を他の移動制限やゲームの調整にも応用することが可能です。


これで、移動制限を追加したキャラクター制御が完成です。次のステップでは、より複雑な移動制限や他の軸方向への制限にも応用できます。

Unity

Posted by hidepon