Skip to content Skip to sidebar Skip to footer

Scrivere un file su disco al termine di una build Unity con la funzione OnPostprocessBuild

Può capitare, nello sviluppo di applicativi in Unity, di avere la necessità di far compiere una azione all’editor al termine di una build.

Uno dei casi più semplici è quello di dover scrivere un file all’interno della directory in cui l’eseguibile viene generato (ad esempio per creare una documentazione oppure un file contenente le info di sistema come company name, product name o numero di versione).

La funzione che ci viene in aiuto è OnPostprocessBuild che viene chiamata proprio al termine di ogni build eseguita dall’editor.

Per compiere questa operazione è necessario creare un file .cs ed inserirlo obbligatoriamente nella cartella \Assets\Editor che includa la funzione statica OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) e parametrizzata con [PostProcessBuildAttribute(1)]

Da notare che la funzione statica passa anche due utili parametri: target e pathToBuildProject

Di seguito un esempio completo (da notare che l’esempio riporta anche la direttiva di compilazione solo per build Windows, cosa ovviamente non indispensabile se servisse per altre piattaforme).

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using System.IO;
using UnityEngine.WSA;

public class PostProcessBuild : MonoBehaviour
{
    [PostProcessBuildAttribute(1)]
    public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)
    {

#if UNITY_STANDALONE_WIN

        string path = pathToBuiltProject.Substring(0, pathToBuiltProject.LastIndexOf('/'));
        string filename = "info.txt";
        string finalPath = path + "/" + filename;

        string companyName = UnityEngine.Application.companyName;
        string productName = UnityEngine.Application.productName;

        string textToWrite = companyName + "/" + productName;

        //Write file
        StreamWriter writer = new StreamWriter(finalPath, true);
        writer.WriteLine(textToWrite);
        writer.Close();

        Debug.Log("File '" + finalPath + "' written on " + target.ToString());
#endif

    }
}