Перебор всех сцен перед компиляцией

#c# #unity3d

#c# #unity3d

Вопрос:

Мне нужно перебрать все мои игровые сцены с помощью скрипта и внести некоторые изменения. Мне нужно, чтобы это было сделано до компиляции игры.

Я попытался выполнить предварительную обработку сценариев Google в Unity. Правильно ли я понял, что мне нужно использовать что-то вроде BuildPipeline? Есть ли какие-нибудь простые примеры, чтобы понять, как это работает?

Ответ №1:

Ну, наконец-то мне удалось сделать это самому. Если кто-то справится с такой же проблемой, вот мой код:

 class MyBuilder : Editor {

    private static string[] FillLevels ()
    {
        return (from scene in EditorBuildSettings.scenes where scene.enabled select scene.path).ToArray ();
    }

    [MenuItem ("MyTool/BuildGame")]
    public static void  buildGame()
    {
        string[] levels = FillLevels ();
        foreach (string level in levels) {
            EditorApplication.OpenScene (level);
            object[] allObjects = Resources.FindObjectsOfTypeAll (typeof(UnityEngine.GameObject));
            foreach (object thisObject in allObjects) {
               /* my gameObjects changing before compilation */
            }
            EditorApplication.SaveScene ();
        }
        BuildPipeline.BuildPlayer (levels, Path.GetFullPath (Application.dataPath   "/../game.exe"), BuildTarget.StandaloneWindows, BuildOptions.None);
    }
}
  

Ответ №2:

Вы хотите создать сценарий редактора. С помощью ссылки API reference вы сможете делать со сценой все, что захотите. Приведенный ниже сценарий позволит вам сохранить эти изменения.

Это пример сценария редактора, который позволит вам сохранить изменения, внесенные в сцену, здесь:

 import UnityEditor;

class SimpleAutoSave extends EditorWindow 
{
    var saveTime : float = 300;
    var nextSave : float = 0;

    @MenuItem("Example/Simple autoSave")
    static function Init() 
    {
        var window : SimpleAutoSave = EditorWindow.GetWindowWithRect(SimpleAutoSave, Rect(0,0,165,40));
        window.Show();
    }

    function OnGUI() 
    {
         EditorGUILayout.LabelField("Save Each:", saveTime   " Secs");
         var timeToSave : int = nextSave - EditorApplication.timeSinceStartup;
         EditorGUILayout.LabelField("Next Save:", timeToSave.ToString()   " Sec");
         this.Repaint();

        if(EditorApplication.timeSinceStartup > nextSave) 
        {
            var path : String [] = EditorApplication.currentScene.Split(char.Parse("/"));
            path[path.Length -1] = "AutoSave_"   path[path.Length-1];   
            EditorApplication.SaveScene(String.Join("/",path), true);
            Debug.Log("Saved Scene");
            nextSave = EditorApplication.timeSinceStartup   saveTime;
        }
    }
}
  

Комментарии:

1. Спасибо за ваш ответ. Боюсь, это не совсем то, что мне нужно. В этом примере я могу сохранить текущую сцену, но моя большая проблема (как я упоминал в вопросе) заключается в том, что мне нужно перебрать все сцены в моей игре. И перед компиляцией.