[UnrealEngine4] 在game模式下如何禁止在windows下拉window的border來調整大小

posted in: C/C++程式設計, UnrealEngine | 0

2023 6月 Update:剛剛試4.27,現在只要在ProjectSetting把Allow Window Resize拿掉就行了

引擎版本:4.9,以下內容已經有點舊,僅供參考

最近在看各別解析度對應的方法,發現unreal engine 4裡面已經有DPI Scale來很好處理這一塊了。但其實這個機制其實也並不完美,因為玩家能夠亂拉視窗的大小,隨便亂拉的結果則會有些UI會跑到看不見,尤其是當視窗大小被拉成不是預期的狀態時,整個UI會變成很奇怪,這對於一個好的遊戲體驗是沒辦法接受的。

在我的預期上調整短邊應該要能夠scale位置,而調整長邊去scale大小。但這個DPI Scale機制最終其實也只能選擇直的或橫的來做處理。雖然有一個custom可以實作自己的類別,看起來似乎有那麼一點戲可以做到想做的效果,但實在有點麻煩,而且實作出來應該也只是對值的customize而已,而不是根據動作(上面說的位置、大小),所以我開始在尋找禁止玩家去亂拉window大小的方法,最終目標是只在遊戲中提供幾個按鈕讓玩家選擇可用的解析度大小。這種做法也比較符合一般遊戲使用的機制,不用去煩惱那幾近無限的解析度適配的問題,只要我們提供的選項的aspect ratio是一致的,然後再根據我們的選項去把那個DPI Scale curve拉好,基本上就不會有什麼大問題。

為了這個問題我研究了好幾天,發現在void FWindowsWindow::Initialize這個function下面雖然有傳入一個FGenericWindowDefinition definition來指定這個視窗的樣式,但該參數並沒有開放給引擎的使用者進行調整,因為它在更上一層的FSlateApplication::MakeWindow被宣告成local的變數再傳進來的。那麼到底該怎麼去調整這視窗的樣式呢?

看來引擎並沒有一個generic的api來做這件事,因此我們能做的就是針對各個平台拿出NativeWindow再進行對應的實作,以下的程式碼可以達成這件事:

https://gist.github.com/dorgonman/13d2695ed9e4494f24c6c7e54a15c8be

在遊戲跑起來之後呼叫一次這個方法之後,總算能讓玩家不能去亂拉window的大小啦。

當然在其他平台,如mac或linux,則必須要再survey相關的實作才行(如果有需要的話)。

Leave a Reply

Your email address will not be published. Required fields are marked *