unity3d Unity UxmlAttributeDescription未设置值(正在重置值)

afdcj2ne  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(161)

我正在使用UI生成器来创建一些自定义控件。我已经成功地创建了一个工作正常的自定义控件。但是第二个控件有一些我无法理解的问题。
问题在于:我可以将我的自定义控件放入UI生成器中。从一开始,“status”属性中就没有默认值,它只是空白。当我手动输入一个值并单击时,“status”值被重置为空白。在控制台中,我从构造函数中得到消息“null”,这意味着我输入的值没有设置。
其他信息:这个问题第一次发生在我使用类UxmlIntAttributeDescription的时候。我有一个类,有一个UxmlStringAttributeDescription和一个UxmlIntAttributeDescription。我可以设置字符串属性,但是不能设置int属性。我一直在简化我的代码,这样我就可以发布这个问题,然后甚至字符串属性也坏了。我真的不知道我在哪里搞砸了,希望有人能帮助我解决这个问题。
这是我的代码。它主要是从https://docs.unity3d.com/Manual/UIE-UXML.html复制的。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class TestElement : VisualElement {
    public new class UxmlFactory : UxmlFactory<TestElement, UxmlTraits> { }

    public new class UxmlTraits : VisualElement.UxmlTraits {

        UxmlStringAttributeDescription m_status = new UxmlStringAttributeDescription { name = "status", defaultValue = "TestElementString" };
      
        public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription {
            get { yield break; }
        }
        
        public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc) {
            base.Init(ve, bag, cc);
            var ate = ve as TestElement;

            ate._status = m_status.GetValueFromBag(bag, cc);
        }
    }

    private string _status;
    
    public TestElement() {
        Debug.Log(_status);
    }
}
flvtvl50

flvtvl501#

  • AttributeDescription的名称应以Attr后缀结尾
  • 必须存在相应的公共{get;set;}属性,且名称相同,但没有Attr后缀

否则序列化系统将无法使用此元素。

public class TestElement : VisualElement
{
    public string status { get; set; }
    public new class UxmlFactory : UxmlFactory<TestElement,UxmlTraits> {}
    public new class UxmlTraits : VisualElement.UxmlTraits
    {
        UxmlStringAttributeDescription statusAttr = new UxmlStringAttributeDescription { name = "status", defaultValue = "TestElementString" };
        public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
        {
            base.Init(ve, bag, cc);
            var ate = ve as TestElement;

            ate.status = statusAttr.GetValueFromBag(bag, cc);
        }
    }
}

相关问题