unity3d 如何让Unity中新打开的UI窗口自动偏移?像Windows文件资源管理器一样?

92vpleto  于 2022-12-04  发布在  Windows
关注(0)|答案(1)|浏览(276)

我正在开发一个Unity应用程序,它可以使用书签按钮打开多个内部浏览器窗口。现在,我把浏览器Prefab,并示例化它同时打开多个窗口。但窗口会重叠在一起,用户不会知道它是打开了一个新窗口,或在现有窗口重定向,除非他们拖走一个。
我尝试了一个'for'循环来打开多个窗口,但是在for循环中所有的窗口都是一次点击就能打开的,而且都是同一个url。幸运的是,在我想要的偏移位置。
但应该是一次点击打开一个新窗口,另一次点击打开一个新窗口偏移到前一个。

下面是我的书签按钮脚本:

// Open the browser window instance with bookmark button
public void OpenLinks(string link)
{
    for (int i = 0; i<=10; i++)
    {
        GameObject browser = Instantiate(browserWindow, new Vector2(i * 50 + 50, -(i * 50) - 50), browserWindow.transform.rotation);
        browser.SetActive(true);
        browser.GetComponent<SimpleWebBrowser.WebBrowser2D>().Navigate(link);
        browser.transform.parent = Windows.transform;
        browser.name = "Page - " + link;
    }
}

我假设可能需要一个if语句而不是for循环,但我不知道如何去做,因为我需要在OpenLinks()中保存示例化,这样我就可以在以后销毁示例以释放内存,然后重新打开。
有人能帮我吗?

c3frrgcw

c3frrgcw1#

看起来你要做的是一次打开一个窗口,并存储该窗口示例。然后每个窗口都在下一个位置打开,所以你需要存储下一个窗口需要打开的位置的值,要么存储上一个位置,要么存储下一个位置。在下面的示例代码中,我们存储了窗口下次打开的位置。
有很多额外的代码需要输入,比如当下一个要打开的窗口不在屏幕上时会发生什么,真的需要重新编码到屏幕的顶部,但是我们现在只需要快速检查硬编码的位置。
话虽如此,下面是一段示例代码,它应该能完成您所寻找的任务:

public class Test : MonoBehaviour
{
    // Stubs ...
    public GameObject browserWindow;
    public GameObject Windows;

    private Vector2 _nextWindowPosition = new ( 50f, -50f );
    private Dictionary <int, SimpleWebBrowser.WebBrowser2D> _openWindows = new();

    // Open the browser window instance with bookmark button
    public void OpenLink ( string link )
    {
        var browser = Instantiate(browserWindow, _nextWindowPosition, browserWindow.transform.rotation);
        browser.SetActive ( true );
        if ( !browser.TryGetComponent<SimpleWebBrowser.WebBrowser2D> ( out var webBrowser ) )
        {
            Debug.LogError ( $"Could not get SimpleWebBrowser.WebBrowser2D for the new window." );
            Destroy ( browser );
            return;
        }

        browser.transform.parent = Windows.transform;
        browser.name = "Page - " + link;
        webBrowser.Navigate ( link );

        _nextWindowPosition += new Vector2 ( 50f, -50f );
        if ( _nextWindowPosition.x > 500 )
            _nextWindowPosition.x = 50f;
        if ( _nextWindowPosition.y < -500 )
            _nextWindowPosition.y = -50f;

        _openWindows.Add ( browser.GetInstanceID (), webBrowser );
    }

    public void CloseWindow ( int guid )
    {
        if ( !_openWindows.TryGetValue ( guid, out var webBrowser ) )
        {
            Debug.LogError ( $"Could not find window with GUID {guid}." );
            return;
        }

        Debug.Log ( $"Destroying window '{webBrowser.name}'." );
        _openWindows.Remove ( guid );
        Destroy ( webBrowser );
    }
}

相关问题