環境
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 が動作するようになりました。