【unity實用技能】unity編輯器工具之加載預制(Prefab)和場景(Scene)
其實這個在上一篇在ui打包的文章裏有提到,不過重點不同,上篇重點是打包,這篇的重點是把裏面的一個小知識點拉出來講一講
接下來就講講兩者分別怎麽做
一、把預制Prefab拉出來
就是像我們平時把預制拉到這個地方
1.首先是獲取你選中的那個Prefab(如果是有其他需求,比如默認目錄下的所有文件等,就不這樣處理,不過大同小異)
GameObject[] selectGameObjects = Selection.gameObjects;
既然是一個數組就foreach一下。
2.通過AssetDatabase的接口獲取資源路徑並判斷一下選中的文件是否是目標文件夾下的指定後綴文件
string path = AssetDatabase.GetAssetPath(selectGO);
if(path.StartsWith("Resources/XXX"))
{
if(path.EndsWith(".prefab"))
{
}
}
確認無誤開始下一步
3.拉到Hierarchy裏
GameObject uiInstance = PrefabUtility.InstantiatePrefab(selGb) as GameObject
這樣就等於拉到窗口裏了
就可以開始進行各種操作
這裏提醒一下一個類似的接口
PrefabUtility.CreatePrefab
4.刪除實例
上面的實例是uiInstance,所以要把這個實例刪掉,也就是從Hierarchy裏刪掉
UnityEngine.Object.DestroyImmediate(uiInstance);
更新Prefab(相當於點了個apply)
PrefabUtility.ReplacePrefab(instance,go,ReplacePrefabOptions.ConnectToPrefab);
二、把Scene打開
有時候美術出完場景需要做一下校準或檢查資源,需要程序幫忙寫個工具,這時候就需要把Scene打開
1.還是跟上面一樣把選中的場景獲取
Object[] selectGameObjects = Selection.objects;
這裏不一樣的是,獲取的是Object而不是GameObject
2.同樣是獲取場景路徑並檢測名字
string path = AssetDatabase.GetAssetPath(selectGO);
if(path.StartsWith("Resources/XXX"))
{
if(path.EndsWith(".scene"))
{
}
}
同樣,需要改檢測的後綴名為scene
3.打開場景Scene
這裏才是主要差別,用的接口不一樣
EditorSceneManager.OpenScene(selGbPath, OpenSceneMode.Single);
Scene currScene = EditorSceneManager.GetSceneByPath(selGbPath);
可以看到,先把Scene打開,再通過路徑接口獲取Scene
這兩個步驟缺一不可
4.做你想要的操作
你要打開一個場景,無非是要在裏面檢查一些東西或者要修改裏面的一些GameObject裏的一些值。
其實在你調用EditorSceneManager.OpenScene(selGbPath, OpenSceneMode.Single);以後,你的當前場景已經是你想要的場景了
所以你要找你的GameObject只需要GameObject go = GameObject.Find(“name”);就可以了
5.保存場景
如果你對你的場景打開後不需要做任何操作,你甚至在第三步的時候都不用Scene currScene = EditorSceneManager.GetSceneByPath(selGbPath);
去獲取這個場景。
但畢竟你一般不會這麽無聊只打開不做任何操作,所以第二步還是需要獲取。
然後調用
EditorSceneManager.SaveScene(currScene);
這樣就完成了。
這裏不需要像上面實例化GameObject一樣去刪除,場景打開就打開把,同時也就打開一個
【unity實用技能】unity編輯器工具之加載預制(Prefab)和場景(Scene)