현재 프로젝트가 Unity3D를 이용하여 개발을 진행하다 보니 일일 자동 빌드의 필요성이 있어 해당 기능을 적용하였다.
우선 자동 빌드를 하기 위한 시스템에는 유니티 에디터가(빌더,컴파일러) 설치되어 있어야 한다.
SCM은 SVN 대신 UnityAsset Server 를 쓰고 있으며 기본 플로우는 다음과 같다.
- AssetServer에서 최신 리소스 및 코드 다운로드.
- 빌드 진행.
(너무심플하다)
물론 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!~
'프로그래밍' 카테고리의 다른 글
Coding 을 배우기 위한 여러 툴 및 사이트들. (0) | 2013.12.24 |
---|---|
유니티 WWWform 이용한 multipart 파일전송 헤더 오류. (2) | 2012.08.02 |
C# worker 스레드에서 UI 스레드 Dispatcher 이용하기. (0) | 2011.06.23 |
VS2010 커맨드 라인 시스템 환경변수 요약 (0) | 2011.05.09 |
#progma 지시어 (0) | 2009.12.17 |