Unity

iOS에서 uaal로 unity를 library로 사용하기

CommitGuy 2025. 1. 27. 22:45

iOS에서 3D 물리엔진등을 구현하기는 힘들다.

3D 물리엔진은 유니티나 언리얼이 사용하야 구현이 쉬운데 이럴경우 ios native app이면서 3d 물리엔진이 필요한 경우에는 unity를 사용하는 방법이 있다

UAAL(Unity As A Library) 라는 방식이다

 

uaal을 사용해 ios native 앱에서 유니티를 라이브러리로 불러 사용하는 방법에 대해 알아보도록 하겠다

 

1. workspace 생성

우선 Xcode workspace부터 생성한다

Xcode > File > New > WorkSpace 를 클릭해 workspace를 생성한다

 

2. ios native app 프로젝트 생성

다음으로 ios native app을 생성한다 원래 만들던 방식과 동일하되 앞서 만든 workspace에 연결한다

 

3. Unity iOS Build

Unity Project에서 iOS를 target으로 세팅 후 build 한다

build를 하고 나면 xcode project가 생성되는데 생성된 xcode project를 workspace에 붙여 ios native app project와 unity xcode project를 통합시킨다

 

Unity-iPhone아래 Data 폴더의 Target Membership을 UnityFramework로 바꿔준다

Unity-iPhone > Data 폴더의 Target Membership을 UnityFramework로 바꿔준다

 

4. UnityFramework 추가

Native iOS App Project에 UnityFramework를 연결해준다

BuildPhases > Link Binary With Libraries에는 UnityFramework.framework를 제거해주어야 한다

 

5. iOS Native App에서 Unity Load & UnLoad하는 방법

Unity를 Load & UnLoad하기 위한 Swift 코드를 iOS Native App 에 추가해줍니다

import UnityFramework

class UnityManager: NSObject
{
    static let shared = UnityManager()
    
    private let dataBundleId: String = "com.unity3d.framework"
    private let frameworkPath: String = "/Frameworks/UnityFramework.framework"
    
    private var ufw: UnityFramework?
    
    private var hostMainWindow: UIWindow?
    
    private override init() {}
    
    func setHostMainWindow(_ hostMainWindow: UIWindow?)
    {
        self.hostMainWindow = hostMainWindow
    }
    
    func launchUnity()
    {
        let isInitialized = self.ufw?.appController() != nil
        if isInitialized { self.ufw?.showUnityWindow() }
        else
        {
            guard let ufw = self.loadUnityFramework() else { return }
            self.ufw = ufw
            ufw.setDataBundleId(dataBundleId)
            ufw.register(self)
            ufw.runEmbedded(withArgc: CommandLine.argc,
                            argv: CommandLine.unsafeArgv,
                            appLaunchOpts: nil)
        }
    }
    
    func closeUnity()
    {
        self.ufw?.unloadApplication()
    }
    
    private func loadUnityFramework() -> UnityFramework?
    {
        let bundlePath: String = Bundle.main.bundlePath + frameworkPath
        
        let bundle = Bundle(path: bundlePath)
        if bundle?.isLoaded == false { bundle?.load() }
        
        let ufw = bundle?.principalClass?.getInstance()
        if ufw?.appController() == nil
        {
            let machineHeader = #dsohandle.assumingMemoryBound(to: MachHeader.self)
            ufw?.setExecuteHeader(machineHeader)
        }
        
        return ufw
    }
}

extension UnityManager: UnityFrameworkListener
{
    func unityDidUnload(_ notification: Notification!)
    {
        self.ufw?.unregisterFrameworkListener(self)
        self.ufw = nil
        self.hostMainWindow?.makeKeyAndVisible()
    }
}

 

 

 

Reference

https://github.com/Unity-Technologies/uaal-example

 

GitHub - Unity-Technologies/uaal-example

Contribute to Unity-Technologies/uaal-example development by creating an account on GitHub.

github.com