如何锁定RectTransform的字段

8
我正在创建自定义布局组并希望控制子对象上的RectTransform。我想锁定子RectTransform的某些字段,类似于在使用画布或Unity的水平或垂直组时无法修改。

我需要相同的效果。您可以在子RectTransform的顶部看到此消息:Some values driven by HorizontalLayoutGroup

enter image description here

我发现了一种折中方法:

添加[ExecuteInEditMode]然后:

public void Update()
{
#if UNITY_EDITOR
    if (!Application.isPlaying)
    {
        /* Todo => update child's positions here. */
    }
#endif
}

任何其他想法?

什么是锁? - Programmer
1
当我们使用 HorizontalLayoutGroup 时,由于它是由布局组驱动的,因此我们无法更改子元素的位置,而且编辑器的GUI字段被锁定,用户无法更改。我需要相同的效果。您可以在子RectTransform的顶部看到此消息:Some values driven by HorizontalLayoutGroup - High
1个回答

16

这是使用DrivenRectTransformTracker API完成的。

文档中:

驱动RectTransform意味着该组件控制驱动RectTransform的值。这些驱动值不能在检查器中编辑(它们被显示为禁用)。当保存场景时,它们也不会保存,这可以防止不期望的场景文件更改。

每当组件更改驱动RectTransforms的值时,应首先调用Clear方法,然后使用Add方法添加所有它正在驱动的RectTransforms。 Clear方法还应在组件的OnDisable回调中调用。

文档中没有示例,但下面是如何使用它的:

public RectTransform targetRC;
UnityEngine.Object driver;

void Start()
{
    DrivenRectTransformTracker dt = new DrivenRectTransformTracker();
    dt.Clear();

    //Object to drive the transform
    driver = this;
    dt.Add(driver, targetRC, DrivenTransformProperties.All);
}

现在与 targetRC 变量关联的 RectTransform 将被锁定,不可从编辑器中修改。它应该会显示类似于 "Some values are driven by another object" 的内容。您可以使用 DrivenTransformProperties 来指定要锁定的变量。

执行此代码后,其效果如下:

enter image description here


2
谢谢,那非常有帮助。 - High
注意:自2017年以来,这在Unity中从未真正起作用 - 它只驱动一些值(而不是它应该控制的所有值 - 例如:无法控制锚点和大小)。我已经使用它多年了,但它非常令人沮丧。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接