有几件事:是的,您可以拖放倍数。接下来,您应该为此类创建名为 SpawnSettings 或其他名称的 ScriptableObject 自定义类。ScriptableObjects 存在于项目中,您可以修改它们的设置而不用担心打开了哪个场景。只要让你的组件有一个公共的 SpawnSettings 设置;参考(并将您的自定义脚本对象拖到该字段的检查器中)。修改可编写脚本的属性比将它们放在场景中的游戏对象上要方便得多。最后,您可以编写一个自定义编辑器菜单项来自动执行您所描述的任务 - 下面是一些示例代码。当您有一个具有属性 [MenuItem] 的静态方法时,它将显示在您指定的 Unity 菜单下,如下例所示。
[MenuItem("Tools/Grasslands/Import Recipes (must be in GameUI scene with CraftManager)")]
private static void ImportRecipes()
{
if (!CraftManager.Instance)
{
Debug.LogError("No CraftManager object found, you must switch to GameUI scene");
return;
}
Undo.RecordObject(CraftManager.Instance, "Imported Crafting Items");
var mainpath = "Assets/Grasslands";
var guids = AssetDatabase.FindAssets("t:CraftRecipeDefinition");
print($"Found CraftRecipeDefinitions: {guids.Length} total");
CraftManager.Instance.Recipez = new CraftRecipeDefinition[guids.Length];
List<CraftRecipeDefinition> items = new List<CraftRecipeDefinition>();
int total = 0;
foreach (var guid in guids)
{
var path = AssetDatabase.GUIDToAssetPath(guid);
if (!path.Contains(mainpath))
continue;
try
{
var item = AssetDatabase.LoadAssetAtPath<CraftRecipeDefinition>(path);
items.Add(item);
total++;
}
catch (System.Exception ex)
{
Debug.LogError($"Exception importing itemdefinition [{path}]: {ex.Message}");
}
}
items.Sort();
for(int i=0; i<items.Count; i++)
{
var item = items[i];
//item.Id = i + 1;
//EditorUtility.SetDirty(items[i]);
if (items.Any(x => x.Id == item.Id))
{
Debug.LogError($"Duplicate ID for [{item.name}] - SetId has been called and it is fixed now.");
item.SetId();
EditorUtility.SetDirty(item);
}
}
CraftManager.Instance.Recipez = items.ToArray();
print($"------ Imported Crafting Recipes: {total} total --------");
EditorUtility.SetDirty(CraftManager.Instance);
EditorSceneManager.SaveOpenScenes();
AssetDatabase.SaveAssets();
}
CraftManager 使用一个常见的 Unity Singleton 模式,它只是为其提供了一个 .Instance 属性,因此您可以轻松地从任何地方引用它。我检查以确保我们在正确的场景中使用 CraftManager 游戏对象。然后我抓取项目中的所有 CraftRecipeDefinition 自定义脚本对象并将它们添加到一个简单的 List<> 中,然后我对其进行排序并最终分配给 CraftManager.Instance.Recipez 属性。就我而言,Recipez 只是一个公共列表 Recipez。所以是的,您可以编写自定义编辑器菜单项脚本来运行和修改场景中的任何内容,包括使用 UnityEditor 命名空间提供的 AssetDatabase.FindAssets() 方法将 List<>s 替换为您从项目资产中获取的项目。这很简单,FindAssets() 返回一个 UniqueId 字符串列表,我们需要调用将资产加载到内存中(并且我们指定将其转换为的类型),然后我们可以将其添加到 List<> 中。请注意,这样的菜单项脚本应该包含在#if UNITY_EDITOR #endif 中,这样在您构建EXE 时它不会破坏您的构建。您应该查找 Unity Singleton Pattern 和 Scriptable Objects。