【问题标题】:Reparenting prefabs between to panels in Unity3d (NGUI)在 Unity3d (NGUI) 中的面板之间重新设置预制件
【发布时间】:2012-10-08 13:05:02
【问题描述】:

不确定这是解决 Unity3d/NGUI 问题的最佳论坛,但请尝试一下...

我正在尝试通过重新设置游戏对象将其从可滚动面板移动到普通面板。

firstGameObject.transform.parent = secondGameObject.transform;

firstGameObject 最初是一个可裁剪的可滚动面板的子项。转换似乎在层次结构中移动得很好,不再可滚动。但它仍然像被剪裁面板的孩子一样被剪裁。

有什么想法吗?

编辑:NGUI 论坛上有人建议在两个 uipanels 上调用 Refresh(),但没有效果。 http://www.tasharen.com/forum/index.php?topic=1941.0

【问题讨论】:

    标签: c# parent-child unity3d ngui


    【解决方案1】:

    终于搞定了。正确的方法是在重新设置父级后在旧面板中的每个小部件上调用 CheckParent()。

    UIPanel smallPanel = NGUITools.FindInParents<UIPanel>(firstGameObject);
    List<UIWidget> list = new List<UIWidget>(smallPanel.widgets.buffer);
    
    foreach (UIWidget widget in list)
    {
        if (widget != null)
        {
            widget.CheckParent();
        }
    }
    

    【讨论】:

      【解决方案2】:

      函数CheckParent() 已过时。现在您可以在重新设置的 UIWidget 上使用 ParentHasChanged()

      【讨论】:

        【解决方案3】:

        这取决于您使用的滚动条。将新父级设置为预制件,您只需为其设置新的局部坐标系。您说此滚动条中的对象正在剪切。因此,必须有一个数组或列表或类似的东西,存储您的预制件并在您的预制件上执行一些操作。或者,有某种掩码可以隐藏特定区域中的所有对象(我认为这是你的情况)。在这种情况下,您应该将预制件移出面具区域。如果不需要更改屏幕位置,只需更改 Z 坐标,这样预制件就会更靠近相机,并且超出遮罩区域。

        【讨论】:

        • 这是一个剪切面板的示例:tasharen.com/ngui/ex7.html 和一些解释:tasharen.com/?page_id=706 更改 Z 值不允许您使内容可见。你可能是对的,有一些内部的小部件列表要在 UIPanel 中被剪辑,并且重新设置它不会从这个列表中删除精灵。所以问题是如何告诉 UIPanel 它的一些孩子已经走了?
        • 只需将此预制件从滚动条的项目列表中删除即可。必须有这样一个列表:您可能将您的项目添加到其中。只需搜索它以匹配此游戏对象并从列表中删除。
        • 没有保存预制件的公开列表。有一个小部件列表,可能是在初始化时由其子层次结构生成的。但这对我没有帮助。试图公开 UIPanels RemoveTransform 方法,但没有奏效。在面板上调用 Refresh() 也无济于事。
        • 您可以尝试克隆对象,将其放置在您想要的任何位置,最后删除原始预制件。但看来要放回去也不容易。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多