본문 바로가기
IT/Unity3D

OSX용 앱 빌드 시 외부 프로그램 포함하기

by rapker 2023. 4. 25.
반응형
728x90

 

유니티로 개발한 OSX용 앱이 있습니다.

 

이 앱은 실행중에 외부 프로그램 실행을 필요로 하는데요.

 

이 외부 프로그램을 개발한 앱과 함께 배포를 해야 합니다.

 

OSX용 앱으로 빌드 할 때 필요한 외부 프로그램을 포함해서 빌드하는 방법을 기록합니다.

 

반응형

 

PostBuildProcessor를 이용하는 방법입니다.

using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;

public class PostBuildProcessor_OSX
{
    private const string buildPluginPathOSX = "{0}.app/Contents/Dependencies";

    [PostProcessBuildAttribute(5001)]
    private static void PostBuild_OSX(BuildTarget target, string pathToBuiltProject)
    {
        if (target != BuildTarget.StandaloneOSX) return;

        var buildPathWithoutExt = Path.ChangeExtension(pathToBuiltProject, null);

        Debug.Log($"PostBuildProcessor_OSX::PostBuild_OSX() '{pathToBuiltProject}', '{buildPathWithoutExt}'");

        string destPath = null;
        string sourcePath = null;

        // 앱이 복사 될 .App/Contents/내의 경로
        destPath = string.Format(buildPluginPathOSX, buildPathWithoutExt);
        destPath = Path.GetFullPath(destPath);

        // 앱에 포함시킬 원본 파일들의 디렉터리 경로
        var tmpPath = Directory.GetParent(pathToBuiltProject).Parent.Parent.Parent.FullName;
        sourcePath = Path.Combine(tmpPath, "extra-support/builder/dependencies/MacOS");
        sourcePath = Path.GetFullPath(sourcePath);


        Debug.Log($"PostBuildProcessor_OSX::PostBuild_OSX() src='{sourcePath}', dst='{destPath}'");

        if (string.IsNullOrEmpty(destPath) || string.IsNullOrEmpty(sourcePath))
        {
            return;
        }

        if (!Directory.Exists(destPath))
        {
            Directory.CreateDirectory(destPath);
        }

        // 하위 디렉토리 까지 복사
        DirectoryCopy(sourcePath, destPath, true);
    }

    private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
    {
        DirectoryInfo dir = new DirectoryInfo(sourceDirName);

        if (!dir.Exists)
        {
            throw new DirectoryNotFoundException(
                "Source directory does not exist or could not be found: "
                + sourceDirName);
        }

        DirectoryInfo[] dirs = dir.GetDirectories();
        if (!Directory.Exists(destDirName))
        {
            Directory.CreateDirectory(destDirName);
        }

        FileInfo[] files = dir.GetFiles();
        foreach (FileInfo file in files)
        {
            string temppath = Path.Combine(destDirName, file.Name);
            file.CopyTo(temppath, false);
        }

        if (copySubDirs)
        {
            foreach (DirectoryInfo subdir in dirs)
            {
                string temppath = Path.Combine(destDirName, subdir.Name);
                DirectoryCopy(subdir.FullName, temppath, copySubDirs);
            }
        }
    }
}

 

 

반응형
LIST