세상사는 이야기 / 도움이 되었다면 배너 클릭 부탁드려요~ →→→

2019년 11월 20일 수요일

[Jenkins Window] error : Build step 'Execute Windows batch command' marked build as failure

[Jenkins Window] error : Build step 'Execute Windows batch command' marked build as failure

C:\Program Files (x86)\Jenkins\workspace\kor>exit 1
Build step 'Execute Windows batch command' marked build as failure
Finished: FAILURE


Unity + Jenkins(Window) Build  첫 빌드 후
Build step 'Execute Windows batch command' marked build as failure
window batch 명령 실행 중 에러 발생!

여러 에러가 있지만
첫 빌드시 에러의  첫번째 해결책은 jenkins 서비스에 시스템 계정을 로그인하면 된다.

1. 서비스 창을 연다
  • 1. window 검색 -> services.msc
  • 2. cmd -> services.msc
2. 서비스(로컬) -> jenkins -> 로그온 -> 계정지정 유저와 암호를 입력
3. 서비스 재시작
4. 빌드 확인
캡션 추가


로그온 계정 지정이 어려울 경우
  1. 로그온 -> 찾아보기
  2. 사용자선태 -> 고급 -> 지금 찾기 -> 검색결과에 나의 계정을 선택



2019년 11월 6일 수요일

[Unity Android] Unity Ads 추가 에러

Unity Ads를 추가 후 빌드 에러 발생

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':checkReleaseDuplicateClasses'.
> 1 exception was raised by workers:
  java.lang.RuntimeException: Duplicate class com.unity3d.ads.BuildConfig found in modules classes.jar (:UnityAds:) and classes.jar (:unity-ads:)
  Duplicate class com.unity3d.ads.IUnityAdsListener found in modules classes.jar (:UnityAds:) and classes.jar (:unity-ads:)


Asset Store에서 최신 버전의 UnityAds를 설치 했지만
Unity가 Project 생성시 자동으로 Package에 Advertisement를 설치해 놓아서 그렇다.

둘중 하나를 지우면된다.

- 내프로젝트

-  Package

 Packages쪽 Ads를 지운다.


에러 전문

[Unity Android] AndroidManifest.xml 파일 생성

Unity는 Android용 AndroidManifest.xml 파일을 기본으로 생성해 주지 않는다.

AndroidManifest.xml을 Project로 복사하는 방법은 

Android 빌드 후 프로젝트 폴더의 Temp\StagingArea 경로를 보면 AndroidManifest.xml이 있다.

이 파일을 Assets\Plugins\Android 폴더로 복사한 후 파일을 편집해서 사용하면 된다.



2019년 8월 26일 월요일

[Android] Android Device Monitor 실행 시 에러

Android Device Monitor 실행 시 에러 팝업창과 함께 로그파일 경로가 나왔다

이유는 알수 없지만 검색결과 아래 3가지 방법이 나왔다.

  1. Android Studio를 "관리자 권한으로 실행"
  2. "monitor.exe"를 "관리자 권한으로 실행"
  3. 작업 관리자에서 "monitor.exe"를 "작업 끝내기"

나의 해결책은 3번 "monitor.exe'을 "작업 끝내기"하고 '재실행" 하니 해결되었다.




[Unity Editor] Copying assembly from 'Temp/Assembly-CSharp.dll' to 'Library/ScriptAssemblies/Assembly-CSharp.dll' failed

에디터 실행중 SDK를 Import하거나 Git(svn)를 Pull 할때 아래와 같은 에러가 종종 발생한다.

Copying assembly from 'Temp/Assembly-CSharp.dll' to 'Library/ScriptAssemblies/Assembly-CSharp.dll' failed

해결 방법은
1. 가장 쉬운 에디터를 재실행.
2. Project 뷰에서 마우스 우 클릭 후 "Reimport"를 선택해주면 된다.


2019년 8월 5일 월요일

[Unity Tip] MonoBehaviour 스크립트 마법사를 사용한 Unity 메서드 구현

[Unity Tip] MonoBehaviour 스크립트 마법사를 사용한 Unity 메서드 구현

Visual Studio 에서 메서드를 추가할 위치에 커서놓고
단축키 Ctrl + Shift + M 를 사용하면 Create Script Methods에서 원하는 메서드를 검색해서 주석까지 추가할수 있다 (메서드 주석생성 체크)



상세 주석 설명

2019년 7월 25일 목요일

[Unity Android] Android 구글 클라우드 자동 저장 기능 끄기

[Unity Android] Android 구글 클라우드 자동 저장 기능 끄기

앱을 삭제 후 재설치 시 삭제 전에 Data가 남아있는 문제가 있다.
원인은 Android 6.0 (Api Level 23)부터 생긴 자동 저장 기능 때문이다.


AndroidManifest에 android:allowBackup, android:fullBackupContent 속성을 적어주지 않으면 디폴트로 true 설정이 들어가 구글 클라우드에 자동으로 저장되어 앱 삭제 후 재설치 시에 자료가 자동으로 복원된다.
  • android:allowBackup 속성값은 ADB(Android Debug Bridge)를 통해서 앱 백업과 복구를 사용 가능하는 설정
  • android:fullBackupContent 속성값은 Android 6.0 (Api Level 23)부터 구글 클라우드를 이용해 앱의 User Data를 자동 백업하도록 한다

자동 저장을 막기 위해서는 AndroidManifest파일을 아래처럼 설정한다.
 android:allowBackup = "false",  android:fullBackupContent = "false"


다른 플러그인에서 allowBackup 속성을 사용해 충돌이 생길 경우 tools:replace 사용

tools:replace="android:allowBackup"


Plugins/Android/AndroidManifest.xml
<application...
android:allowBackup="false" android:fullBackupContent="false" tools:replace="android:allowBackup"

[Unity Android Tip] Android Studio로 사용하여 Unity 에러 로그 자세히 보기

[Unity Android Tip]  Android Studio로 사용하여 Unity 에러 로그 자세히 보기

Unity Android Build시 여러 에러가 발생하지만 정확한 원인을 찾을수 없을 때가 있다.
이때는 Android Studio로 프로젝트 열면 자세한 정보를 얻을수 있다.

1. Export후 Android Studio로 프로젝트를 열기
2. Android 빌드 후 Temp 폴더 Android Studio로 열기


1. Export후 Android Studio로 프로젝트를 열기
Android Studio 실행 후 Export한 폴더 프로젝트 열기
 Build Settings -> Export Project 체크

Export 후 Android Studio에서 해당 프로젝트를 열어서 빌드하면 자세한 로그가 나온다.


2. Android 빌드 후 Temp 폴더 Android Studio로 열기
Android Studio 실행 후 Temp/gradleOut 폴더 프로젝트 열기

2019년 7월 23일 화요일

[Unity Android] java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication

[Unity Android] java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication: java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication"

1. Android Resolver 1.2.122
2. MultiDex 사용

Android Resolver 1.2.122로 버전을 올리니 mainTemplate.gradle파일에 UseAndroidX가 true로 되어있어서 기존에 사용하던 android.support를 사용할 수 없게 되었다.
AndroidX : 기존 Android 지원 라이브러리를 개선하여 만들었다고 한다.

Plugins/Android/mainTemplate.gradle
// Android Resolver Repos Start
([rootProject] + (rootProject.subprojects as List)).each {
    ext {
        it.setProperty("android.useAndroidX", true)
        it.setProperty("android.enableJetifier", true)
    }
}

AndroidManifest파일에 android.support를 androidx로 바꾸어주면된다.

Plugins/Android/AndroidManifest.xml
<application ....
android:name="android.support.multidex.MultiDexApplication"
->
android:name="androidx.multidex.MultiDexApplication"

참고
https://forum.unity.com/threads/gradle-3-2-0-crashes-app-on-launch.712970/

에러전문

2019년 7월 15일 월요일

[Unity Android] AWS SDK not Work / Unity 2019.+ Error

[Unity Android] AWS SDK Unity 2019.+ Error

AWS SDK를 Unity 2019에서 사용시 아래 에러 발생

- Unity : 2019 +
- SDK : aws-sdk-unity_3.3.542.0

Error Unity Unable to find /usr/lib/libobjc.dylib
Error Unity ArgumentException: Object of type 'System.Object[]' cannot be converted to type 'UnityEngine.AndroidJavaObject[]'.
Error Unity at System.RuntimeType.CheckValue (System.Object value, System.Reflection.Binder binder, System.Globalization.CultureInfo culture, System.Reflection.BindingFlags invokeAttr) [0x00071] in <a6266edc72ee4a578659208aefcdd5e1>:0
Error Unity at System.Reflection.MonoMethod.ConvertValues (System.Reflection.Binder binder, System.Object[] args, System.Reflection.ParameterInfo[] pinfo, System.Globalization.CultureInfo culture, System.Reflection.BindingFlags invokeAttr) [0x00069] in <a6266edc72ee4a578659208aefcdd5e1>:0
Error Unity at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00011] in <a6266edc72ee4a578659208aefcdd5e1>:0
Error Unity at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <a6266edc72ee4a578659208aefcdd5e1>:0



버전이 올라가면서 LINQ query가 바뀌어서 그런듯한다.
아래 링크의 AWSSDK.Core.dll 파일을 다운로드해서 내프로젝트에 붙여넣기 한다.
Download

2019년 7월 11일 목요일

[Unity Android] Unity 2019.1.9 base Custom Gradle Tamplate

[Unity Android] Unity 2019.1.+ base Custom Gradle Tamplate

Unity 2019.1.+에서 사용하는 기본 Custom Gradle Tamplate
Unity 버전이 올라갈때마다 바뀌어서 저장용으로 올려놓는다.

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
    repositories {
        google()
        jcenter()
    }


    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
**BUILD_SCRIPT_DEPS**}
}

allprojects {
    repositories {
        google()
        jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}

apply plugin: 'com.android.application'
**APPLY_PLUGINS**

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}


android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'


    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }


    defaultConfig {
        minSdkVersion **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        applicationId '**APPLICATIONID**'
        ndk {
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'
    }


    lintOptions {
        abortOnError false
    }


    aaptOptions {
        noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**]
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**SIGN**


    buildTypes {
        debug {
            minifyEnabled **MINIFY_DEBUG**
            useProguard **PROGUARD_DEBUG**
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD****SIGNCONFIG**
            jniDebuggable true
        }
        release {
            minifyEnabled **MINIFY_RELEASE**
            useProguard **PROGUARD_RELEASE**
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD****SIGNCONFIG**
        }
    }**PACKAGING_OPTIONS****SPLITS**
**BUILT_APK_LOCATION**
**EXTERNAL_SOURCES**
    bundle {
        language {
            enableSplit = false
        }
        density {
            enableSplit = false
        }
        abi {
            enableSplit = true
        }
    }
}**SPLITS_VERSION_CODE****REPOSITORIES****SOURCE_BUILD_SETUP**


[Unity Facebook Plugin] Facebook.Unity.Android.dll, Facebook.Unity.IOS.dll Delete the one of the duplicate plugins.

[Unity Plugin] Facebook.Unity.Android.dll, Facebook.Unity.IOS.dll Delete the one of the duplicate plugins.

Unity Facebook SDK를 7.17.+로 올렸더니 아래 에러 발생
Found plugins with same names, Assets/FacebookSDK/Plugins/Android/Facebook.Unity.IOS.dll and Assets/FacebookSDK/Plugins/iOS/Facebook.Unity.IOS.dll. Delete the one of the duplicate plugins.
UnityEditor.AndroidPluginImporterExtension:CheckFileCollisions(String)
UnityEditorInternal.PluginsHelper:CheckFileCollisions(BuildTarget) (at C:/buildslave/unity/build/Editor/Mono/Plugins/PluginsHelper.cs:25)
UnityEditor.BuildPipeline:BuildPlayer(String[], String, BuildTarget, BuildOptions)


Found plugins with same names, Assets/FacebookSDK/Plugins/iOS/Facebook.Unity.Android.dll and Assets/FacebookSDK/Plugins/Android/Facebook.Unity.Android.dll. Delete the one of the duplicate plugins.
UnityEditor.AndroidPluginImporterExtension:CheckFileCollisions(String)
UnityEditorInternal.PluginsHelper:CheckFileCollisions(BuildTarget) (at C:/buildslave/unity/build/Editor/Mono/Plugins/PluginsHelper.cs:25)
UnityEditor.BuildPipeline:BuildPlayer(String[], String, BuildTarget, BuildOptions)

프로젝트 검색 결과 같은 이름의 DLL파일이 있다.
Plugin을 해당 Platform에 맞게 설정한다.
FacebookSDK/Plugins/Android 폴더
Facebook.Unity.Android
Facebook.Unity.IOS


FacebookSDK/Plugins/Ios 폴더
Facebook.Unity.Android
Facebook.Unity.IOS


공식 git
v7.17.0 dll platforms setting error
https://github.com/facebook/facebook-sdk-for-unity/issues/266

2019년 5월 28일 화요일

[Android]Unity Android Resolver (1.2.111) mainTemplate.gradle설정

Unity Android 64bit 이슈로 
Android Resolver 버전(1.2.111)이 올라가면서 mainTemplate.gradle 파일의 설정이 변경되어서 정리 해 보았다

Unity 2018.3
Android Resolver(1.2.111)
 - firebase_unity_sdk_6.0.0
 - facebook-unity-sdk-7.15.1
 - GooglePlayGamesPlugin-0.9.64

 - GoogleMobileAds-v3.17.0

mainTemplate.gradle
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
    repositories {
        google()
        jcenter()
    }


    dependencies {
            classpath 'com.android.tools.build:gradle:3.2.0'
**BUILD_SCRIPT_DEPS**}
}


allprojects {
    repositories {
        google()
        jcenter()
        flatDir {
            dirs 'libs'
        }


        maven {
            url 'https://google.bintray.com/exoplayer/'
        }
    }
}


// Android Resolver 자동 생성 (1.2.111)
// Android Resolver Repos Start
allprojects {
    repositories {
        maven {
            url "https://maven.google.com"
        }
        maven {
            url "file:///C:/WORKSPACE/Assets/Firebase/m2repository" // Assets/Firebase/Editor/AppDependencies.xml:20, Assets/Firebase/Editor/MessagingDependencies.xml:22
        }
        maven {
            url "https://jcenter.bintray.com/" // Assets/GoogleMobileAds/Editor/FacebookMediationDependencies.xml:7, Assets/GoogleMobileAds/Editor/FacebookMediationDependencies.xml:12, Assets/GoogleMobileAds/Editor/UnityMediationDependencies.xml:7, Assets/GoogleMobileAds/Editor/UnityMediationDependencies.xml:12
        }
        maven {
            url "https://maven.google.com/" // Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml:7
        }
        maven {
            url "https://jcenter.bintray.com" // Assets/GoogleMobileAds/Editor/VungleMediationDependencies.xml:7
        }
        maven {
            url "https://jitpack.io" // Assets/GoogleMobileAds/Editor/VungleMediationDependencies.xml:12
        }
        maven {
            url "file:///C:/WORKSPACE/Assets/GooglePlayGames/Editor/m2repository" // Assets/GooglePlayGames/Editor/GooglePlayGamesPluginDependencies.xml:11
        }
        mavenLocal()
        jcenter()
        mavenCentral()
    }
}
// Android Resolver Repos End

apply plugin: 'com.android.application'
**APPLY_PLUGINS**


dependencies {
    compile 'com.android.support:multidex:1.0.2'


    compile fileTree(dir: 'libs', include: ['*.jar'])


// Android Resolver 자동 생성 (1.2.111)
// Android Resolver Dependencies Start
    compile 'com.android.support:appcompat-v7:25.3.1' // Facebook.Unity.Editor.AndroidSupportLibraryResolver.addSupportLibraryDependency
    compile 'com.android.support:cardview-v7:25.3.1' // Facebook.Unity.Editor.AndroidSupportLibraryResolver.addSupportLibraryDependency
    compile 'com.android.support:customtabs:25.3.1' // Facebook.Unity.Editor.AndroidSupportLibraryResolver.addSupportLibraryDependency
    compile 'com.android.support:support-v4:25.3.1' // Facebook.Unity.Editor.AndroidSupportLibraryResolver.addSupportLibraryDependency
    compile 'com.applovin:applovin-sdk:8.1.4' // Assets/GoogleMobileAds/Editor/AppLovinMediationDependencies.xml:6
    compile 'com.facebook.android:audience-network-sdk:5.0.1' // Assets/GoogleMobileAds/Editor/FacebookMediationDependencies.xml:12
    compile 'com.github.vungle:vungle-android-sdk:6.3.24' // Assets/GoogleMobileAds/Editor/VungleMediationDependencies.xml:12
    compile 'com.google.ads.mediation:applovin:8.1.4.0' // Assets/GoogleMobileAds/Editor/AppLovinMediationDependencies.xml:4
    compile 'com.google.ads.mediation:facebook:5.0.1.0' // Assets/GoogleMobileAds/Editor/FacebookMediationDependencies.xml:7
    compile 'com.google.ads.mediation:unity:3.0.0.0' // Assets/GoogleMobileAds/Editor/UnityMediationDependencies.xml:7
    compile 'com.google.ads.mediation:vungle:6.3.24.0' // Assets/GoogleMobileAds/Editor/VungleMediationDependencies.xml:7
    compile 'com.google.android.gms:play-services-ads:17.2.0' // Assets/GoogleMobileAds/Editor/GoogleMobileAdsDependencies.xml:7
    compile 'com.google.auto.value:auto-value-annotations:1.6.3' // Assets/Firebase/Editor/AppDependencies.xml:22
    compile 'com.google.firebase:firebase-analytics:16.5.0' // Assets/Firebase/Editor/MessagingDependencies.xml:15
    compile 'com.google.firebase:firebase-app-unity:6.0.0' // Assets/Firebase/Editor/AppDependencies.xml:20
    compile 'com.google.firebase:firebase-common:17.0.0' // Assets/Firebase/Editor/AppDependencies.xml:13
    compile 'com.google.firebase:firebase-iid:[18.0.0]' // Assets/Firebase/Editor/MessagingDependencies.xml:13
    compile 'com.google.firebase:firebase-messaging:18.0.0' // Assets/Firebase/Editor/MessagingDependencies.xml:17
    compile 'com.google.firebase:firebase-messaging-unity:6.0.0' // Assets/Firebase/Editor/MessagingDependencies.xml:22
    compile 'com.google.games:gpgs-plugin-support:0.9.64' // Assets/GooglePlayGames/Editor/GooglePlayGamesPluginDependencies.xml:11
    compile 'com.unity3d.ads:unity-ads:3.0.0' // Assets/GoogleMobileAds/Editor/UnityMediationDependencies.xml:12
// Android Resolver Dependencies End

**DEPS**
}


android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'


    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }


    defaultConfig {
        minSdkVersion **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        applicationId '**APPLICATIONID**'
        ndk {
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'


        multiDexEnabled true
    }


    lintOptions {
        abortOnError false
    }


    dexOptions {
        jumboMode = true
        javaMaxHeapSize "4g"
    }


    aaptOptions {
        noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**]
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**SIGN**


    buildTypes {
          debug {
            minifyEnabled **MINIFY_DEBUG**
            useProguard **PROGUARD_DEBUG**
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD****SIGNCONFIG**
            jniDebuggable true
        }
        release {
            minifyEnabled **MINIFY_RELEASE**
            useProguard **PROGUARD_RELEASE**
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD****SIGNCONFIG**
        }
    }**PACKAGING_OPTIONS****SPLITS**
**BUILT_APK_LOCATION**
**EXTERNAL_SOURCES**
    bundle {
        language {
            enableSplit = false
        }
        density {
            enableSplit = false
        }
        abi {
            enableSplit = true
        }
    }
}**SPLITS_VERSION_CODE****REPOSITORIES****SOURCE_BUILD_SETUP**



2019년 5월 17일 금요일

[Unity Android] ClassNotFoundException com.google.games.bridge.TokenFragment

Unity Android 64bit 빌드중 에러가 발생하여서 기존 SDK를 전부 버전업했다.
unity-jar-resolver 1.2.108, 1.2.109 버전이 아래와 같은 토큰 에러가 발생.
아래 설명처럼 1.2.110이상으로 설치하면 된다.

ClassNotFoundException com.google.games.bridge.TokenFragment after updating from version 1.2.104 to 1.2.108


05-06 11:12:23.462 16323-16386/ W/Unity: *** [Play Games Plugin DLL] 05/06/19 11:12:23 +02:00 ERROR: Exception launching token request: java.lang.ClassNotFoundException: com.google.games.bridge.TokenFragment


참고 링크
https://github.com/googlesamples/unity-jar-resolver/issues/208


아래 링크에서 Unity-jar-resolver버전을 안정된 버전으로 유지하도록 하자
https://github.com/googlesamples/unity-jar-resolver/

Error Log

2019년 3월 20일 수요일

[Unity] Emoji 입력 후 처리

[Unity] Emoji 입력 못받게 하는법
버전 Unity 2018.3

Nick Name이나 채팅에서 유저가 Emoji를 선택 하면 삭제 또는 막는법을 설명한다.

[Android]
android는 입력된 Emoji 찾아 삭제하면 된다.
#if UNITY_ANDROID
            mLabel = Regex.Replace(inputName.text,  "[\uD83C-\uDBFF\uDC00-\uDFFF\u1F30-\u1F5F]+", "").Trim(); // Emoji 삭제 , Trim
#endif

[IOS]
ios는 문자를 바꿀수 없어서 Emoji를 막는 방법은 3가지를 소개한다.
유저가 Emoji눌러도 InputField에는 입력이 들어오지 않게 하는 방법으로
개인적으로는 소스코드 보다 info.list를 수정하는 방법을 추천한다.
코드 수정시 빌드때마다 수정해 주어야한다.

1. Unity IOS 빌드 후 XCode Project에 UI/KEyboard.mm 파일을 찾아서
stringContainsEmoji() 함수의 return값을 항상 NO 처리 하면된다.
static bool stringContainsEmoji(NSString *string)
{
    return NO;
}

2. Unity IOS 빌드 후 XCode Project에 UI/KEyboard.mm 파일의 상위 define 을 1로 수정
#define FILTER_EMOJIS_IOS_KEYBOARD 1 // Disable

3. Xcode info.list 파일 수정
Info.list파일에 아래 필더를 등록하여 define을 바꾸어 준다.
buildSettings / PreprocessorMacros
FILTER_EMOJIS_IOS_KEYBOARD=1

Unity 에서 Info.list파일을 생성해주는 에셋 및 방법은 많다
무료에셋으로 egoxproject를 사용하면 쉽게 추가할 수 있다.

2019년 3월 16일 토요일

[IOS] xcode 설치된 프로비저닝 삭제

설치 위치로 가서 불필요한것을 삭제한다.

/Users/<USER_NAME>/Library/MobileDevice/Provisioning Profiles 폴더로 이동

설치된 프로비저닝 삭제

2019년 2월 28일 목요일

[Unity IOS] Could not extract GUID in text file project/Scene.unity at line xxx

[Unity IOS] Could not extract GUID in text file project/Scene.unity at line 50.

Atlas 작업중 아래와 같은 에러가 종종 발생한다.
AOS는 문제가 없지만 IOS 빌드시에는 아래 에러때문에 빌드가 되지 않는다.

원인은 guid key 값이 000000000000000000000000으로 들어가서 그렇다.
해당 부분을 찾아서  fileID : 2를 0으로 바꾸어 주고 guid를 삭제하면 된다.

texture: {fileID: 2, guid: 00000000000000000000000000000000, type: 0}
->
texture: {fileID: 0}

Error

원인

fileID를 수정


소스로 수정
List<string> scenePaths = new List<string>();
foreach (UnityEditor.EditorBuildSettingsScene S in  UnityEditor.EditorBuildSettings.scenes)
{
    if (S.enabled)
        scenePaths.Add(S.path);
}
string changeString = "texture: {fileID: 0}";
foreach (string str in scenePaths)
{
    string tempPath = Application.dataPath.Replace("Assets", "") + str;
    string[] allLines = File.ReadAllLines(tempPath);
    for (int i = 0; i<allLines.Length; ++i)
    {
        string lineStr = allLines[i];
        if (lineStr.Contains("fileID:") && lineStr.Contains("guid:  00000000000000000000000000000000"))
        {
            lineStr.Remove(0, lineStr.Length);
            lineStr += changeString;
        }
    }
    File.WriteAllLines(tempPath, allLines);
}

2019년 1월 29일 화요일

[Unity Android] Unity 2018 - mainTemplate.gradle 정리

[Unity Android] 버전 체크 mainTemplate.gradle 파일

Unity 2018.3 버전에서 사용

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
    repositories {
        if (GradleVersion.current() >= GradleVersion.version("4.2")) {
            jcenter()
            google()
        } else {
            jcenter()
        }
        maven { url "https://maven.google.com/"}
    }


    dependencies {
           // use newer version of the plugin for newer unity/gradle versions
            if (GradleVersion.current() < GradleVersion.version("4.0")) {
                classpath 'com.android.tools.build:gradle:2.1.0'
            } else if (GradleVersion.current() < GradleVersion.version("4.2")) { // Unity 2018.1 : Gradle version 4.0.1
            classpath 'com.android.tools.build:gradle:2.3.3'
            } else {                        // Unity 2018.2 : Gradle version 4.2.1
                classpath 'com.android.tools.build:gradle:3.0.1'
            }
    }
}


allprojects {
    repositories {
        if (GradleVersion.current() >= GradleVersion.version("4.2")) {
            jcenter()
            google()
        } else {
            jcenter()
        }


        maven { url 'https://maven.google.com'}
        flatDir {
            dirs 'libs'
        }
    }
}


apply plugin: 'com.android.application'


dependencies {
    compile 'com.android.support:multidex:1.0.1'


    if (GradleVersion.current() >= GradleVersion.version("4.2")) {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    } else {
        compile fileTree(dir: 'libs', include: ['*.jar'])
    }
**DEPS**
}


android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'


    if (GradleVersion.current() < GradleVersion.version("4.2")) {
        // fix complaint that 3rd party libraries have the same package name
        enforceUniquePackageName false
    }


    defaultConfig {
        minSdkVersion    **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        applicationId '**APPLICATIONID**'
        
        versionCode    **VERSIONCODE**
        versionName    '**VERSIONNAME**'


        // Enabling multidex support.
        multiDexEnabled true


        if (GradleVersion.current() >= GradleVersion.version("4.0")) {
            ndk {
                abiFilters **ABIFILTERS**
            }
        }
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }


    lintOptions {
        abortOnError false
    }


    aaptOptions {
        noCompress '.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**
    }


**SIGN**
    buildTypes {
          debug {
             minifyEnabled **MINIFY_DEBUG**
            if (GradleVersion.current() >= GradleVersion.version("4.2")) {// > Build-in class shrinker and multidex are not supported yet.
                useProguard **PROGUARD_DEBUG**            
            }
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
              jniDebuggable true
          }
          release {
             minifyEnabled **MINIFY_RELEASE**
             if (GradleVersion.current() >= GradleVersion.version("4.2")) {// > Build-in class shrinker and multidex are not supported yet.
                useProguard **PROGUARD_RELEASE**
            }
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
              **SIGNCONFIG**
          }
    }
**PACKAGING_OPTIONS**
}


**SOURCE_BUILD_SETUP**


2019년 1월 3일 목요일

[Unity Android] Admob - The Google Mobile Ads SDK was initialized incorrectly.

[Unity Android] Admob - The Google Mobile Ads SDK was initialized incorrectly.

Unity Admob SDK 추가 후 에러 발생
AdMob AppID를 설정하지 않아서 발생하는 에러로 AndroidManifest.xml파일에 AppID 추가 하면 된다.

아래 에러에 나와있는 링크를 보면 해당 설명을 따라하면된다.
https://goo.gl/fQ2neu




GoogleMoblieAdsPlugin 폴더 AndroidManifest.xml파일 AppID 추가

Assets/Plugins/Android/GoogleMobileAdsPlugin/AndroidManifest.xml
  • APPLICATION_ID 추가
<?xml version="1.0" encoding="utf-8"?>
<!--
This Google Mobile Ads plugin library manifest will get merged with your
application's manifest, adding the necessary activity and permissions
required for displaying ads.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.unity.ads"
    android:versionName="1.0"
    android:versionCode="1">
  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
  <application>
    <!-- Your AdMob App ID will look similar to this sample ID: ca-app-pub-3940256099942544~3347511713 -->
    <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713"/>
  </application>
</manifest>


2019년 1월 2일 수요일

[Android] IAP Subscription Google 영수증 정보

[Android] IAP Subscription Google 영수증 정보

UnityIAP 구독 처리 진행 Google 영수증 정보
https://docs.unity3d.com/kr/2017.4/Manual/UnityIAPPurchaseReceipts.html
https://developer.android.com/google/play/billing/billing_reference.html

로그인 시 "IAP 구독 상품"이 있는지 확인을 위한 "구독 영수증 정보"를 정리했다.
구글에서는 "IAP 구독 테스트"를 위해 기간에 상관없이 5분에 한번씩 결제가 되어서 빠르게 영수증 정보가 확인 가능하다.(자동으로 5번까지 결제됨)

1. 구독 첫 결제
autoRenewing = true
GPA.1234-1234-1234-12345 -
{
    "Store":"GooglePlay",
    "TransactionID":"GPA.1234-1234-1234-12345",
    "Payload":"
    {
        \"json\":\"
        {
            \\\"orderId\\\":\\\"GPA.1234-1234-1234-12345\\\",
            \\\"packageName\\\":\\\"com.kor.fms\\\",
            \\\"productId\\\":\\\"com.kor.fms.mysoldierpack\\\",
            \\\"purchaseTime\\\":1545900055028,
            \\\"purchaseState\\\":0,
            \\\"developerPayload\\\":\\\"
            {
                \\\\\\\"developerPayload\\\\\\\":\\\\\\\"asdfokjdfsafOTI0N3M2RljEz\\\\\\\\n\\\\\\\",
                \\\\\\\"is_free_trial\\\\\\\":false,
                \\\\\\\"has_introductory_price_trial\\\\\\\":false,
                \\\\\\\"is_updated\\\\\\\":false
            }
            \\\",
            \\\"purchaseToken\\\":\\\"maddfaddkoodicpdkdclfpdf.AO-Rl-PBiB3myqbdk4zyWht_DFdfdfWyNVNmutQXSAD\\\",
            \\\"autoRenewing\\\":true
        }\",
        \"signature\":\"5t7anjvTKxP9zOIpqWqqS2A5n\y......wcQlJywnpE4yb8VtGZAsiWkFB06BF5EMA==\",
        \"skuDetails\":\"
        {
            \\\"productId\\\":\\\"com.kor.kor.subsoldierpack\\\",
            \\\"type\\\":\\\"subs\\\",
            \\\"price\\\":\\\"₩3,900\\\",
            \\\"price_amount_micros\\\":3900000000,
            \\\"price_currency_code\\\":\\\"KRW\\\",
            \\\"subscriptionPeriod\\\":\\\"P1W\\\",
            \\\"title\\\":\\\"Soldier Pack(7days)\\\",
            \\\"description\\\":\\\"300 Gems immediately.\\\\nAnd more during the subscription period.\\\"
        }\",
        \"isPurchaseHistorySupported\":true
    }"
}


1-1. 구독 정보 확인
GPA.1234-1234-1234-12345 -
{
"Store":"GooglePlay",
"TransactionID":"GPA.1234-1234-1234-12345",
"Payload":"
{
\"json\":\"
{
\\\"orderId\\\":\\\"GPA.1234-1234-1234-12345\\\",
\\\"packageName\\\":\\\"com.kor.fms\\\",
\\\"productId\\\":\\\"com.kor.fms.mysoldierpack\\\",
\\\"purchaseTime\\\":1545964510849,
\\\"purchaseState\\\":0,
\\\"developerPayload\\\":\\\"
{
\\\\\\\"developerPayload\\\\\\\":\\\\\\\"asdfokjdfsafOTI0N3M2RljEz\\\\\\\\n\\\\\\\",
\\\\\\\"is_free_trial\\\\\\\":false,
\\\\\\\"has_introductory_price_trial\\\\\\\":false,
\\\\\\\"is_updated\\\\\\\":false
}\\\",
\\\"purchaseToken\\\":\\\"maddfaddkoodicpdkdclfpdf.AO-Rl-PBiB3myqbdk4zyWht_DFdfdfWyNVNmutQXSAD\\\",
\\\"autoRenewing\\\":true
}\",
\"signature\":\"k4naFJ4RxZV7qC33U7D7Q74ouevyhLTXG\\/Rk+\\/BAkPsfwDy8AvJwneEpVgvt05HVqd0N8CwCV4xJEF7if\\/==\",
\"skuDetails\":\"
{
\\\"productId\\\":\\\"com.kor.fms.mysoldierpack\\\",
\\\"type\\\":\\\"subs\\\",
\\\"price\\\":\\\"₩3,900\\\",
\\\"price_amount_micros\\\":3900000000,
\\\"price_currency_code\\\":\\\"KRW\\\",
\\\"subscriptionPeriod\\\":\\\"P1W\\\",
\\\"title\\\":\\\"My Soldier Pack(7days) (MY GAME)\\\",
\\\"description\\\":\\\"300 Gems immediately.\\\\nAnd more during the subscription period.\\\"
}\",
\"isPurchaseHistorySupported\":true
}"
}


2. 구독 두번째 결제 
autoRenewing = true

구독 정보 receipt
GPA.1234-1234-1234-12345 -
{
"Store":"GooglePlay",
"TransactionID":"GPA.1234-1234-1234-12345",
"Payload":"
{
\"json\":\"
{
\\\"orderId\\\":\\\"GPA.1234-1234-1234-12345\\\",
\\\"packageName\\\":\\\"com.kor.fms\\\",
\\\"productId\\\":\\\"com.kor.fms.mysoldierpack\\\",
\\\"purchaseTime\\\":1545964510849,\\\"purchaseState\\\":0,
\\\"developerPayload\\\":\\\"
{
\\\\\\\"developerPayload\\\\\\\":\\\\\\\"asdfokjdfsafOTI0N3M2RljEz\\\\\\\\n\\\\\\\",\
\\\\\\"is_free_trial\\\\\\\":false,
\\\\\\\"has_introductory_price_trial\\\\\\\":false,
\\\\\\\"is_updated\\\\\\\":false
}\\\",
\\\"purchaseToken\\\":\\\"maddfaddkoodicpdkdclfpdf.AO-Rl-PBiB3myqbdk4zyWht_DFdfdfWyNVNmutQXSAD\\\",
\\\"autoRenewing\\\":true
}\",
\"signature\":\"k4naFJ4RxZV7qC33U7D7Q74ouevyhLTXG\\/Rk+\\//BAkPsfwDy8AvJwneEpVgvt05HVqd0N8CwCV4xJEF7if\\/==\",
\"skuDetails\":\"
{
\\\"productId\\\":\\\"com.kor.fms.mysoldierpack\\\",
\\\"type\\\":\\\"subs\\\",
\\\"price\\\":\\\"₩3,900\\\",
\\\"price_amount_micros\\\":3900000000,
\\\"price_currency_code\\\":\\\"KRW\\\",
\\\"subscriptionPeriod\\\":\\\"P1W\\\",
\\\"title\\\":\\\"My Soldier Pack(7days) (MY GAME)\\\",
\\\"description\\\":\\\"300 Gems immediately.\\\\nAnd more during the subscription period.\\\"
}\",
\"isPurchaseHistorySupported\":true
}"
}

3. 구독 취소
autoRenewing = false
signature값이 변경되서 온다

구독 정보 receipt
GPA.1234-1234-1234-12345 - 
{
"Store":"GooglePlay",
"TransactionID":"GPA.1234-1234-1234-12345",
"Payload":"
{
\"json\":\"
{
\\\"orderId\\\":\\\"GPA.1234-1234-1234-12345\\\",
\\\"packageName\\\":\\\"com.kor.fms\\\",
\\\"productId\\\":\\\"com.kor.fms.mysoldierpack\\\",
\\\"purchaseTime\\\":1545964510849,\\\"purchaseState\\\":0,
\\\"developerPayload\\\":\\\"
{
\\\\\\\"developerPayload\\\\\\\":\\\\\\\"asdfokjdfsafOTI0N3M2RljEz\\\\\\\\n\\\\\\\",
\\\\\\\"is_free_trial\\\\\\\":false,
\\\\\\\"has_introductory_price_trial\\\\\\\":false,
\\\\\\\"is_updated\\\\\\\":false}\\\",
\\\"purchaseToken\\\":\\\"maddfaddkoodicpdkdclfpdf.AO-Rl-PBiB3myqbdk4zyWht_DFdfdfWyNVNmutQXSAD\\\",
\\\"autoRenewing\\\":false
}\",
\"signature\":\"qUCNlHNY6TJHZxVMTiaPPO6Fuis\\/De\\//+EJl7G0\\/uolQ\\//E5i5qm5rJFbG60\\/FqqWlbXAgLoeEIzA==\",
\"skuDetails\":\"
{
\\\"productId\\\":\\\"com.kor.fms.mysoldierpack\\\",
\\\"type\\\":\\\"subs\\\",
\\\"price\\\":\\\"₩3,900\\\",
\\\"price_amount_micros\\\":3900000000,
\\\"price_currency_code\\\":\\\"KRW\\\",
\\\"subscriptionPeriod\\\":\\\"P1W\\\",
\\\"title\\\":\\\"My Soldier Pack(7days) (MY GAME)\\\",
\\\"description\\\":\\\"300 Gems immediately.\\\\nAnd more during the subscription period.\\\"
}\",
\"isPurchaseHistorySupported\":true
}"
}

4. 구독 끝 
아무 정보도 오지 않는다.

 구독 정보 receipt
""