Meiryo’s blog

やってみて詰まったことを備忘録として残すブログ

【Unity】画像(Sprite)の大きさを自動で習得して移動範囲を制限する

ゲームを作った話

少し前にunityroomの企画unity1weekで
ボールをハンマー投げのように回して
投げるゲームを作りました。
(作ったゲームはこちら)
f:id:meimaru:20210405011941g:plain

このゲームを作った時に
Sptiteの大きさを取得して
そのSpriteからボールの持ち手が
出られないようにする処理を作りました。

具体的には次の画像を見てください。
f:id:meimaru:20210517072204p:plain 緑色の枠がSpriteで、
持ち手はこの枠から出られません。

この枠を移動したり大きさを変えたりすると
移動範囲の値を変えなければ
いけなかったのですがそこを自動化したので
やり方を記載します。

Spriteの大きさを取得する

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

public class RestrictedMovementZone : MonoBehaviour
{
    public float XMin { get; private set; }
    public float XMax { get; private set; }
    public float YMin { get; private set; }
    public float YMax { get; private set; }

    private SpriteRenderer SpriteRenderer { get; set; }

    void Start()
    {
        SpriteRenderer = GetComponent<SpriteRenderer>();

        XMin = SpriteRenderer.bounds.min.x;
        XMax = SpriteRenderer.bounds.max.x;
        YMin = SpriteRenderer.bounds.min.y;
        YMax = SpriteRenderer.bounds.max.y;
    }
}

画像の大きさを取得するには
Renderer.Boundsを使います。

移動範囲を制限する

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

public class MoveSquare : MonoBehaviour
{
    [SerializeField]
    private RestrictedMovementZone restrictedMovementZone;
    
    private void Update()
    {
        transform.position = GetMousePosition();
    }

    public Vector2 GetMousePosition()
    {
        Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mousePos.x = Mathf.Clamp(mousePos.x, restrictedMovementZone.XMin, restrictedMovementZone.XMax);
        mousePos.y = Mathf.Clamp(mousePos.y, restrictedMovementZone.YMin, restrictedMovementZone.YMax);
        return new Vector2(mousePos.x, mousePos.y);
    }
}

先程のスクリプトで取得した
画像の大きさをMathf.Clamp
それぞれ指定し、
移動範囲の制限をかけています。

実行結果

白いSpriteに1つめのスクリプトを、
黒いSptiteに2つめのスクリプト
つけています。
動かした結果、黒いSpriteが
白いSpriteから出ないようになりました。

f:id:meimaru:20210517083822g:plain
白いSpriteの位置と大きさを変えても
自動で制限がかかるので
いちいち設定を変えなくて済みます。
f:id:meimaru:20210517085110g:plain

今回マウスの位置を制限しましたが、
キャラクターの制限もできると思います。

あと微妙にはみ出しているところは
Mathf.Clampで指定する時に
最小値に数値を足し
最大値から数値を引くと
はみ出なくなります。