일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- working set
- Cell Shader
- 작업 집합
- C언어
- 게임 수학
- URP로 변경
- 가상 바이트
- Toon Shader
- 3d
- Cartoon Rendering
- Windows Build
- Private Bytes
- Three(Two) Tone Shading
- Cell Look
- OculusMotionVectorPass
- 벡터
- Specular
- Rim Light
- Virtual Byte
- VR
- ASW(Application SpaceWarp)
- 프로그래밍 기초
- 개인 바이트
- AppSW
- ColorGradingLutPass
- URP
- 메모리 누수
- Today
- Total
WinCNT
유니티에서 안드로이드 기기에 연결되어 있으면 Build And Run, 그렇지 않으면 Build만 하는 스크립트 만들어보기 본문
유니티에서 안드로이드 기기에 연결되어 있으면 Build And Run, 그렇지 않으면 Build만 하는 스크립트 만들어보기
WinCNT_SSS 2023. 9. 21. 18:12서론
CI와 빌드 자동화를 위한 무언가(?)를 작업 중이었다
유니티에서는 빌드하는 스크립트를 간편하게 짤 수 있고, 참고 자료도 많아서 문제는 없었다
그런데 빌드 옵션에 BuildOptions.AutoRunPlayer를 지정했을 경우, 빌드 시에 연결된 디바이스가 없으면 빌드 파일 자체가 안 만들어진다는 것을 알게 되었다
안드로이드 기기에 연결되어 있으면 Build And Run, 그렇지 않으면 Build만 하고 싶었기에 그 방법을 찾아봤다
방법 1) UnityException: No Android devices connected 체크
우선 처음으로 성공한 것은 BuildPipeline.BuildPlayer의 리턴 값인 BuildReport를 체크하는 방법이었다
빌드 시에 디바이스가 연결되어 있지 않으면 예외가 발생하며, 그 내용은 Prepare For Build라는 스텝에 나와있었기에 그것을 체크해봤다
public static void Build()
{
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = new[] { RenderingTestScenePath };
buildPlayerOptions.locationPathName = "Build/Application.apk";
buildPlayerOptions.target = BuildTarget.Android;
buildPlayerOptions.options = BuildOptions.CompressWithLz4HC | BuildOptions.AutoRunPlayer | BuildOptions.Development | BuildOptions.ShowBuiltPlayer;
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
// No Android devices connected로 인한 예외 발생 체크
bool isRebuildNotRun = false;
foreach (var step in report.steps)
{
if (step.name == "Prepare For Build")
{
foreach (var message in step.messages)
{
if (message.type == LogType.Exception &&
message.content.Contains("UnityException: No Android devices connected"))
{
isRebuildNotRun = true;
break;
}
}
}
}
if (isRebuildNotRun)
{
buildPlayerOptions.options = BuildOptions.CompressWithLz4HC | BuildOptions.Development | BuildOptions.ShowBuiltPlayer;
report = BuildPipeline.BuildPlayer(buildPlayerOptions);
summary = report.summary;
}
if (summary.result == BuildResult.Succeeded)
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
if (summary.result == BuildResult.Failed)
Debug.Log("Build failed");
}
문제 없이 작동은 했지만, 사실 그다지 마음에 들지 않은 방법이었다
마음과 같아서는 디바이스가 연결되어 있는지를 먼저 체크하고 싶었는데……
방법 2) adb.exe로 연결된 디바이스 체크하기
그런데 짜잔~!! 챗GPT에 물어보니 그 방법을 알려주네요~
그냥 물어보니 이상한 코드만 만들길래, 위의 코드의 타당성을 묻는 방식으로 바꾸니 도움이 되는 코드를 알려줬다
물론 중간에 몇 번 틀리기도 했다
아무튼 이 방법은 adb.exe를 스크립트에서 실행시켜서, 연결된 디바이스가 있는지 확인하는 방식이다
public static void Build()
{
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = new[] { RenderingTestScenePath };
buildPlayerOptions.locationPathName = "Build/Application.apk";
buildPlayerOptions.target = BuildTarget.Android;
buildPlayerOptions.options = BuildOptions.CompressWithLz4HC | BuildOptions.AutoRunPlayer | BuildOptions.Development | BuildOptions.ShowBuiltPlayer;
Process process = new Process();
// adb 실행 파일의 경로를 설정
process.StartInfo.FileName = @"C:\\Program Files\\Unity\\Hub\\Editor\\...생략...\\platform-tools\\adb.exe";
// adb.exe의 인수로 devices를 지정
process.StartInfo.Arguments = "devices";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
List<string> connectedDevices = new List<string>();
string[] lines = output.Split(new char[] { '\\n', '\\r' }, System.StringSplitOptions.RemoveEmptyEntries);
for (int i = 1; i < lines.Length; i++) // 첫 번째 라인은 헤더이므로 스킵
{
string[] tokens = lines[i].Split('\\t');
if (tokens.Length >= 2 && tokens[1] == "device")
{
connectedDevices.Add(tokens[0]);
}
}
// 연결된 디바이스의 개수 체크
bool isDeviceConnected = connectedDevices.Count > 0;
// 연결된 디바이스가 없으면 빌드 옵션 재설정
if (isDeviceConnected == false)
{
buildPlayerOptions.options = BuildOptions.CompressWithLz4HC | BuildOptions.Development | BuildOptions.ShowBuiltPlayer;
}
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
if (summary.result == BuildResult.Failed)
Debug.Log("Build failed");
}
굳이 BuildPipeline.BuildPlayer를 2번 호출할 필요가 없어지므로 이 방법이 더 나은 것 같다
마무리
여담이지만 BuildOptions.AutoRunPlayer를 지정하지 않으면 딱히 필요 없는 방식이긴 하다
그래도 adb.exe로 연결된 디바이스 체크하는 방법 자체는 여러 응용이 가능할 것 같으니 조사하길 잘 했다고 믿고 싶다
참고 사이트
Unity - Scripting API: BuildPipeline.BuildPlayer
'Unity > Unity 관련' 카테고리의 다른 글
CMD와 ADB로 만들었던 스크립트를 PowerShell로 바꿔보자! (0) | 2023.10.10 |
---|---|
CMD와 ADB로 유니티의 apk를 빌드하고 VR기기에서 실행해보기 (0) | 2023.10.04 |
윈도우의 CMD(Command Prompt)로 Unity의 Editor 스크립트의 메소드 실행하기! (0) | 2023.09.15 |
유니티에서 빌드 직전, 직후에 실행되는 스크립트 작성하기!! (0) | 2023.08.25 |
Unity Assembly Definition를 설정해보기 (0) | 2023.08.21 |