Unity3D通過代碼生成Prefab並導出UnityPackage
首先要明確的問題
不管是生成Prefab和導出UnityPackage都是隻有在編輯器環境下才能使用(在編輯器下運行時也可以)
Prefab不能生成到StreamingAsset文件下,否則無法加載到依賴關係,即使實例化到場景裏,也僅是一個有預製體名字的空物體
Prefab的生成
先貼上代碼:
PrefabUtility.CreatePrefab(prefabFullPath, CREATE_OBJ));
prefabFullPath的格式爲保存的路徑+想要保存的名字+.prefab後綴名
例如:application.datapath+testobj+.prefab
CREATE_OBJ爲你想要保存爲預製體的遊戲物體類
GameObject selectedGameObject = Selection.activeGameObject;
可以通過Selection方法獲得Hierarchy窗口中選中的物體,
也可以通過外部傳,總之這個就是你要製作成預製體的遊戲物體
CreatePrefab方法返回的是一個遊戲物體類
UnityPackage的導出
還是先貼代碼:
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這個模式就是包含了引用關係的(即使你沒有獲取引用,也會自動去查找引用再導出)