【Godot4】ウィンドウのサイズ変更を検知する(User Interfaceのシーン限定)

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Godot4】ウィンドウのサイズ変更を検知する(User Interfaceのシーン限定)

2024-1-19 | , ,

Godot4でウィンドウのサイズ変更を検知したい!

概要

今回の記事では、Godot4でウィンドウのサイズ変更を検知する手順を掲載する。

Node.NOTIFICATION_WM_SIZE_CHANGEDがそれっぽいんだけどもなんか違うみたい。

仕様書

環境

  • Gogot 4.2.1

手順書

User Interfaceのシーン限定のやり方になるんだけども、resizeのシグナルを受診することでウィンドウのサイズが変更されたのを検知できる。

ウィンドウのサイズが変更されたのを検知されたタイミングで、子のColorRectをウィンドウのサイズに合わせてフィットさせるサンプル。

  1. シーンはこんな感じ。ルートのControlにはスクリプトをアタッチしておく。
  2. Sceneの中のControlを選択した状態で、Node -> Signals -> Control -> resize()をダブル左クリックする。
  3. シグナルの設定をするダイアログが表示される。ルートのControlが設定されてることを確認してConnectを左クリックする。
  4. 赤枠のような感じになってれば、シグナルが設定される。
  5. resizeのシグナルに接続した関数_on_resizedにウィンドウのサイズ、Control(ビューポート)のサイズをOUTPUTへ出力して、子のColorRectをフィットさせるコードを入力する。
    
    extends Control

@onready var colorRect = $ColorRect

func _on_resized():

ウィンドウのサイズを取得してOUTPUTへ出力する

var ws:Vector2i = DisplayServer.window_get_size()
print("DisplayServer x: %d, y; %d" % [ws.x, ws.y])

# Control(ビューポート)のサイズをOUTPUTへ出力する
print("Control w: %d, h; %d" % [size.x, size.y])

# Control(ビューポート)のサイズに合わせて、子のColorRectのサイズをフィットさせる
# シーンの作成時にもこのシグナルが発火するんだけども、そのタイミングではColorRectが読み込まれておらずnullなことに注意
if (colorRect != null):
    colorRect.size = Vector2(size.x, size.y)


## まとめ(感想文)

Node.NOTIFICATION_WM_SIZE_CHANGEDが思ったとおりに受信できなくて困ってたんだけども、シグナルで対応できる場合もあるんだと気付かされた今日この頃。