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

Posted

技术标签:

【中文标题】在 Unity 中,如何检测窗口是不是正在调整大小以及窗口是不是已停止调整大小【英文标题】:In Unity, how to detect if window is being resized and if window has stopped resizing在 Unity 中,如何检测窗口是否正在调整大小以及窗口是否已停止调整大小 【发布时间】:2020-05-10 12:37:30 【问题描述】:

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

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

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

【问题讨论】:

我认为这是一个格式相当明确的具体问题 - 将您已经尝试过的代码添加到答案中会有所帮助。 我认为没有必要,因为它无助于回答这个问题。毕竟有很多方法可以复制我的代码所做的事情,而无需使用与我的代码相同的代码。 可能是一个 hacky 修复,但只是等待 mouseClick-up 事件有效吗? @sommmen - 代码无关紧要,问题已经完美描述。 检查这个回调:OnRectTransformDimensionsChange 【参考方案1】:

我有一些好消息 - 有点。

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

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

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

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

但是。 Unity 中的一个大问题是 Unity 在用户拖动鼠标以展开 Mac/PC 窗口时无法平滑地调整元素的大小

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

再次有趣的是,OP 提到了什么

" ..如果窗口停止调整大小 .."

在 Unity 中自动完成;实际上什么也没做。

【讨论】:

【参考方案2】:

我需要这样的东西来重新生成折线图,但由于它的元素太多,每次更新都会很繁重,所以我想出了这个,对我来说效果很好:

public class ToRunOnResize : MonoBehaviour

    private float screenWidth;
    private bool screenStartedResizing = false;
    private int updateCounter = 0;
    private int numberOfUpdatesToRunXFunction = 15; // The number of frames you want your function to run after, (usually 60 per second, so 15 would be .25 seconds)

    void Start()
    
        screenWidth = Screen.width; // Identifies the screen width
    

    private void Update()
    
        if (Screen.width != screenWidth) // This will be run and repeated while you resize your screen
        
            updateCounter = 0; // This will set 0 on every update, so the counter is reset until you release the resizing.
            screenStartedResizing = true; // This lets the application know when to start counting the # of updates after you stopped resizing.
            screenWidth = Screen.width;
        

        if (screenStartedResizing)
        
            updateCounter += 1; // This will count the updates until it gets to the numberOfUpdatesToRunXFunction
        

        if (updateCounter == numberOfUpdatesToRunXFunction && screenStartedResizing)
         // Finally we make the counter stop and run the code, in my case I use it for re-rendering a line chart.
            screenStartedResizing = false;
            // my re-rendering code...
            // my re-rendering code...
        
    

【讨论】:

效率很低

以上是关于在 Unity 中,如何检测窗口是不是正在调整大小以及窗口是不是已停止调整大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在窗口调整大小时隐藏 Facebook 聊天框?

jquery检测窗口调整大小

如何在调整窗口大小时锁定纵横比?

使用菜单调整窗口大小

检测何时使用 JavaScript 调整窗口大小?

React-virtualized - 是不是可以在窗口调整大小时更新 rowHeights?