Godot4.0的浮动游戏工作区自动全屏的问题

Table of Contents

Godot 4.0 中,当屏幕分辨率小于项目设置中指定的窗口大小,Godot 会自动将主窗口强制切换为全屏模式,这是一种为防止窗口内容显示不完整而设计的行为,但这对于想要保持“浮动窗口”状态(非全屏)的人来说是个问题。

✅ 目标:

保持浮动窗口模式(Windowed),即使当前屏幕分辨率小于设置的窗口大小。


🎯 解决思路

Godot 引擎中这个行为目前是默认的“安全机制”,但你可以通过如下方法来避免它强制全屏


✅ 方法 1:运行时手动设置窗口大小并强制浮动模式

在你的主脚本中(例如 autoload.gdMain.gd)添加如下代码,确保窗口总是以“窗口模式”运行,并强制缩小尺寸:

// 使用 C# 版本
using Godot;

public partial class Main : Node
{
    public override void _Ready()
    {
        // 强制取消全屏
        DisplayServer.WindowSetMode(DisplayServer.WindowMode.Windowed);

        // 获取屏幕尺寸
        Vector2I screenSize = DisplayServer.ScreenGetSize();

        // 获取当前项目设置的窗口大小
        Vector2I targetSize = new Vector2I(1280, 720); // 或从 ProjectSettings 读取

        // 如果屏幕太小,动态缩小窗口以避免强制全屏
        if (targetSize.X > screenSize.X || targetSize.Y > screenSize.Y)
        {
            GD.Print("Screen too small, resizing window to fit.");
            targetSize.X = Math.Min(screenSize.X - 100, targetSize.X);
            targetSize.Y = Math.Min(screenSize.Y - 100, targetSize.Y);
        }

        // 设置窗口大小
        DisplayServer.WindowSetSize(targetSize);
    }
}

说明

  • DisplayServer.WindowSetMode(WindowMode.Windowed) 确保不是全屏。
  • 手动控制窗口大小,防止触发自动全屏逻辑。
  • 加入边距避免任务栏遮挡。

✅ 方法 2:项目设置中控制初始窗口大小(推荐搭配方法 1)

  1. 打开 Project > Project Settings > Display > Window

  2. 设置:

    • Mode = Windowed
    • Initial Width / Height 设置为比最小屏幕还小的尺寸(如 960×540)。
    • 禁用 Resizable(可选)。
  3. 关闭 DPI Stretch:将 Display > Window > Dpi > Allow HiDPIStretch Mode 设置为 viewport


✅ 方法 3:启动脚本中检测并覆盖设置

也可以直接修改 ProjectSettings 值(运行时修改):

ProjectSettings.SetSetting("display/window/size/viewport_width", new_width);
ProjectSettings.SetSetting("display/window/size/viewport_height", new_height);
DisplayServer.WindowSetSize(new Vector2I(new_width, new_height));

注意:这些设置不会保存到 project.godot 文件中,仅对当前运行有效。


🔧 总结

方法 效果 推荐情况
显式设置 Windowed 模式 ✅ 保持浮动窗口 强烈推荐
运行时缩放窗口大小 ✅ 兼容小屏幕,不强制全屏 强烈推荐
改 Project Settings 🟡 静态设置,可能被引擎忽略 可搭配使用

如你希望构建一个“浮动工具窗口”的小尺寸子窗口,也可以使用 SubViewportContainerDisplayServer.WindowCreate() 创建辅助窗口。

需要我帮你写一个完整的 Godot 4 + C# 启动窗口控制模块吗?可以用于任何项目模板中。

kumakoko avatar
kumakoko
pure coder
comments powered by Disqus