投稿日:2018/10/08 投稿者:sai
Read in 3 minutes
フィールドを作っていない部分が出るとかっこ悪いので見せないようにしたい. 手段はいろいろあるので簡単でした.
検索して初めに出てきた手段はCinemachineを使う【Unity】2Dのカメラがステージ外を映さないようにする方法 ただCinemachineはオーバースペックな気もするのでひとまず保留.
ひとまずTilemapでフィールドを作っているのでtilemapをもとにした範囲で実施可能で,現状のカメラ追従プログラムから手軽に行ける手段でやってみた. これでだめだったらCinemachineにしてみるつもりだったができた.
まず見せたくない部分を見せてしまうプログラムがこちら。これはメインカメラオブジェクトに付与するスクリプト.内容としてはカメラの位置を強制的に追従対象の位置に毎周期置き換えているだけ.
この状態だとただプレーヤに追従しているため見せたくない部分が見えてしまう。
置き換える際に場所のクランプをする.ただそれだけ. 流れとしては 1. フィールドの範囲を取得しておく 2. X,Yの端からカメラの表示範囲を考慮してクランプする地点を調べる 3. カメラの位置をずらす処理の前に2番で求めた地点を超えていないかを調べてから追従する位置を決める
現在のフィールドはTileMapで構成されているためその大きさを取得すればよい. TilemapにはlocalBounds要素があり,その中に中心と中心から端までの長さが入っているのでそれを使う.
この方式でやる限りカメラの範囲をフィールドごとに変更しなくとも(サンプルコードでは)groundの名前が付いたtilemapがあれば自動でフィールドの範囲を守ってくれるので違うフィールドを作るのが楽と予想。フィールド追加をそれ程していないので効果のほどは不明。
※camera.orthographicSizeとscreen_ratioは後述
Unity - Scripting API: Tilemap
フィールドの範囲だけではカメラの描画分が考慮できていないのでちょっとだけフィールド外が見えてしまう.そのためカメラが移す範囲を調べる.2Dなので楽. Unity - Scripting API: Camera
これは簡単でCamera.orthographicSizeをそのまま使うだけ
こっちはちょっと厄介.Camera.orthographicSizeを流用するために画面のアスペクト比を求める必要がある.
Unity - Scripting API: Screenこいつからよさげな奴を見繕う.
ただif文で調べるだけ.戻り値にタプルを使っているのはただの手抜き。
以下のコードでいい感じになった. 高性能にするのはまたいつか.
category: unity