【Unity】2Dシューティングを作る ~カメラ外に移動させない~

Unityで画面外の移動制御 unity

プレイするゲームがないなら、自分で作ればいいじゃない!

ということで Unity 初心者が「ゲームを作る」ゲームをやっていきます!

今回は「自機をカメラの外に移動させないようにする」の記事です

 

スポンサーリンク

内容

プレイヤーの移動をカメラの表示範囲内におさめる

 

対応方法を考える

パっと思いついたのは

・コライダーを用意してコリジョンで対応する

・エディタ上で移動の限界値を確認して、その値で制御する

・カメラの表示範囲を取得して、その値で制御する

今回は「カメラの表示範囲を取得して、その値で制御する」でやってみます!

 

カメラの値にした理由

他の2つはカメラのサイズが変更された場合

その都度修正が必要になると思ったからです

※絶対に変更がないのであれば、エディタで確認した値で制御する方が簡単

 

カメラの範囲を取得

スクリプトでカメラの表示範囲を取得します

Vector3 pointLB = Camera.main.ScreenToWorldPoint(Vector3.zero);
Vector3 pointRU = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width - 1, Screen.height - 1, 0));

 

Camera.ScreenToWorldPoint(Vector3 position)

画面の位置(position)からワールド座標を返す

画面の左下端は (0,0)で右上端は (pixelWidth -1,pixelHeight -1)

今回は Camera.main なので、メインカメラの端の座標を調べている

スポンサーリンク

プレイヤーの移動処理を修正

あとは移動処理をしているスクリプトに制限処理を追加すれば完成です

// 移動処理
void Move()
{
    // 横(Ⅹ)方向の入力
    float fHorizontalInput = Input.GetAxisRaw("Horizontal");
    // 縦(Y)方向の入力
    float fVerticalInput = Input.GetAxisRaw("Vertical");

    // 位置を更新
    float add_x = fHorizontalInput * MoveSpeedList[moveSpeedIndex] * Time.deltaTime;
    float add_y = fVerticalInput * MoveSpeedList[moveSpeedIndex] * Time.deltaTime;
    transform.Translate(add_x, add_y, 0);

    // 画面外判定
    {
        // 画像サイズの半分の値
        float x = spriteRenderer.bounds.extents.x;
        float y = spriteRenderer.bounds.extents.y;

        // 左
        if ((transform.position.x - x) < pointLB.x)
        {
            transform.position = new Vector2(pointLB.x + x, transform.position.y);
        }
        // 下
        if ((transform.position.y - y) < pointLB.y)
        {
            transform.position = new Vector2(transform.position.x, pointLB.y + y);
        }
        // 右
        if ((transform.position.x + x) > pointRU.x)
        {
            transform.position = new Vector2(pointRU.x - x, transform.position.y);
        }
        // 上
        if ((transform.position.y + y) > pointRU.y)
        {
            transform.position = new Vector2(transform.position.x, pointRU.y - y);
        }
    }
}

 

SpriteRenderer.bounds.extents.x

画像のサイズを半分にした値

画像のピボットが「中心」なので、半分の値を計算に加えている

 

サンプル動画

今更ですが、今回のサンプル動画から16:9に対応

 

さいごに

試しにカメラのサイズを変更してみましたが、それに合わせて移動しました!

カメラのサイズについては下記の記事で

 

次回:スコア的なものを作成?

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
unity
スポンサーリンク
シェアする
かれいどブログ

コメント