# 런타임 중에 Build Automation의 빌드 매니페스트 사용

> Access build manifest data at runtime for analytics and bug reporting in Unity Build Automation.

게임의 런타임 코드에 빌드 자체에 대한 주요 정보가 포함되어 있는 경우가 많습니다. 빌드의 이름과 번호와 같은 정보는 버그를 보고하거나 분석을 트래킹할 때 매우 유용합니다. Build Automation은 이를 용이하게 하기 위해 빌드 시 게임에 매니페스트를 삽입하여 이 주요 데이터를 런타임 시점에 나중에 액세스할 수 있도록 합니다.

Build Automation은 매니페스트를 JSON으로 포맷이 지정된 [`TextAsset`](https://docs.unity3d.com/Manual/class-TextAsset.html)으로 제공합니다. Build Automation은 매니페스트를 `Resources.Load()`를 통해 액세스할 수 있는 게임 리소스로 저장합니다. 빌드 매니페스트에는 다음의 값이 포함되어 있습니다.

| **값**                  | **프로퍼티**                                                        |
| ---------------------- | --------------------------------------------------------------- |
| `scmCommitId`          | 빌드된 커밋이나 changelist입니다.                                         |
| `scmBranch`            | 빌드된 브랜치의 이름입니다.                                                 |
| `buildNumber`          | 이 빌드에 해당하는 Build Automation 빌드 번호입니다.                           |
| `buildStartTime`       | 빌드 프로세스가 시작된 시점의 UTC 타임스탬프입니다.                                  |
| `projectId`            | Unity 프로젝트 식별자입니다.                                              |
| `bundleId`             | Build Automation에서 설정된 `bundleIdentifier`입니다(iOS와 Android만 해당). |
| `unityVersion`         | Build Automation에서 빌드가 생성되는 데 사용한 Unity 버전입니다.                  |
| `xcodeVersion`         | 프로젝트를 빌드하는 데 사용된 Xcode 버전입니다(iOS만 해당).                          |
| `cloudBuildTargetName` | 빌드된 빌드 타겟의 이름입니다.                                               |

**UnityCloudBuildManifest.json**이라는 TextAsset 매니페스트는 `Assets/UnityCloud/Resources` 폴더에 작성됩니다.

## 로컬 테스트의 경우##for-local-testing

빌드 매니페스트 기능을 로컬에서 테스트하려면 `UnityCloudBuildManifest.json.txt` 파일의 이름을 지정합니다. 이 파일은 Build Automation 매니페스트 파일에 간섭을 일으킬 수 있으므로 코드 저장소에 있는 프로젝트의 **Assets/UnityCloud/Resources** 폴더에 커밋하면 안 됩니다.

## 매니페스트 사용##use-the-manifest

런타임 시 다음을 통해 매니페스트에 액세스할 수 있습니다.

* [JSON으로 매니페스트](#build-manifest-as-json)
* [ScriptableObject로 매니페스트](#build-manifest-as-scriptableobject)

### JSON으로 매니페스트 빌드##build-manifest-as-json

런타임 시 JSON으로 Build Automation 매니페스트에 액세스할 수 있습니다. 이 에셋에는 커스텀 파싱 로직이나 타사 JSON 파서 사용이 필요합니다.

다음 C# 코드 예제는 [GitHub Gist](https://gist.github.com/darktable/1411710)에서 MiniJSON 파서로 빌드 매니페스트를 로드하고 파싱하는 방법을 보여 줍니다.

```cs
using UnityEngine;
using System.Collections.Generic;
using MiniJSON;

public class MyGameObject: MonoBehaviour
{
    void Start()
    {
        var manifest = (TextAsset) Resources.Load("UnityCloudBuildManifest.json");
        if (manifest != null)
        {
            var manifestDict = Json.Deserialize(manifest.text) as Dictionary<string,object>;
            foreach (var kvp in manifestDict)
            {
                // Be sure to check for null values!
                var value = (kvp.Value != null) ? kvp.Value.ToString() : "";
                Debug.Log(string.Format("Key: {0}, Value: {1}", kvp.Key, value));
            }
        }
    }
}
```

### `ScriptableObject`로 매니페스트 빌드##build-manifest-as-scriptableobject

`BuildManifestObject`는 [`ScriptableObject`](https://docs.unity3d.com/ScriptReference/ScriptableObject.html)이며, 수동으로 `UnityCloudBuildManifest.json` TextAsset을 로드할 필요 없이 스크립트를 통해 빌드 매니페스트의 값에 액세스하는 데 사용할 수 있습니다.

`BuildManifestObject`는 Build Automation에서 호출하는 사전 익스포트의 선택 사항 파라미터입니다(`UnityCloudBuildManifest.json` TextAsset이 작성되지 않은 경우). 자세한 내용은 [JSON으로 매니페스트](#build-manifest-as-json)를 참고하십시오.

다음 예제 C# 코드는 매니페스트에 제공된 `buildNumber`에 따라 `PlayerSettings`의 `bundleVersion`을 업데이트하는 사전 익스포트 메서드를 보여 줍니다. 사전 익스포트 메서드에 대한 자세한 내용은 [사전 및 포스트 익스포트 메서드](../advanced-build-configuration/run-custom-scripts-during-the-build-process#pre-export-and-post-export-methods)를 참고하십시오.

```cs
using UnityEngine;
using UnityEditor;
using System;

public class CloudBuildHelper : MonoBehaviour
{
    #if UNITY_CLOUD_BUILD
        public static void PreExport(UnityEngine.CloudBuild.BuildManifestObject manifest)
        {
            PlayerSettings.bundleVersion = string.Format("1.0.{0}", manifest.GetValue<int>("buildNumber"));
        }
    #endif
}
```

다음은 `BuildManifestObject` 클래스의 퍼블릭 인터페이스입니다.

```cs
namespace UnityEngine.CloudBuild
{
    public class BuildManifestObject : ScriptableObject
    {
        // Try to get a manifest value - returns true if key was found and could be cast to type T, otherwise returns false.
        public bool TryGetValue<T>(string key, out T result);
        // Retrieve a manifest value or throw an exception if the given key isn't found.
        public T GetValue<T>(string key);
        // Set the value for a given key.
        public void SetValue(string key, object value);
        // Copy values from a dictionary. ToString() will be called on dictionary values before being stored.
        public void SetValues(Dictionary<string, object> sourceDict);
        // Remove all key/value pairs.
        public void ClearValues();
        // Return a dictionary that represents the current BuildManifestObject.
        public Dictionary<string, object> ToDictionary();
        // Return a JSON formatted string that represents the current BuildManifestObject
        public string ToJson();
        // Return an INI formatted string that represents the current BuildManifestObject
        public override string ToString();
    }
}
```
