{"record":{"id":"3e0432b49a117eef","repo":"Unity-Technologies/UnityCsReference","slug":"invalid-material-folder-path-0-3e0432","errorCode":null,"errorMessage":"Invalid material folder path: {0}.","messagePattern":"Invalid material folder path: (.+?)\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"Editor/Mono/AssetPipeline/SpeedTreeImporter.bindings.cs","lineNumber":222,"sourceCode":"        }\n\n        internal extern void SetMaterialVersionToCurrent();\n\n        internal extern SourceAssetIdentifier[] sourceMaterials\n        {\n            [FreeFunction(Name = \"SpeedTreeImporterBindings::GetSourceMaterials\", HasExplicitThis = true)]\n            get;\n        }\n\n        public bool SearchAndRemapMaterials(string materialFolderPath)\n        {\n            bool changedMappings = false;\n\n            if (materialFolderPath == null)\n                throw new ArgumentNullException(\"materialFolderPath\");\n\n            if (string.IsNullOrEmpty(materialFolderPath))\n                throw new ArgumentException(string.Format(\"Invalid material folder path: {0}.\", materialFolderPath), \"materialFolderPath\");\n\n            var guids = AssetDatabase.FindAssets(\"t:Material\", new string[] { materialFolderPath });\n            List<Tuple<string, Material>> materials = new List<Tuple<string, Material>>();\n            foreach (var guid in guids)\n            {\n                var path = AssetDatabase.GUIDToAssetPath(guid);\n                // ensure that we only load material assets, not embedded materials\n                var material = AssetDatabase.LoadMainAssetAtPath(path) as Material;\n                if (material)\n                    materials.Add(new Tuple<string, Material>(path, material));\n            }\n\n            var importedMaterials = sourceMaterials;\n            foreach (var material in materials)\n            {\n                var materialName = material.Item2.name;\n                var materialFile = material.Item1;\n","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/Unity-Technologies/UnityCsReference/blob/225b0fbdb57cc17d094e8056b71f8314aba56f73/Editor/Mono/AssetPipeline/SpeedTreeImporter.bindings.cs#L204-L240","documentation":"The second guard in SearchAndRemapMaterials: after null is excluded, an empty path is also rejected because AssetDatabase.FindAssets with an empty folder would match everything (or nothing useful) and silently produce wrong remapping results. Note the message formats the path inline (\"Invalid material folder path: {0}.\"), so for the empty-string case it renders as an empty path in the message.","triggerScenarios":"Calling SearchAndRemapMaterials(\"\"); passing a path that was trimmed to empty; a path built from string concatenation where one component was missing.","commonSituations":"Editor text field submitted empty; path derived from a parent folder constant that is empty; whitespace-only path that was trimmed.","solutions":["Provide a concrete folder under Assets/ (e.g. \"Assets/Materials\").","Validate with !string.IsNullOrEmpty(materialFolderPath) and with AssetDatabase.IsValidFolder before calling.","Strip/sanitize user-supplied paths and reject blanks at the UI layer."],"exampleFix":"// before\nimporter.SearchAndRemapMaterials(folder);\n\n// after\nif (string.IsNullOrWhiteSpace(folder) || !AssetDatabase.IsValidFolder(folder))\n    throw new InvalidOperationException(\"Invalid material folder: \" + folder);\nimporter.SearchAndRemapMaterials(folder);","handlingStrategy":"validation","validationCode":"if (string.IsNullOrWhiteSpace(materialFolderPath) || !AssetDatabase.IsValidFolder(materialFolderPath))\n    throw new InvalidOperationException(\"Invalid material folder: \" + materialFolderPath);\nimporter.SearchAndRemapMaterials(materialFolderPath);","typeGuard":"static bool IsValidFolder(string p) => !string.IsNullOrWhiteSpace(p) && AssetDatabase.IsValidFolder(p);","tryCatchPattern":null,"preventionTips":["Always pass a folder that exists under Assets/.","Validate with AssetDatabase.IsValidFolder before calling.","Sanitize and reject blank paths at the UI boundary."],"tags":["unity","speedtree","argument-validation","empty-string","asset-database"],"backgroundTag":null,"analyzedSha":"225b0fbdb57cc17d094e8056b71f8314aba56f73","analyzedAt":"2026-08-13T19:07:19.849Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}