不管是生成Prefab和导出UnityPackage都是只有在编辑器环境下才能使用(在编辑器下运行时也可以)
Prefab不能生成到StreamingAsset文件下,否则无法加载到依赖关系,即使实例化到场景里,也仅是一个有预制体名字的空物体
先贴上代码:
PrefabUtility.CreatePrefab(prefabFullPath, CREATE_OBJ));
prefabFullPath的格式为保存的路径+想要保存的名字+.prefab后缀名
例如:application.datapath+testobj+.prefab
CREATE_OBJ为你想要保存为预制体的游戏物体类
GameObject selectedGameObject = Selection.activeGameObject;
可以通过Selection方法获得Hierarchy窗口中选中的物体,
也可以通过外部传,总之这个就是你要制作成预制体的游戏物体
CreatePrefab方法返回的是一个游戏物体类
还是先贴代码:
string exprotPath = EditorUtility.SaveFilePanel("导出包路径", "", "", "unitypackage");
var AssetPathName = AssetDatabase.GetDependencies(assetPath);
AssetDatabase.ExportPackage(AssetPathName, exprotPath + "bao.unitypackage", ExportPackageOptions.IncludeDependencies | ExportPackageOptions.Default);
exprotPath为想要导出的路径,此处用Unity的SaveFilePanel类,第一个string为窗口标题,第二个string为默认打开的目录,第三个string为默认文件名(在打开窗口中可以随意填写),第四个string为后缀名,拓展名,此处我们填写unitypackage
AssetPathName为一个string数组,值是想要打包的资源的路径(从Assets/开始算,即只记录工程目录即可)
如果你无法确定自己想要导出的资源在工程Assets目录下哪个位置,可以通过
var AssetPathName = new string[Selection.objects.Length];
for (int i = 0; i < AssetPathName.Length; i++)
{
AssetPathName[i] = AssetDatabase.GetAssetPath(Selection.objects[i]);
}
Selection.objects就是你在Project视窗中选择的物体物体数组,然后再通过GetAssetPath方法获取到这个资源的在工程中的路径
GetAssetPath方法也可以用来获取刚刚我们创建预制体的路径
string AssetPath =AssetDatabase.GetAssetPath( PrefabUtility.SaveAsPrefabAsset(CREATE_OBJ, prefabFullPath));
这里用了新的保存预制体的方法SaveAsPrefabAssets,CreatePrefab方法在新的版本中会被弃用,这个方法的构造参数和CreatePrefab方法相反,需要生成预制体的物体在前面,路径在后面
当我们获取到这个AssetsPath之后,还需要通过 AssetDatabase.GetDependencies(assetPath)方法来获取这个资源的引用关系,才能打包出一个完整的包,这里可以传string数组(获取多个物体的引用),也可以单独传一个string(获取一个物体的引用),返回的都是一个string数组,有了这个引用的数组,我们就可以导出包了
AssetDatabase.ExportPackage(AssetPathName, exprotPath, ExportPackageOptions.IncludeDependencies);
第一个值就是需要被导出的资源的路径,如果没有获取到引用,你导出的也只是一个Prefab的依赖表,不包含任何模型资源,图片,材质等资源的,第二个值就是导出路径+名字,刚刚我们已经尬通过SaveFilePanel获取到了,这里直接用就行了,第三个值是导出的模式,一共有四种模式,大家可以详细自己看一下,IncludeDependencies这个模式就是包含了引用关系的(即使你没有获取引用,也会自动去查找引用再导出)