白黒羊

Unity UIToolkit の Update XUML Schema で XmlSchemaException: The ‘XXXXX:IYYYYY’ element is not declared エラーが出た

環境

Unity Editor 2021.2.0f1

com.unity.modules.ui: 1.0.0
com.unity.modules.uielements: 1.0.0

したこと

Unity Editor で Assets > Update UXML Schema

エラーコード

XmlSchemaException: The 'Project.UI.Components:IWeightedComponent' element is not declared.
System.Xml.Schema.XmlSchemaSet.InternalValidationCallback (System.Object sender, System.Xml.Schema.ValidationEventArgs e) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.BaseProcessor.SendValidationEvent (System.Xml.Schema.XmlSchemaException e, System.Xml.Schema.XmlSeverityType severity) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.BaseProcessor.SendValidationEvent (System.Xml.Schema.XmlSchemaException e) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.Compiler.CompileElement (System.Xml.Schema.XmlSchemaElement xe) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.Compiler.CompileParticleElements (System.Xml.Schema.XmlSchemaComplexType complexType, System.Xml.Schema.XmlSchemaParticle particle) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.Compiler.CompileParticleElements (System.Xml.Schema.XmlSchemaComplexType complexType, System.Xml.Schema.XmlSchemaParticle particle) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.Compiler.CompileComplexTypeElements (System.Xml.Schema.XmlSchemaComplexType complexType) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.Compiler.Compile () (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.Compiler.Execute (System.Xml.Schema.XmlSchemaSet schemaSet, System.Xml.Schema.SchemaInfo schemaCompiledInfo) (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
System.Xml.Schema.XmlSchemaSet.Compile () (at <86b7b3f3cfad4d55aeafccf8dc7c52c1>:0)
UnityEditor.UIElements.UxmlSchemaGenerator+<GenerateSchemaFiles>d__12.MoveNext () (at /Users/bokken/buildslave/unity/build/ModuleOverrides/com.unity.ui/Editor/UXMLSchemaGenerator.cs:292)
UnityEditor.UIElements.UxmlSchemaGenerator.UpdateSchemaFiles () (at /Users/bokken/buildslave/unity/build/ModuleOverrides/com.unity.ui/Editor/UXMLSchemaGenerator.cs:63)
UnityEditor.UIElements.UxmlSchemaGenerator.UpdateUXMLSchema () (at /Users/bokken/buildslave/unity/build/ModuleOverrides/com.unity.ui/Editor/UXMLSchemaGenerator.cs:54)

IWeightedComponent というインタフェースが宣言されていないよ〜と言われています。
いくつかの自作コンポーネントが継承しているインタフェースだったので、インタフェースを継承しているとUXML Schemaが作れなくなるのだろうかと思っていましたが違いました。

原因

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

namespace Project.UI.Components
{
    public class UnidirectionalBox : Box
    {
        public new class UxmlFactory : UxmlFactory<UnidirectionalBox, UxmlTraits>
        {
        }

        public new class UxmlTraits : VisualElement.UxmlTraits
        {
            public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription
            {
                get
                {
                    yield return new UxmlChildElementDescription(typeof(IWeightedComponent));
                }
            }
        }
    }
}

子要素として typeof(IWeightedComponent) を指定していたことが原因でした。

解決

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

namespace Project.UI.Components
{
    public class UnidirectionalBox : Box
    {
        public new class UxmlFactory : UxmlFactory<UnidirectionalBox, UxmlTraits>
        {
        }

        public new class UxmlTraits : VisualElement.UxmlTraits
        {
            public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription
            {
                get
                {
                    yield return new UxmlChildElementDescription(typeof(WeightedComponentA));
                    yield return new UxmlChildElementDescription(typeof(WeightedComponentB));
                    yield return new UxmlChildElementDescription(typeof(WeightedComponentC));
                }
            }
        }
    }
}

継承後のクラスを指定してあげることで Update UXML Schema が動作するようになりました。