C# 有没有办法通过脚本将对象导出到包中?
我知道你可以在编辑器菜单中创建:资产>导出包。。。 但如果您有很多对象,则需要一些时间才能找到要导出为包的内容。“导出”窗口中没有搜索选项 但在层次结构中,您可以搜索特定对象,但不能从搜索中将其打包 我在层次结构中搜索了door_lo,结果如下:C# 有没有办法通过脚本将对象导出到包中?,c#,object,unity3d,C#,Object,Unity3d,我知道你可以在编辑器菜单中创建:资产>导出包。。。 但如果您有很多对象,则需要一些时间才能找到要导出为包的内容。“导出”窗口中没有搜索选项 但在层次结构中,您可以搜索特定对象,但不能从搜索中将其打包 我在层次结构中搜索了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不是有点矛盾吗?