목차

반응형

개요

유니티 빌드시 아래 오류가 나서 multidex 설정을 했음에도 불구하고 계속 이 에러가 나는 사람을 대상으로 하는 글이다.

The number of method references in a .dex file cannot exceed 64K

 

https://stackoverflow.com/questions/36785014/the-number-of-method-references-in-a-dex-file-cannot-exceed-64k-api-17

 

The number of method references in a .dex file cannot exceed 64k API 17

I am building an app with SugarORM Library but when I try to build the project for API 17 (didn't check for others) it shows build error. Information:Gradle tasks [:app:assembleDebug] :app:pre...

stackoverflow.com

위 게시물에 설명이 자세하게 나와있다.

 

하지만 나는 설정대로 했지만 계속해서 The number of method references in a .dex file cannot exceed 64K 오류가 났다.

처음에는 특정 라이브러리 문제인가 싶었는데 다른문제였다.

 

해결방법

multiDexEnabled true를 mainTemplate.gradle 파일에 작성하라고 써있지만 그것이 아니라

 

Custom Launcher Gradle Template을 활성화한다음 생성되는 gradle 파일에다가 multiDexEnabled true를 해주면 해결된다.

 

반응형
반응형

유니티에서 메모리 주소에 접근하는 코드를 사용하면 unsafe 관련하여 아래 에러가 발생한다.

Unsafe code may only appear if compiling with /unsafe. Enable "Allow 'unsafe' code" in Player Settings to fix this error.

 

메모리 주소 접근하는 코드를 사용하기 위해서는 unsafe와 fixed 기능을 사용해야 한다.

 

Build Settings > Other Settings > Allow 'unsafe Code'

 

체크를 해준다.

 

그러면 unsafe 함수 사용이 가능하다.

 

언세이프 신택스는 꼭 불안전한건 아니지만 CLR 단에서 에러가 없는지 검증 불가능한 영역이라서 조심히 사용해야하는 부분이라고 나와있다.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/index

 

Unsafe code and pointers - C# Programming Guide

Unsafe code and pointers (C# Programming Guide) In this article --> To maintain type safety and security, C# does not support pointer arithmetic, by default. However, by using the unsafe keyword, you can define an unsafe context in which pointers can be us

docs.microsoft.com

 

반응형
반응형

문제

유니티에서 Navmesh 사용하다가 아래와 같은 오류를 만났다.

RuntimeNavMeshBuilder: Source mesh Plane does not allow read access. This will work in playmode in the editor but not in player

UnityEngine.AI.NavMeshSurface:BuildNavMesh()

Plane이라는 mesh에 대한 오류였다.

 

해결

해당 mesh의 상위 모델 파일에서 Read/Write Enabled를 체크하고 Apply를 하면 해결된다.

반응형
반응형

문제

유니티에서 권한 요청을 하고 나서 수락을 하면 화면이 멈춘다.

 

원인

문제가 발생했을 때 떠놓은 로그다.

음성 녹음 권한을 물어본다. -> Activity pause timeout for ActivityRecord

권한을 물어보는 창에서 잠시 기다리면

Timeout while trying to puase the Unity Engine.이 뜬다. 아마 유니티 엔진이 멈춘 것 같다.

아마 권한 요청을 하면서 잠시 유니티를 멈춘 것 같은데 수락을 해도 아무 로그가 나오지 않고 그 상태에서 멈춰버린다.

 

 

해결

안드로이드 권한을 런타임 중에 획득할 수 있도록 하는 에셋을 이용해서 해결

https://assetstore.unity.com/packages/tools/integration/android-runtime-permissions-117803

 

Android Runtime Permissions - Asset Store

Introductory price.. Not! It will always remain Free. Grab it whenever you want! About This plugin helps you query/request runtime permissions synchronously on Android M and later. Features - It is synchronous! Request a permission and process the result i

assetstore.unity.com

 

필요한 것 3가지

1. android manifest 설정

/Plugins/Android/AndroidManifest.xml

파일에 application 태그 안에 <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" /> 를 추가해준다.

위의 설정으로 유니티에서 자체적으로 권한을 요청하지 않도록 설정한다.

 

2. 필요한 권한 코드 확인

아마 AndroidManifest.xml파일에 필요한 권한이 쓰여있을 것이다.

필요한 권한 코드를 확인해서 기록해놓는다.

3. 권한 획득하는 소스코드 작성

나 같은 경우는 게임을 시작할 때 권한을 요청하고 권한 습득하면 화면을 넘어가도록 해놨다.

 

더 자세한 튜토리얼이 궁금하다면 에셋의 깃 설명서를 참고하도록 하자.

https://github.com/yasirkula/UnityAndroidRuntimePermissions

 

yasirkula/UnityAndroidRuntimePermissions

A native Unity plugin to handle runtime permissions on Android M+ - yasirkula/UnityAndroidRuntimePermissions

github.com

 

반응형
반응형

유니티로 ios로 export하고 xcode로 빌드할 때 발생하는 오류를 모아봤다.

오류파튀~

목차

1. bitcode 활성화 오류

You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target.

2. 페이스북 sdk 오류

duplicate symbol _OBJC_CLASS_$_FBSDKTypeUtility duplicate symbols for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)

3. 빌드하고 실행 시 Uncaught exception

 

4. Undefined symbols for architecture x86_64: _sqlite3_closed

 

5. Undefined symbols for architecture x86_64: _deflate

 

 

 

 

 

1. bitcode 활성화 오류

You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target.

현재 xcode 빌드 옵션에서 bitcode가 켜져 있는데 특정 sdk에 bitcode 적용이 안되어있어서 그렇다.

나의 경우 GA가 비트 코드가 없는 버전인데 비트코드가 있는 sdk로 교체를 해주던가 빌드 옵션에서 꺼주면 된다.

sdk

위의 sdk에서 bitcode가 있는 버전을 받아서 적용하면 정상적으로 빌드가 된다.

또는

Build Settings > Build Options > Enable Bitcode > No

요렇게 해주면 된다.

일단 빌드가 급하다면 bitcode를 끄도록 하자. 결론만 말하자면 비트코드 꺼도 상관없다.

비트 코드에 대한 설명은 다음 글을 확인하도록 하자.

https://ajh322.tistory.com/203

불러오는 중입니다...

2. 페이스북 sdk 오류

duplicate symbol _OBJC_CLASS_$_FBSDKTypeUtility duplicate symbols for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)

라이브러리가 겹쳐서 발생한다고 하는데 정확히 무슨 오류인지까지는 안 찾아봤고 해결하려면

Build Phases > Link Binary With Libraries 에서 FBSDKCoreKit.framework를 없애주면 잘 작동한다.

3. 빌드하고 실행 시 Uncaught exception

실행하면 gsCrashReporterUEHandler 에서 오류가 잡히는데 이 오류가 뜨면 빌드까지는 됐는데 앱 실행하고 나서 오류가 발생하는 것이다. 콘솔을 보면 GA 키값을 입력 안 했는데 이 오류가 뜨면 대부분 plist에 써드파티 sdk 키값을 입력하지 않아서 발생한다.

4. Undefined symbols for architecture x86_64: _sqlite3_closed

라이브러리 중에 sqlite와 관련된 라이브러리가 안 들어가 있어서 발생한다고 하는데 아직도 잘 모르겠는데 어느 날부터 이 오류가 안 생기기 시작했다.

Build Phases > Link Binary With Libraries > 추가

Add Other 클릭 > Cmd + Shift + G를 눌러서 경로 입력창 띄움.

/usr/lib 이동

lib 경로에서 libsqlite3.dylib 추가

라이브러리 추가해주고 빌드하면 된다.

5. Undefined symbols for architecture x86_64: _deflate

4번과 비슷한 오류다.

lib 경로 아래에서 libz.dylib를 추가해준다.

반응형
반응형

IAP 모듈을 사용하려는데 어쩌다가 소스가 조금 더러워졌는데 그 이후로 계속해서 아래 오류가 뜨면서 IAP가 작동을 안하고 컴파일이 안된다.

Assets/MoPub/Scripts/IapManager.cs(81,53): error CS0103: The name 'StandardPurchasingModule' does not exist in the current context

Assets/MoPub/Scripts/IapManager.cs(123,37): error CS0103: The name 'GooglePlay' does not exist in the current context

 

서비스로 가서 IAP reimport 하라고 해도 안된다.

 

그럴때는 Assets/Plugins/UnityPurchasing 폴더로 가보면 3개의 unitypackage 파일이 있을터인데

그 3개의 unitypackage 파일을 전부다 불러와서 덮어씌워주자

그러면 깔끔하게 해결된다.

반응형
반응형

유니티의 애드몹은 안내가 매우 친절해서 딱히 가이드까지 올릴 필요는 없지만 가이드에 나와있지 않은 오류들을 설명하고자 한다.

 

유니티 애드몹 광고 출시 버전 모아놓은 곳

https://github.com/googleads/googleads-mobile-unity/releases

 

googleads/googleads-mobile-unity

Official Unity Plugin for the Google Mobile Ads SDK - googleads/googleads-mobile-unity

github.com

 

2019년 8월 1일 기준 유니티 애드몹 최신 버전은 3.18.2다.

적용도중 발생한 오류들을 기재하겠다.

 

목차

1. 애드몹 패키지 resolve 오류

2. 앱 빌드, 실행 시 AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener 오류

3. 앱 빌드, 실행 시 java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException 오류

4. 광고 테스트 시 유의 사항

 

 

1. 애드몹 패키지 resolve 오류

애드몹 패키지 임포트 후 android dependency resolve 과정

 

android resolve 도중 오류 발생

유니티 애드몹 패키지 임포트를 하면 알아서 android resolve를 진행하지만 위와 같이 Resoultion failed가 발생하면서 정상적으로 유니티 애드몹 패키지의 설치가 되지 않는다.

이 에러를 무시하고 빌드를 하게 되면 본문의 2번 오류로 이어질 가능성이 높다.

해당 에러 메시지가 난 후 Assets\Plugins\Android 경로로 이동해서 jar, aar 파일이 충분히 있는지 확인해보자

본인은 resolution failed 에러로 인하여 jar 파일과 aar 라이브러리 파일이 충분히 설치되지 않아서 빌드하고 실행하면 에러로 이어졌다.

정상적으로 설치가 되었다면 아래와 같이 파일들이 있어야 한다.

유니티 애드몹 패키지 정상 설치

해결 방법

간단하다. 현재 본인이 설치한 유니티 애드몹 패키지보다 높거나 낮은 버전으로 설치해본다.

본인은 2019.1.8f1 버전으로 Google Mobile Ads Unity Plugin v3.18.2를 설치했으나 위의 오류가 발생해서

3.18 버전으로 설치했더니 잘 작동했다.

https://github.com/googleads/googleads-mobile-unity/releases/tag/3.18.0

 

googleads/googleads-mobile-unity

Official Unity Plugin for the Google Mobile Ads SDK - googleads/googleads-mobile-unity

github.com

 

 

2. 앱 빌드, 실행 시 AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener 오류

1번의 연장선상의 문제인데 이 에러는 되게 자주 보는데 설치가 정상적으로 안됐을때 뿐만 아니라 설치를 정상적으로 했지만 라이브러리에 필수 요소가 빠져있거나 하면 자주 만나는 오류 메시지다.

스스로 원인을 파악하고 해결 방법을 찾아내는 방법 과정에 대해서 말하겠다.

 

저 오류 메시지는 라이브러리 파일안에 OnInitializationCompleteListener 클래스가 없어서 발생하는 오류다.

일단 Assets\Plugins\Android 폴더로 가면 aar 파일과 jar 파일이 있다.(본인의 경우 해당 오류가 발생했을때 unity-plugin-library.jar 파일 하나밖에 없었다.)

파일을 압축해제 프로그램으로 열어보면

 

해당 라이브러리는 com.google.unity.ads 형식의 구조를 가지고 있음을 알고 있다.

아까 오류 메시지에서는 com.google.android.gms.ads.initialization.OnInitializationCompleteListener이라고 했으니까 구조가 달라도 한참 다르다는 것을 알 수있다.

(이번에 발생한 오류는 위의 오류가 아니지만 jar 파일들을 뒤지다가 오류와 똑같은 구조지만 에러가 발생하는 경우는 라이브러리의 버전이 달라서 발생하는 오류다.)

그렇다면 도대체 어떤 라이브러리를 받아야 저 클래스가 있는지 확인해보도록 하자

 

확인하는 방법은 maven 라이브러리 사이트로 가서 해당 구조를 검색하면 된다.

https://mvnrepository.com/artifact/

 

Maven Repository: com.google.android.gms » play-services-ads

 

mvnrepository.com

 

어느정도 상위 구조에서 검색을 한다. com.google.android.gms로 검색을 하였다.

검색 결과가 매우 많다. gms 아래에 다양한 서비스가 존재해서 그렇다.

그 중에 우리는 ads에 대하여 설치를 했지만 오류가 생긴것이니까 3번째가 가장 의심된다. 들어가보도록 하자

 

다양한 버전이 있는데 최신 버전을 눌러보자

 

Gradle을 선택하고 하단에 가보면 저렇게 다양한 하위 라이브러리들이 존재함을 알 수 있다.

분명 저중에 하나의 라이브러리는 com.google.android.gms.ads.initialization.OnInitializationCompleteListener 클래스를 가지고 있을 것 이다.

하지만 나한테는 지금 하나의 jar 파일밖에 없으니까 라이브러리의 설치가 정상적으로 진행되지 않았음을 짐작할 수 있다.

시도해볼수있는 방법은 저 라이브러리를 수동으로 다운받아서 넣어주거나 gradle에다가 넣어서 설치해봐도 되지만 android resolve 과정에서 오류가 났기 때문에 쉽게 해결될 오류가 아니라서 유니티 애드몹 버전을 낮추거나 높여서 설치해보도록 하자.

 

 

3. 앱 빌드, 실행 시 java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException 오류

 

앱을 빌드하고 실행하면 바로 종료되면서 아래 오류가 발생한다.

 

유니티 애드몹 키값을 입력하지 않아서 발생하는 문제다.

 

위의 경로로 따라가서 app id를 기입해주면 정상작동 한다.

 

4. 광고 테스트 시 유의 사항

요건 나도 몰랐던건데 애드몹에서 광고 작동 테스트를 하려고 광고 호출할때는 항상 테스트 광고를 사용하라는 경고가 있다.

광고를 탭하지 않아도 정지당할 수 있다니까 꼭 유의해야겠다.

반응형
반응형

Scope was not disposed! You should use the 'using' keyword or manually call Dispose.

UnityEngine.Scope:Finalize()

 

MissingReferenceException: The object of type 'MonoScript' has been destroyed but you are still trying to access it.

Your script should either check if it is null or you should not destroy the object.

UnityEngine.Object.get_name () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEngineObject.bindings.cs:198)

UnityEditor.ScriptExecutionOrderInspector+DragReorderGUI.IsDefaultTimeElement (UnityEditor.MonoScript element) (at /Users/builduser/buildslave/unity/build/Editor/Mono/Inspector/ScriptExecutionOrderInspector.cs:653)

UnityEditor.ScriptExecutionOrderInspector+DragReorderGUI.DragReorder (UnityEngine.Rect position, System.Int32 elementHeight, System.Collections.Generic.List`1[T] elements, UnityEditor.ScriptExecutionOrderInspector+DragReorderGUI+DrawElementDelegate drawElementDelegate) (at /Users/builduser/buildslave/unity/build/Editor/Mono/Inspector/ScriptExecutionOrderInspector.cs:694)

UnityEditor.ScriptExecutionOrderInspector.OnInspectorGUI () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Inspector/ScriptExecutionOrderInspector.cs:542)

UnityEditor.AssetSettingsProvider.OnGUI (System.String searchContext) (at /Users/builduser/buildslave/unity/build/Editor/Mono/Settings/Providers/AssetSettingsProvider.cs:94)

UnityEditor.SettingsWindow.DrawControls () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Settings/SettingsWindow.cs:310)

UnityEditor.SettingsWindow.DrawSettingsPanel () (at /Users/builduser/buildslave/unity/build/Editor/Mono/Settings/SettingsWindow.cs:301)

UnityEngine.Experimental.UIElements.IMGUIContainer.DoOnGUI (UnityEngine.Event evt, UnityEngine.Matrix4x4 worldTransform, UnityEngine.Rect clippingRect, System.Boolean isComputingLayout) (at /Users/builduser/buildslave/unity/build/Modules/UIElements/IMGUIContainer.cs:244)

UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

 

오류는 다음과 같다.

유니티를 꽤나 자주 만지다 보니 이런 형태의 에러를 자주 접하는데

본인이 작업했던 스크립트에 대한 오류가 아니고 오류 메시지에 특히 OnGUI 관련된 내용이 많이 나온다면 유니티에서 발생한 오류라고 생각하고 재시작, 빌드 플랫폼 변경을 해보자 이런 형태의 오류는 여태까지 재시작해서 해결 안된적 없었다.

반응형
반응형

문제

유니티에서 게임 오브젝트에 스크립트를 드래그해서 컴포넌트로 추가할 때 아래와 같은 오류 메시지가 발생

Can't add script component 'TestScript' because the script class cannot be found. Make sure that there are no compile errors and that the file name and class name match.

또는

Can't add script behaviour TestScript ,Can't Add Script The script needs to derive from MonoBehaviour!

 

원인

유니티를 공부하는 분이 이 에러 때문에 막히고 있어서 직접 봐보았더니 스크립트명과 스크립트의 클래스명이 달라서 생기는 문제였다.

스크립트 파일 이름과 스크립트에서 구현되어 있는 클래스의 이름이 다르면 컴포넌트로 인식을 못해서 불러오지 못한다.

 

해결

스크립트나 파일명을 하나로 통일한다.

위의 경우 파일명은 TestScript고 스크립트에서 클래스 이름은 Test인데 클래스 이름을 TestScript로 바꾼다.

정상적으로 처리되었다면 다음과 같이 Add Component에서 추가한 컴포넌트가 보인다.

 

반응형
반응형

문제

유니티 포톤 연동 과정에서 에디터 애플리케이션과 빌드 애플리케이션 간의 연동이 안 되는 경우가 발생했다.

이해가 안되는 부분은 다음과 같다.

 

안드로이드 애플리케이션

노트북으로 작업중인 윈도 애플리케이션

맥 에디터 애플리케이션

 

위의 3개 애플리케이션간의 서버 접속은 잘 되지만

맥에서 빌드한 응용 애플리케이션은 자꾸 마스터가 되어서 방에 입장하지 않는 것이다.

 

원인

원인을 찾던 도중 region 설정이 가능하다는 것을 알았다.

마침 내가 맥을 영어 버전으로 사용하고 있던 것이 원이이었던 것일까 region을 하나로 통일하니까 잘 되었다.

 

해결

서버 세팅에서 fixed region을 하나로 바꾸니까 접속이 잘 된다.

반응형