画面サイズに合わせた壁を自動で作成|Unityゲーム制作

今回はUnity2Dゲームで壁を作成していきます。固定で作成、スクリプトで作成、画面サイズに合わせて自動で作成。の3つを見ていきます。

はじめに

Unityのバージョンは2022.3.14f1です。(あまりバージョンは関係ないですが)

下記の続きとして作成していきますが、ゼロから作成でも問題ないです。あくまでも壁として機能しているのを確認するため、下記の続きとして作成しています。

作成開始

まずは「空オブジェクト」を追加、名前をWallとします。

「Line Renderer」を追加して、サイズや幅、マテリアルなどを変更して枠を作成します。

下記のように白い枠が出来ればOKです。

Projectフォルダ内に「2D」→「PhysicsMaterial 2D」を追加します。

名前をBounceに変更して、Bouncinessを1にします。

Wallに「EdgeCollider2D」を追加して、マテリアル、ポイントを変更します。

試しに動かしてみると下記の様な感じに。

スクリプトで作成

次にスクリプトで同じ壁を作成してみます。先ほどセットしたサイズをリセットしておきます。

下記のスクリプトを作成します。

using UnityEngine;

public class WallCreate : MonoBehaviour
{
    [SerializeField] private LineRenderer _lineRender;
    [SerializeField] private EdgeCollider2D _edgeCollider;
    [SerializeField] private Vector3 _leftTop, _leftBottom, _rightTop, _rightBottom;

    private void Awake()
    {
        Vector3[] linePositions = new Vector3[]
            { _leftTop, _leftBottom, _rightBottom, _rightTop, _leftTop };
        _lineRender.positionCount = linePositions.Length;
        _lineRender.SetPositions(linePositions);

        Vector2[] colliderPoints = new Vector2[5];

        colliderPoints[0] = new Vector2(_leftTop.x,_leftTop.y);
        colliderPoints[1] = new Vector2(_leftBottom.x,_leftBottom.y);
        colliderPoints[2] = new Vector2(_rightBottom.x,_rightBottom.y);
        colliderPoints[3] = new Vector2(_rightTop.x,_rightTop.y);
        colliderPoints[4] = new Vector2(_leftTop.x, _leftTop.y);

        _edgeCollider.points = colliderPoints;
    }
}

Wallオブジェクトにスクリプトをアタッチして、パラメータをセットします。

実行すると、同じような壁が作成されます。パラメータの値を変更すると壁の位置を簡単に変更することができます。

画面サイズに合わせて壁を作成

次に画面枠のサイズに合わせて、自動でサイズが変わる壁を作成してみます。

スクリプトを下記に変更します。

using UnityEngine;

public class WallCreate : MonoBehaviour
{
    [SerializeField] private LineRenderer _lineRender;
    [SerializeField] private EdgeCollider2D _edgeCollider;

    private void Awake()
    {
        Vector3 LeftTop = Camera.main.ScreenToWorldPoint(new Vector3(0, Screen.height, 0));
        Vector3 LeftBottom = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, 0));
        Vector3 RightBottom = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, 0, 0));
        Vector3 RightTop = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));
        LeftTop.z = LeftBottom.z = RightBottom.z = RightTop.z = 0;

        Vector3[] linePositions = new Vector3[]
            { LeftTop, LeftBottom, RightBottom, RightTop, LeftTop };
        _lineRender.positionCount = linePositions.Length;
        _lineRender.SetPositions(linePositions);


        Vector2[] colliderPoints = new Vector2[5];

        colliderPoints[0] = new Vector2(LeftTop.x, LeftTop.y);
        colliderPoints[1] = new Vector2(LeftBottom.x, LeftBottom.y);
        colliderPoints[2] = new Vector2(RightBottom.x, RightBottom.y);
        colliderPoints[3] = new Vector2(RightTop.x, RightTop.y);
        colliderPoints[4] = new Vector2(LeftTop.x, LeftTop.y);

        _edgeCollider.points = colliderPoints;
    }
}

画面サイズに沿って壁が作成されます。

タイトルとURLをコピーしました