通过代码创建指定路径ScriptableObject,动态命名为何报错?
动态命名创建CarScriptableObject报错的解决方案
1. 检查carName是否包含非法字符
Unity资源文件名/路径不允许出现空格、中文、/、\、:、?、"、<、>、|这类字符,固定路径的"A-RS6"是合法的,但carName可能带了非法字符导致路径无效。
- 处理办法:给carName做非法字符过滤,比如把违规字符替换成下划线:
using System.Text.RegularExpressions; // 只保留字母、数字、下划线和连字符,其余替换为下划线 string validCarName = Regex.Replace(carName, @"[^\w\-]", "_"); string carResourcesPath = $"Assets/Resources/CarScriptableObject/{validCarName}.asset";
2. 确认carName不为空或null
如果carName没赋值或者是空字符串,生成的路径会变成Assets/Resources/CarScriptableObject/.asset,这属于无效路径必然报错。
- 处理办法:加个空值校验:
if (string.IsNullOrEmpty(carName)) { Debug.LogError("carName不能是空值!"); return; } string carResourcesPath = $"Assets/Resources/CarScriptableObject/{carName}.asset";
3. 确保目标文件夹存在
固定路径能正常运行,大概率是你手动创建过Assets/Resources/CarScriptableObject/文件夹,但动态生成时如果文件夹不存在,Unity会报错。
- 处理办法:创建资源前先检查并创建文件夹:
string folderPath = "Assets/Resources/CarScriptableObject/"; if (!AssetDatabase.IsValidFolder(folderPath)) { // 从父文件夹开始创建,这里父文件夹是Assets/Resources AssetDatabase.CreateFolder("Assets/Resources", "CarScriptableObject"); } string carResourcesPath = folderPath + carName + ".asset";
4. 检查是否存在同名资源
如果carName对应的.asset文件已经在目标路径里,再次调用AssetDatabase.CreateAsset会触发报错。
- 处理办法:先检查资源是否存在,存在则提示或覆盖:
string carResourcesPath = $"Assets/Resources/CarScriptableObject/{carName}.asset"; var existingAsset = AssetDatabase.LoadAssetAtPath<CarScriptableObject>(carResourcesPath); if (existingAsset != null) { Debug.LogWarning($"资源{carName}.asset已存在,将执行覆盖操作"); AssetDatabase.DeleteAsset(carResourcesPath); } AssetDatabase.CreateAsset(carScriptableObject, carResourcesPath);
内容的提问来源于stack exchange,提问作者Matei Megyesi
相关产品推荐
相关产品推荐

