본문 바로가기

프로그래밍

Unity3D 일일 자동 빌드 하기

현재 프로젝트가 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!~