Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity小ネタ カメラを切り替えてもUIを所定の位置に表示する方法

下記の「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系って、使いづらいよね・・・