티스토리 뷰
연동을 하기전에 먼저 유니티에서 빌드후 export 된 안드로이드 프로젝트를 안드로이드 스튜디오에서 먼저 빌드하고 핸드폰에 실행되는지 확인을 해야한다.
2021.12.13 - [Develope/JAVA] - Unity 프로젝트 export - Android Studio에서 실행하기
이후에 해야할것은 유니티 프로젝트를 연동할 안드로이드 스튜디오 프로젝트에서의 작업들이다.
몇일에 걸쳐 시도를 하고, 유니티까지 공부하며 포기할뻔하다가 결국 성공을 했다.
그것도 영하 17도를 기록한 추운 겨울, 캠핑장에서 모두가 잠은 이 늦은 시간에..
잊어버리기 전에 기록을 해둔다.
1. 유니티에서 빌드된 안드로이드 프로젝트 파일중 unityLibrary 폴더를 복사해서 Android Studio 프로젝트 폴더에 복사한다.
스튜디오에서 복사하면 일부 파일이 복사가 안되어 직접 폴더에서 폴더로 복사했다.
2. local.properties 파일에서 NDK 경로를 설정해준다.
( 이 과정은 앞의 글에서 설정한 경로와 동일하다. )
3. settings.gradle 파일에서 유니티 프로젝트를 include 한다.
4. 프로젝트 상위 build.gradle 파일에서 아래와 같이 경로를 설정해준다.
( 이 과정은 유니티에서 나온 안드로이드 프로젝트 내부 build.gradle 과 동일하다 )
5. gradle.properties 수정
이 과정 또한 유니티에서 빌드되어 나온 안드로이드 프로젝트의 gradle.properties 를 참고하였다.
- jvmargs 기본 메모리가 2048 인데 4096 으로 변경
- parallel 설정
- unityStreamingAssets 설정
6. app 내부 build.gradle 설정
dependencies 에 다음 코드를 추가한다.
implementation project(':unityLibrary')
7. UnityLibrary 의 build.gradle 파일을 수정해준다.
app의 androidx 외 기타 부분이 충돌이 날수 있으므로 androidx.core 부분은 필히 주석 해야한다.
이외에는 주석 하기전 충돌날 우려가 없는지 확인후 주석으로 처리한다.
저기서 삭제한 코드는 fileTree 로 모든 jar 을 참조하도록 되어있으니 파일도 같이 삭제를 해야한다.
그렇게 하지 않을 경우 보게될 에러이다.
Duplicate class androidx.collection.CircularArray found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.CircularIntArray found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.ContainerHelpers found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.LongSparseArray found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.LruCache found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.MapCollections found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.MapCollections$ArrayIterator found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.MapCollections$EntrySet found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.MapCollections$KeySet found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.MapCollections$MapIterator found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.MapCollections$ValuesCollection found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.SimpleArrayMap found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.collection.SparseArrayCompat found in modules collection-1.1.0 (androidx.collection:collection:1.1.0) and jetified-androidx.collection.collection-1.0 (androidx.collection.collection-1.0.0.jar)
Duplicate class androidx.lifecycle.ClassesInfoCache found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.ClassesInfoCache$CallbackInfo found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.ClassesInfoCache$MethodReference found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.CompositeGeneratedAdaptersObserver found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.FullLifecycleObserver found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.FullLifecycleObserverAdapter found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.FullLifecycleObserverAdapter$1 found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.GeneratedAdapter found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.GenericLifecycleObserver found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.Lifecycle found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.Lifecycle$Event found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.Lifecycle$State found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.LifecycleObserver found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.LifecycleOwner found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.Lifecycling found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.MethodCallsLogger found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.OnLifecycleEvent found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.ReflectiveGenericLifecycleObserver found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
Duplicate class androidx.lifecycle.SingleGeneratedAdapterObserver found in modules jetified-androidx.lifecycle.lifecycle-common-2.0 (androidx.lifecycle.lifecycle-common-2.0.0.jar) and lifecycle-common-2.3.1 (androidx.lifecycle:lifecycle-common:2.3.1)
여기까지 되었으면 프로젝트를 Sync 해준다.
Sync 가 무사히 잘 되면 이제 네이티브 코드에서 startActivity 로 유니티 프로젝트를 실행시켜줄 차례이다.
그전에 해야할 중요한 작업이 있다.
유니티 프로젝트에서 필요로 하는 resource 들을 복사해서 등록해준다.
여기서도 시간을 많이 보내왔고 해결책을 찾은것은 strings 파일의 아래 부분이다.
<string name="game_view_content_description">Game view</string>
위의 부분을 Android Studio 프로젝트 res > strings 파일에 복사해주고
필자는 ids 와 styles 모두 복사를 해버렸다.
이제 마지막으로 유니티를 실행시켜줄 코드는 단 한줄
startActivity(Intent(this@MainActivity, UnityPlayerActivity::class.java))
필자는 MainActivity 에서 버튼을 누를때 실행을 했으므로 위와같이 작성했다.
이대로 실행시키면 당연히 Manifest 에러가 날것이므로 Manifest 에 UnityPlayerActivity 를 등록해준다.
이부분은 원본 유니티의 Manifest 에서 복사를 해오도록 한다.
이때, 유니티 프로젝트 폴더의 Manifest 파일에서 수정을 해야 할 부분이 있다.
바로 Intent Filter 이다.
이부분을 삭제 하지 않으면 앱이 2개가 설치가 된다.
이제 끝이다.
실행을 하고 빌드 잘 되는지 살펴본다.
추가.
Menifest에서 unityplayer 부분의 android:process는 유니티 플레이어를 종료하고 네이티브 앱 화면으로 돌아오고 싶은 경우, 유니티에서 Application.Quit() 을 하는데
이렇게 하면 무슨수를 써도 앱이 종료가 되버린다.
SIGKILL 9 와 함께..
여기서도 굉장히 많은 시간을 보냈는데
해결책은 저 한줄이었다.
저 한줄만 넣고 유니티에서 종료 코드만 넣으면 유니티 플레이어만 종료되고 기존 앱 화면으로 돌아올수 있다.
이로써 초보 코틀러가 유니티를 연동 성공한 과정을 남겨보았다.
stackoverflow와 unity community 를 샅샅히 뒤지며..
선구자들께 감사와 더불어 이글을 보는 개발자분도 훌륭한 프로젝트를 만들수 있길
Cheers!
'Develope > JAVA' 카테고리의 다른 글
Unity 프로젝트 export - Android Studio에서 실행하기 (0) | 2021.12.13 |
---|---|
Android BLE Marshmallrow OS bug? (0) | 2016.06.12 |
- Total
- Today
- Yesterday
- 파이썬
- ios
- 엘라스틱서치
- 사물인터넷
- object-C
- Deeplearning
- swift
- mysql
- 스위프트
- diy
- 리눅스
- 라즈베리파이
- Android
- php
- 우분투
- 서버
- OpenCV
- xcode
- 인공지능
- ubuntu
- 미세먼지
- Python
- 딥러닝
- 캠핑
- 강좌
- 머신러닝
- 아이폰
- IOT
- 공기청정기
- 아두이노
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |