ゲームを作った話
少し前にunityroomの企画unity1weekで
ボールをハンマー投げのように回して
投げるゲームを作りました。
(作ったゲームはこちら)
このゲームを作った時に
Sptiteの大きさを取得して
そのSpriteからボールの持ち手が
出られないようにする処理を作りました。
具体的には次の画像を見てください。
緑色の枠が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から出ないようになりました。
白いSpriteの位置と大きさを変えても
自動で制限がかかるので
いちいち設定を変えなくて済みます。
今回マウスの位置を制限しましたが、
キャラクターの制限もできると思います。
あと微妙にはみ出しているところは
Mathf.Clampで指定する時に
最小値に数値を足し
最大値から数値を引くと
はみ出なくなります。