下記の「3」の表示に注目してほしい。
画面を拡大する機能を設けると、UIで構成しているものは、表示される位置がおかしくなってしまう。
今回は、これを回避する方法を書き留めておく
修正前
修正後
〇前提
・「3」はUIのTextMeshProで作成
・上記のCanvasのRenderModeは、WorldSpace
〇修正方法
①拡大時は、メインのカメラとは別のカメラで表示しているので、別のカメラをアクティブ化した状態で、表示したい位置に表示されるようにCanvasの位置を手作業で修正し、その位置をメモしておく
②全体を表示しているときのCanvasの位置は、起動時に取得しておく
③画面拡大ボタンを押したときにCanvasの位置を①でメモした位置に書き換える
④画面をデフォルトに戻したときには、Canvasを元の位置に書き換える
〇コード
[SerializeField] Canvas DisplayCanvas;
RectTransform DisplayTransform;
Vector3 defPosition;
void Start()
{
DisplayTransform = DisplayCanvas.GetComponent<RectTransform>();
defPosition = RoundUITransform.transform.localPosition;
}
public void OnZoomButtonDown()
{
if (SubCameraOn)
{
DisplayTransform.transform.localPosition = defIPosition;
SubCamera.SetActive(false);
ZoomButtonText.text = "画面拡大";
SubCameraOn = false;
}
else
{
SubCamera.SetActive(true);
ZoomButtonText.text = "画面縮小";
DisplayTransform.transform.localPosition= new Vector3(0, -34.8f, 501f);
SubCameraOn = true;
}
}
〇 ポイント
普通にGameObjectのTransform.positionの調整でできそうな気がしたが、うまくいかなかったので、DisplayTransform = DisplayCanvas.GetComponent<RectTransform>();という形で、UIのCanvasのRectTransformを取得して、そのlocalPositionを書き換えることにより処理している
〇考察
・拡大時のカメラのプロパティから、デフォルトとの拡大率、位置の差を取得して、Canvasの位置を修正するというのが良いのだろうが、ViewRectだけで拡大しているわけでもないので、今回は手動で処理した
なんか、UnityのUI系って、使いづらいよね・・・