Lab

Unity - script de changement de plateforme rapide pour le build !

Aujourd'hui, une astuce rapide pour un énorme gain de temps ! Travailler avec Unity est plutôt génial, jusqu'à ce qu'on doive faire un build sur une autre plateforme que la sienne ! Selon la taille de votre projet…

Aujourd’hui, une astuce rapide pour un énorme gain de temps !

Travailler avec Unity est plutôt génial, jusqu’à ce qu’on doive faire un build sur une autre plateforme que la sienne ! Selon la taille de votre projet (nombre d’assets, etc.), simplement changer de plateforme actuelle d’Android vers iOS ou inversement peut prendre une heure… oui, sérieusement ! Pendant ce temps, vous ne pourrez pas travailler sur votre projet et le processeur de votre ordinateur sera bien occupé… alors, l’heure d’une longue pause ? Jusqu’à maintenant !

Cette astuce se base sur quelque chose de bien connu dans la communauté Unity : le dossier library est recréé quand vous changez de plateforme cible actuelle, ce qui prend donc beaucoup de temps. Cela peut être optimisé en gardant une copie de ce dossier avant de changer de plateforme, puis en le restaurant plus tard en revenant en arrière !

Nous avons besoin d’utiliser un script d’éditeur pour faire ça, c’est parti :

using UnityEditor;
using UnityEngine;
using System;
using System.Collections;
using System.IO;

public class FastBuildSwitcher:ScriptableWizard {

	public BuildTarget buildTarget = EditorUserBuildSettings.activeBuildTarget;

	[MenuItem("Tools/Fast Build Switcher")]
	static void CreateWizard () {

		ScriptableWizard.DisplayWizard<FastBuildSwitcher>("Switch Platform", "Switch");
	}

	void OnWizardCreate() {

		//Debug.Log("current platform: " + EditorUserBuildSettings.activeBuildTarget);
		//Debug.Log("next platform: " + buildTarget);

		if (EditorUserBuildSettings.activeBuildTarget == buildTarget) {

			Debug.LogWarning("You set the same next platform than the current one!");

			return;
		}

		//save current Library folder state
		if (Directory.Exists("Library-" + EditorUserBuildSettings.activeBuildTarget))
			DirectoryClear("Library-" + EditorUserBuildSettings.activeBuildTarget);

		DirectoryCopy("Library", "Library-" + EditorUserBuildSettings.activeBuildTarget, true);

		//restore new target Library folder state
		if (Directory.Exists("Library-" + buildTarget)) {

			DirectoryClear("Library");
			Directory.Delete("Library", true);

			Directory.Move("Library-" + buildTarget, "Library");
		}

		EditorUserBuildSettings.SwitchActiveBuildTarget(buildTarget);
	}

	void DirectoryClear(string FolderName) {
		DirectoryInfo dir = new DirectoryInfo(FolderName);

		foreach(FileInfo fi in dir.GetFiles())
			fi.Delete();

		foreach (DirectoryInfo di in dir.GetDirectories()) {

			DirectoryClear(di.FullName);
			di.Delete(true);
		}
	}

	void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs) {

		DirectoryInfo dir = new DirectoryInfo(sourceDirName);
		DirectoryInfo[] dirs = dir.GetDirectories();

		// If the source directory does not exist, throw an exception.
		if (!dir.Exists)
			throw new DirectoryNotFoundException("Source directory does not exist or could not be found: " + sourceDirName);

		// If the destination directory does not exist, create it.
		if (!Directory.Exists(destDirName))
			Directory.CreateDirectory(destDirName);

		// Get the file contents of the directory to copy.
		FileInfo[] files = dir.GetFiles();

		foreach (FileInfo file in files) {
			// Create the path to the new copy of the file.
			string temppath = Path.Combine(destDirName, file.Name);

			// Copy the file.
			file.CopyTo(temppath, false);
		}

		// If copySubDirs is true, copy the subdirectories.
		if (copySubDirs)
			foreach (DirectoryInfo subdir in dirs) {

				// Create the subdirectory.
				string temppath = Path.Combine(destDirName, subdir.Name);

				// Copy the subdirectories.
				DirectoryCopy(subdir.FullName, temppath, copySubDirs);
			}
	}
}

L’inconvénient est que vous ne devez plus utiliser le panneau de build de Unity pour changer de plateforme, mais notre fenêtre personnalisée dans le menu Unity : Tools/Fast Build Switcher. Notez évidemment qu’à chaque fois que vous avez ajouté de nouveaux assets, cela prendra un certain temps pour les importer dans le dossier Library. Avant ce script, sur un nouveau projet avec beaucoup de sprites (plus de 1000 en 512x512 !), il me fallait 30-40 minutes pour changer de plateforme, maintenant c’est moins de 3 ! J’ai aussi testé le Unity Cache Server, il est gratuit maintenant, je l’ai fait tourner en localhost, mais il n’était pas aussi rapide que ce script personnalisé !

Dites-moi comment ça se passe pour vous :D

AL
Aymeric Lamboley
Fondateur & Directeur technique