#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. Спасибо за ваш ответ. Боюсь, это не совсем то, что мне нужно. В этом примере я могу сохранить текущую сцену, но моя большая проблема (как я упоминал в вопросе) заключается в том, что мне нужно перебрать все сцены в моей игре. И перед компиляцией.