프로그래밍

Unity3D 일일 자동 빌드 하기

벌커덕스 2012. 4. 27. 17:38

현재 프로젝트가 Unity3D를 이용하여 개발을 진행하다 보니 일일 자동 빌드의 필요성이 있어 해당 기능을 적용하였다.

우선 자동 빌드를 하기 위한 시스템에는 유니티 에디터가(빌더,컴파일러) 설치되어 있어야 한다.

SCM은 SVN 대신 UnityAsset Server 를 쓰고 있으며 기본 플로우는 다음과 같다.


  1. AssetServer에서 최신 리소스 및 코드 다운로드.
  2. 빌드 진행.

    (너무심플하다)


물론 SVN이나 다른 것을 사용한다면 1번과정을 대체하면 된다.

유니티에서는 명령줄 입력을 지원하므로 AssetServer에서 최신데이터 다운로드 및2번 빌드 과정은 unity.exe 를 이용한다.

 

우선 배치파일을 아래와 같은 내용으로 작성한다. 명령줄에 대한 설명은 유니티 도움말 참조!!


Unity_build.bat

@echo off

net use x: \\fileserver\Project /user:user pass

Echo [Process batchjob]===================================================== >> unitybuild.log

Echo %date% %time% [START] Update >> unitybuild.log

@"D:\Program(x86)\Unity\Editor\Unity.exe" -batchmode -projectPath D:\Work\TalesStory -assetServerUpdate 175.211.69.106 TalesStory user pass -quit -nographics >> unitybuild.log

Echo %date% %time% [BUILD] Unity batch build >> unitybuild.log

@"D:\Program(x86)\Unity\Editor\Unity.exe" -quit -batchmode -projectPath D:\Work\TalesStory -nographics -executeMethod MyEditorScript.PerformBuild >> unitybuild.log

Echo %date% %time% [END] >> unitybuild.log

 

net use 를 하는 것은 상기 배치파일을 서비스스케줄러에서 돌리게 되어 결과물이 저장될 서버에 미리 로그인해두는 것이다.

다음은 명령줄에서 실행할 스크립트 메서드(Batchbuild.cs)를 작성하여 Asset/Editor 폴더에 복사한다.

UnityEditor.MenuItem 을 이용해서 유니티 메뉴에 등록하여 빌드 테스트도 가능하다.


 

Batchbuild.cs

 

using UnityEngine;

using UnityEditor;

using System;

 

class MyEditorScript: ScriptableObject

{

    public static string version = PlayerSettings.bundleVersion;

    private static string version_template = "public class Version {    public static string version = \"$$version$$\";}";

 

    //-----------------------------------------------------------------------------------------------------------------

    [UnityEditor.MenuItem("Tools/G Studio/About G Studio")]

    static void About(){

        //요기다 디버그 찍어보자.

        Debug.Log("Application.dataPath="+Application.dataPath);

        Debug.Log("version="+version);

        Debug.Log("Version.version="+Version.version);

 

        WriteVersionFile(Application.dataPath+@"\Source\GUIScripts\Version.cs",version_template.Replace("$$version$$","adfasdfasdf"));

 

        EditorUtility.DisplayDialog("G Studio v" + version, "G Studio Test Script Version " + version + "\n\nCopyright 2012 NEOCYON G Studio\nAll rights reserved.", "OK");

    }

    //-----------------------------------------------------------------------------------------------------------------

    [UnityEditor.MenuItem("Tools/G Studio/PerformBuild")]

static void PerformBuild()

{

         string dt = String.Format(@"{0:yyyyMMdd}", DateTime.Now);

         PlayerSettings.Android.bundleVersionCode +=1;

         PlayerSettings.bundleIdentifier = "com.neocyon.talesstory";

         PlayerSettings.bundleVersion = "1.0." +PlayerSettings.Android.bundleVersionCode+"."+ dt;

        WriteVersionFile(Application.dataPath+@"\Source\GUIScripts\Version.cs",

                        version_template.Replace("$$version$$",PlayerSettings.bundleVersion));

 

        Debug.Log("PerformBuild()-Debug.Log");

//Console.WriteLine("PerformBuild()-Console");        //요건 안찍힘.

string output = "X:/40.배포/배치빌드/tailstory_" + dt + "-" + PlayerSettings.Android.bundleVersionCode+".apk";

string[] scenes = {

             Application.dataPath+"/Scenes/LoadScene.unity",

             Application.dataPath+"/Scenes/GameScene.unity"

             };

BuildPipeline.BuildPlayer(scenes, output, BuildTarget.Android ,BuildOptions.None );

}

    

    //-----------------------------------------------------------------------------------------------------------------    

    [UnityEditor.MenuItem("Tools/G Studio/Update Asset Server Data")]

static void UpdateAssetfromServer()

{

        Debug.Log("UpdateAssetfromServer()-Debug.Log");

        AssetDatabase.Refresh(ImportAssetOptions.Default);

//Console.WriteLine("PerformBuild()-Console");        //요건 안찍힘.

        //업데이트 수행하는 메서드 못찾음.

}

    //-----------------------------------------------------------------------------------------------------------------

     private static void WriteVersionFile(string filePathname, string version)

     {

        using (System.IO.FileStream fs = System.IO.File.Create(filePathname))

        {

            byte[] info = new System.Text.UTF8Encoding(true).GetBytes(version);

            fs.Write(info, 0, info.Length);

            //fs.WriteText(version);

        }        

     }

}

 

코드에 필요한 게 있다면 편집하면 된다.

프로젝트명-빌드날짜.apk로 빌드 되도록 구성하였다.

 

여기에다가 빌드시 자동으로 빌드일자를 프로그램 내에 삽입하기 위하여 Version 클래스를 작성하고 참조하고 빌드전에 version.cs를 자동 생성시켜 내부에 버전정보를 표시토록 한다.

 

이후 윈도우 작업 스케줄러 에 해당 배치파일을 등록하면 끝.


매일 새벽 5시에 빌드가 된다. 자~알 된다. 아 물론 5시에 시스템 켜있어야한다. 그리고 유니티는 실행중이면 안된다. process 검사해서 kill 해주고 빌드 돌리는거 만들려다가 구차니즘으로 걍 pass!~