はとの豆知識

Unityを中心に手っ取り早い機能の実装を紹介します。

【Unity】「Mathf.Clamp」で画像、背景の上のみ動けるよう移動範囲を制限してみる

以前このような記事を書きました。

hatohatter.com

今回は決められた画像や背景の上でのみ移動できるよう制限してみます。

手っ取り早い実装方法

    //移動速度
    private float moveSpeed = 4f;

    //回転
    private readonly float rotateSpeed = 150f;
    private Vector3 rotasionVector = new Vector3(0, 0, 1);

    //移動制限処理用変数
    private Vector2 playerPos;
    private float playerPosXClamp = 3.0f;
    private float playerPosYClamp = 3.0f;

    //親オブジェクトのSpriteRenderer
    private SpriteRenderer parent;

    private void Start()
    {
        /*移動できる範囲を設定する*/
        this.SetClamp();
    }

    /*確認用にプレイヤーが前に進む処理と回転する処理を記述*/
    private void Update()
    {
        ////前進処理
        transform.Translate(Vector3.up * this.moveSpeed * Time.deltaTime);
        // 移動制限処理
        this.MovingRestrictions();

        //回転処理
        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Rotate(rotasionVector * this.rotateSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.RightArrow))/// rotateSpeedに-を付けて逆回転
            transform.Rotate(rotasionVector * -this.rotateSpeed * Time.deltaTime);
    }

    /*移動できる範囲を設定する*/
    private void SetClamp()
    {
        //親のSpriteRendererコンポーネントを取得
        this.parent = gameObject.transform.parent.gameObject.GetComponent<SpriteRenderer>();

        //float型の変数に親の画像の端の位置を設定
        playerPosXClamp = this.parent.sprite.bounds.extents.x;
        playerPosYClamp = this.parent.sprite.bounds.extents.y;
    }

    /*移動制限*/
    private void MovingRestrictions()
    {
        //変数に自分の今の位置を入れる ※PositionではなくlocalPositionなので注意
        this.playerPos = transform.localPosition;

        //playerPos変数のxとyに制限した値を入れる
        //playerPos.xという値を-playerPosXClamp~playerPosXClampの間に収める
        this.playerPos.x = Mathf.Clamp(this.playerPos.x, -this.playerPosXClamp, this.playerPosXClamp);
        this.playerPos.y = Mathf.Clamp(this.playerPos.y, -this.playerPosYClamp, this.playerPosYClamp);

        //※PositionではなくlocalPositionなので注意
        transform.localPosition = new Vector2(this.playerPos.x, this.playerPos.y);
    }

f:id:HatoHatter:20210712022802p:plain

背景の上でのみ移動できるようになっていますね。