在 Unity 中,如何检测窗口是否正在调整大小以及窗口是否已停止调整大小

Faj*_*raa 6 user-interface screen-resolution unity-game-engine

我希望我的 UI 在用户仍在调整游戏大小时(在窗口边框中保持单击)不调整大小,并且只有当用户松开鼠标时才会触发调整大小事件。

我试图在 Unity 上实现它,但到目前为止我只能检测到窗口大小的变化,我的脚本每 0.5 秒检查一次,如果检测到变化,它将调整 UI 的大小。但是当然调整所有内容会导致严重滞后,因此每 0.5 秒调整大小不是一个好的选择,但每 1 秒调整大小也不是一个好主意,因为 1 秒被认为太长了。

问题可能太宽泛,但我已将问题指定为尽可能小,如何检测用户是否仍在调整窗口大小?以及如何检测用户是否已停止调整窗口大小(停止在窗口边框处单击)?

Dr-*_*ket 5

您无法判断某人何时停止拖动窗口,除非您想为所有桌面环境和每个操作系统编写低级解决方案。

MonoBehavior以下是使用该OnRectTransformDimensionsChange事件对我的任何课程都有效的方法:

public class StackOverflow : MonoBehaviour
{
    private const float TimeBetweenScreenChangeCalculations = 0.5f;
    private float _lastScreenChangeCalculationTime = 0;

    private void Awake()
    {
        _lastScreenChangeCalculationTime = Time.time;
    }
    
    private void OnRectTransformDimensionsChange()
    {        
        if (Time.time - _lastScreenChangeCalculationTime < TimeBetweenScreenChangeCalculations)
            return;

        _lastScreenChangeCalculationTime = Time.time;
            
        Debug.Log($"Window dimensions changed to {Screen.width}x{Screen.height}");
    }
    
}
Run Code Online (Sandbox Code Playgroud)


Fat*_*tie -1

我有一些好消息——算是吧。

当用户在 Mac 或 PC 上调整窗口大小时,

Unity 将自动重新布局所有内容。

但实际上仅当用户“完成”调整 Mac/PC 窗口大小时。

我相信这就是 OP 所要求的 - 所以好消息是,OP 的要求是非常自动的。

然而。Unity 中的一个大问题是,当用户拖动鼠标扩展 Mac/PC 窗口时,Unity 无法平滑地调整元素大小

我从来没有找到解决这个问题的办法。(经常提到的一个糟糕的解决方案是检查每帧窗口的大小;这似乎是唯一的方法。)

再次有趣的是,OP提到的

“……如果窗口停止调整大小……”

在 Unity 中自动完成;事实上,没有采取任何措施来实现这一目标。