C# 有没有办法通过脚本将对象导出到包中?

C# 有没有办法通过脚本将对象导出到包中?,c#,object,unity3d,C#,Object,Unity3d,我知道你可以在编辑器菜单中创建:资产>导出包。。。 但如果您有很多对象,则需要一些时间才能找到要导出为包的内容。“导出”窗口中没有搜索选项 但在层次结构中,您可以搜索特定对象,但不能从搜索中将其打包 我在层次结构中搜索了door_lo,结果如下: 但是如何复制或制作这些对象的包,以便在其他项目中轻松使用它们?我可以一个接一个地制作预制件,然后从硬盘上复制它们。不确定这是否是一种好方法,但它正按照我的要求工作。 搜索对象创建一个预置,将搜索的对象作为子对象。 现在我可以将预制件复制到另一个项目 两

我知道你可以在编辑器菜单中创建:资产>导出包。。。 但如果您有很多对象,则需要一些时间才能找到要导出为包的内容。“导出”窗口中没有搜索选项

但在层次结构中,您可以搜索特定对象,但不能从搜索中将其打包

我在层次结构中搜索了door_lo,结果如下:


但是如何复制或制作这些对象的包,以便在其他项目中轻松使用它们?我可以一个接一个地制作预制件,然后从硬盘上复制它们。

不确定这是否是一种好方法,但它正按照我的要求工作。 搜索对象创建一个预置,将搜索的对象作为子对象。 现在我可以将预制件复制到另一个项目

两个字段:一个用于搜索一个预制名称 两个按钮:一个用于搜索,一个用于生成预制件

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class GeneratePrefab : EditorWindow
{
    private string prefabName = "";
    private string objectsToSearch = "";
    private static GeneratePrefab editor;
    private static int width = 350;
    private static int height = 200;
    private static int x = 0;
    private static int y = 0;
    private Vector2 scroll;
    private int count = 0;
    private List<GameObject> foundObjects = new List<GameObject>();
    private bool usePrefabName = false;
    private bool searched = false;

    [MenuItem("Window/Generate Prefab")]
    static void ShowEditor()
    {
        editor = EditorWindow.GetWindow<GeneratePrefab>();

        CenterWindow();
    }

    private void OnGUI()
    {
        GUI.Label(new Rect(10, 10, 80, 20), "Prefab Name");

        if (usePrefabName)
        {
            GUI.enabled = true;
        }
        else
        {
            GUI.enabled = false;
        }
        prefabName = GUI.TextField(new Rect(10, 30, 150, 20), prefabName, 25);

        GUI.enabled = true;
        GUILayout.Space(55);
        usePrefabName = GUILayout.Toggle(usePrefabName, "Use prefab name");

        GUI.Label(new Rect(10, 90, 150, 20), "Search by name");
        objectsToSearch = GUI.TextField(new Rect(10, 110, 150, 20), objectsToSearch, 25);

        if (objectsToSearch != "")
        {
            GUI.enabled = true;
        }
        else
        {
            GUI.enabled = false;
        }
        GUILayout.Space(90);
        if (GUILayout.Button("Search"))
        {
            count = 0;
            foreach (GameObject gameObj in GameObject.FindObjectsOfType<GameObject>())
            {
                if (gameObj.name == objectsToSearch)
                {
                    count += 1;
                    foundObjects.Add(gameObj);
                }
            }

            if (foundObjects.Count > 0)
            {
                searched = true;
            }
            else
            {
                searched = false;
            }
        }

        GUI.enabled = true;
        if (count > 0)
            GUI.TextField(new Rect(10, 130, 60, 20), count.ToString(), 25);

        if (searched)
        {
            GUI.enabled = true;
        }
        else
        {
            GUI.enabled = false;
        }
        GUILayout.Space(0.1f);
        if (GUILayout.Button("Generate Prefab"))
        {
            GameObject go = new GameObject();
            for (int i = 0; i < foundObjects.Count; i++)
            {
                foundObjects[i].transform.parent = go.transform;
            }

            if (usePrefabName == true)
                go.name = prefabName;

            PrefabUtility.CreatePrefab("Assets/" + go.name + ".prefab", go);
            DestroyImmediate(go);

            objectsToSearch = "";
            searched = false;
            count = 0;
        }
    }

    private static void CenterWindow()
    {
        editor = EditorWindow.GetWindow<GeneratePrefab>();
        x = (Screen.currentResolution.width - width) / 2;
        y = (Screen.currentResolution.height - height) / 2;
        editor.position = new Rect(x, y, width, height);
        editor.maxSize = new Vector2(width, height);
        editor.minSize = editor.maxSize;
    }
}

不确定这是不是一个好方法,但它的工作,因为我想要的。 搜索对象创建一个预置,将搜索的对象作为子对象。 现在我可以将预制件复制到另一个项目

两个字段:一个用于搜索一个预制名称 两个按钮:一个用于搜索,一个用于生成预制件

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class GeneratePrefab : EditorWindow
{
    private string prefabName = "";
    private string objectsToSearch = "";
    private static GeneratePrefab editor;
    private static int width = 350;
    private static int height = 200;
    private static int x = 0;
    private static int y = 0;
    private Vector2 scroll;
    private int count = 0;
    private List<GameObject> foundObjects = new List<GameObject>();
    private bool usePrefabName = false;
    private bool searched = false;

    [MenuItem("Window/Generate Prefab")]
    static void ShowEditor()
    {
        editor = EditorWindow.GetWindow<GeneratePrefab>();

        CenterWindow();
    }

    private void OnGUI()
    {
        GUI.Label(new Rect(10, 10, 80, 20), "Prefab Name");

        if (usePrefabName)
        {
            GUI.enabled = true;
        }
        else
        {
            GUI.enabled = false;
        }
        prefabName = GUI.TextField(new Rect(10, 30, 150, 20), prefabName, 25);

        GUI.enabled = true;
        GUILayout.Space(55);
        usePrefabName = GUILayout.Toggle(usePrefabName, "Use prefab name");

        GUI.Label(new Rect(10, 90, 150, 20), "Search by name");
        objectsToSearch = GUI.TextField(new Rect(10, 110, 150, 20), objectsToSearch, 25);

        if (objectsToSearch != "")
        {
            GUI.enabled = true;
        }
        else
        {
            GUI.enabled = false;
        }
        GUILayout.Space(90);
        if (GUILayout.Button("Search"))
        {
            count = 0;
            foreach (GameObject gameObj in GameObject.FindObjectsOfType<GameObject>())
            {
                if (gameObj.name == objectsToSearch)
                {
                    count += 1;
                    foundObjects.Add(gameObj);
                }
            }

            if (foundObjects.Count > 0)
            {
                searched = true;
            }
            else
            {
                searched = false;
            }
        }

        GUI.enabled = true;
        if (count > 0)
            GUI.TextField(new Rect(10, 130, 60, 20), count.ToString(), 25);

        if (searched)
        {
            GUI.enabled = true;
        }
        else
        {
            GUI.enabled = false;
        }
        GUILayout.Space(0.1f);
        if (GUILayout.Button("Generate Prefab"))
        {
            GameObject go = new GameObject();
            for (int i = 0; i < foundObjects.Count; i++)
            {
                foundObjects[i].transform.parent = go.transform;
            }

            if (usePrefabName == true)
                go.name = prefabName;

            PrefabUtility.CreatePrefab("Assets/" + go.name + ".prefab", go);
            DestroyImmediate(go);

            objectsToSearch = "";
            searched = false;
            count = 0;
        }
    }

    private static void CenterWindow()
    {
        editor = EditorWindow.GetWindow<GeneratePrefab>();
        x = (Screen.currentResolution.width - width) / 2;
        y = (Screen.currentResolution.height - height) / 2;
        editor.position = new Rect(x, y, width, height);
        editor.maxSize = new Vector2(width, height);
        editor.minSize = editor.maxSize;
    }
}
这可能对你有帮助

//path will be the path folder of this files
private void ExportFiles(string path)
{
   string [] prefabFiles = Directory.GetFiles (path, "*.*"); 
   //string [] prefabFiles = Directory.GetFiles (path, "*.prefab");
   string exportPackage = targetFolder + "/exportpackage.unitypackage";
   ExportPackageOptions exportFlags = ExportPackageOptions.Default|ExportPackageOptions.Interactive | ExportPackageOptions.Recurse;
   AssetDatabase.ExportPackage (prefabFiles, exportPackage, exportFlags);

}
这可能对你有帮助

//path will be the path folder of this files
private void ExportFiles(string path)
{
   string [] prefabFiles = Directory.GetFiles (path, "*.*"); 
   //string [] prefabFiles = Directory.GetFiles (path, "*.prefab");
   string exportPackage = targetFolder + "/exportpackage.unitypackage";
   ExportPackageOptions exportFlags = ExportPackageOptions.Default|ExportPackageOptions.Interactive | ExportPackageOptions.Recurse;
   AssetDatabase.ExportPackage (prefabFiles, exportPackage, exportFlags);

}

仔细的如果我理解正确的话,你只需将预制复制到其他项目中,对吗?那么脚本、网格数据、材质、图像等所有依赖项呢?这种方法行不通。@derHugo你说得对。当创建一个游戏对象的预置时,它不是创建一个包含所有依赖项的整个对象吗?我做了一些测试,将多维数据集添加到我的层次结构中,并创建了多维数据集的预置,它正在创建多维数据集的预置。主要的想法是恢复。在我的一个项目中,我有一个空间站的软件包,我无意中删除了所有的门。所以我在另一个项目中也有空间站的软件包,所以我的想法是把第二个项目的门复制回原来的版本。@derHugo也许我在这里遗漏了什么。其主要思想是在意外删除某些对象时进行恢复,然后将它们从另一个项目中复制回来。我不介意我对doors做了更改并丢失了它们。我的想法是从原始包中恢复doors的原始doors。只要您具有所有依赖项,例如,两个项目中的整个模型和材料数据具有相同的AssetID,就可以使用它!。它只适用于Unity默认立方体,因为Unity已经知道该立方体的网格数据。Unity的默认组件(如Transform)也是如此。它可能在您的特殊情况下工作,因为您在两个项目中都有原始网格数据。但是:为了恢复,我建议你开始使用或类似的东西!仔细的如果我理解正确的话,你只需将预制复制到其他项目中,对吗?那么脚本、网格数据、材质、图像等所有依赖项呢?这种方法行不通。@derHugo你说得对。当创建一个游戏对象的预置时,它不是创建一个包含所有依赖项的整个对象吗?我做了一些测试,将多维数据集添加到我的层次结构中,并创建了多维数据集的预置,它正在创建多维数据集的预置。主要的想法是恢复。在我的一个项目中,我有一个空间站的软件包,我无意中删除了所有的门。所以我在另一个项目中也有空间站的软件包,所以我的想法是把第二个项目的门复制回原来的版本。@derHugo也许我在这里遗漏了什么。其主要思想是在意外删除某些对象时进行恢复,然后将它们从另一个项目中复制回来。我不介意我对doors做了更改并丢失了它们。我的想法是从原始包中恢复doors的原始doors。只要您具有所有依赖项,例如,两个项目中的整个模型和材料数据具有相同的AssetID,就可以使用它!。它只适用于Unity默认立方体,因为Unity已经知道该立方体的网格数据。Unity的默认组件(如Transform)也是如此。它可能在您的特殊情况下工作,因为您在两个项目中都有原始网格数据。但是:为了恢复,我建议你开始使用或类似的东西!这看起来很有希望。但是ExportPackageOptions.Default和ExportPackageOptions.Recurse不是有点矛盾吗?这看起来很有希望。但是ExportPackageOptions.Default和ExportPackageOptions.Recurse不是有点矛盾吗?