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로 바꿔준다
4. UnityFramework 추가
Native iOS App Project에 UnityFramework를 연결해준다
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
'Unity' 카테고리의 다른 글
iOS-Unity UAAL iOS와 Unity 사이 데이터 주고 받는 방법(feat swift) (0) | 2025.02.04 |
---|---|
[Unity] TextMeshPro 사용시 한글 깨짐 (0) | 2025.01.17 |
[Unity] 스크롤 가능한 텍스트 영역 만드는 방법 (1) | 2025.01.16 |
[Unity] AddressableAsset 사용방법 (7) | 2024.12.12 |
[Unity] AI Navigation System 사용방법 (8) | 2024.12.11 |