UNITY
Quick Start
์ต์ ๋ฒ์ ๋ค์ด๋ก๋
1. ํ๋ก์ ํธ ์ค์
NaverGame SDK๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Unity์์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค.
Unity์ ๋ฉ๋ด์์ Asset > Import package๋ฅผ ํด๋ฆญํ ๋ค์ Custom Package ๋ํ ์์์์ ๋ค์ด๋ก๋ํ NaverGameSDK-x.x.x.unityPackage ํ์ผ์ ์ ํํ๋ค.
Unity์ ๋ฉ๋ด์์ Asset > Import package๋ฅผ ํด๋ฆญํ ๋ค์ Custom Package ๋ํ ์์์์ ๋ค์ด๋ก๋ํ NaverGameSDK-x.x.x.unityPackage ํ์ผ์ ์ ํํฉ๋๋ค.
import ์์ Custom Package ๋ํ ์์์์ Import๋ฅผ ํด๋ฆญํ๋ฉด NGSDK ํด๋์ Plugins ํด๋๊ฐ ์์ฑ๋ฉ๋๋ค.

NGSDKํด๋์ Sample ํด๋์ ์๋ SampleScene ํ์ผ์๋ ๊ธฐ๋ณธ์คํ ๋ฒํผ์ด ํฌํจ๋์ด์์ต๋๋ค. Unity ๋ฒ์ ์ด ์์ดํ ๊ฒฝ์ฐ SampleScene์ด ์ ์์ ์ผ๋ก ๋ก๋ฉ๋์ง ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ค์ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ฌ ์๋ก์ด UI๋ฅผ ๊ตฌ์ฑํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
Canvas์ ๋ฒํผ ์์ฑํ๊ธฐ
GameObject > UI > Canvas ๋ฅผ ํด๋ฆญํ์ฌ UGUI Canvas ๋ฅผ ์์ฑํฉ๋๋ค.
NGSDK ํด๋์ Sample ํด๋์ ์๋ SampleButton.Prefab๋ฅผ ์์ฑ๋ Canvas์ ํ์๋ก ๋์ด๋ค ๋์ต๋๋ค. NaverGameSDK์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๋ฒํผ์ด ์์ฑ๋ฉ๋๋ค.

NaverGame SDK ์คํ ๋ฒํผ์ ๊ฐ๋ฐ ํธ์๋ฅผ ์ํด NaverGame SDK๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๋ฒํผ์ผ๋ก ์ง์ ์์ฑํด๋ ๋ฉ๋๋ค. SampleBehaviour.cs ํ์ผ์ ์ํ ์ฝ๋๊ฐ ์์ฑ๋์ด ์์ต๋๋ค.
NaverGame SDK ์ ์คํ๋ฒํผ์ ์ ๋ํฐ์ UGUI๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค. UGUI๋ฅผ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ SampleBehaviour.cs ํ์ผ์ ์ฐธ์กฐํ์ฌ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค.
์ด์์ฒด์ ๋ณ NaverGame SDK์ ๊ดํ ์์ธํ ๋ด์ฉ์ GitHub ์ ์ฅ์๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค.
2. Android ์ถ๊ฐ ์ค์
GooglePlayStore ์ ์ฑ (https://developer.android.com/google/play/requirements/target-sdk?hl=ko) ์ ๋ฐ๋ผ 2024๋ 8์๋ถํฐ targetSDK 34์ด ๊ฐ์ ๋๋ฉฐ ๋ค์ด๋ฒ๊ฒ์ SDK ๋ Android 14 (API ์์ค 34) ์ด์์ ์ํํ ์ง์ํ๋ ค๋ฉด Unity 2022.2 ์ดํ ๋ฒ์ ์ ์ค์นํด์ผ ํฉ๋๋ค.
2-0 minSdkVersion ์ค์
minSdkVersion ์ 21 ์ด์์ ์ค์ ํ์ ์ผ ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธํ์ฑ์ ์ํ์ฌ minSdkVersion์ 19๋ก ์ค์ ํ์์ง๋ง OkHttp 3.14.7 ๋ฒ์ ์ targetSdk30 ์ด์(https://github.com/square/okhttp/issues/5162)๋ก ์ธํด 21 ๋ฒ์ ์ด์์ ์ฌ์ฉ ํ์ ์ผ ํ๋ฉฐ, 21 ๋ฏธ๋ง ์ง์์ ์ํด์๋ ๋ณ๋์ ์ค์ ์ ์ถ๊ฐํด์ผ ํ๊ณ Gradle ๋น๋์์๋ง ์ง์ ํฉ๋๋ค.
21 ๋ฏธ๋ง ๋ฒ์ ์ ์ํ ์ค์ ์ Android ๊ฐ์ด๋์ ํด๋น ๋งํฌ๋ฅผ ์ฐธ์กฐํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
2-2. Unity 2019 ์ดํ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
NaverGameSDK 1.3.2 ๋ฒ์ ๋ถํฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถฉ๋ (duplicate class) ์ด์๋ฅผ ํํผํ๊ธฐ ์ํ์ฌ Unity 2020 ๋ฒ์ ๋ถํฐ ์ง์ํ๋ [Android ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ] ๋ฐฉ์์ผ๋ก ์ ๊ณต๋๋ฉฐ unityproject ํ์ผ์ ์ํฌํธ์ ์๋์ผ๋ก ํฌํจ๋ฉ๋๋ค. ์์ ๋ฐฉ์์ผ๋ก์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น๋ฅผ ์ํ์๋ ๊ฒฝ์ฐ ๋ณ๋ ๊ฐ์ด๋ ๋ฅผ ์ฐธ์กฐ ๋ถํ๋๋ฆฝ๋๋ค.
์ ๋ํฐ ์์๋ 2019 ๋ฒ์ ๋ถํฐ ์ง์๋๋ค๊ณ ๊ฐ์ด๋ ํ๊ณ ์์ผ๋ ๋ด๋ถ ํ ์คํธ์ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์ ์ด ๋ฐ๊ฒฌ๋์ด 2022.3.13f ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ํ ์คํธ ๋๊ณ ์์ต๋๋ค.
Unity 2019 ์ดํ ๋ฒ์ ์ ๋ํ ์ค์ ์ ๋ณ๋ ๊ฐ์ด๋ ์์ ๋น๋ถ๊ฐ ์ ๊ณต๋์ง๋ง ๋น๋์๋ฌ์ ๋ํ ๊ธฐ์ ์ ์ง์์ ์ด๋ ต์ต๋๋ค.
2-3. Unity 2022.2 ์ดํ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
Android targetsdk 34 ์ค์ ์ AGP(Android Gradle Plugin) 7.0 ์ด์์ ์ฌ์ฉ์ด ์๊ตฌ๋๋ฉฐ, Unity 2022.2 ์ดํ๋ฒ์ ๋ถํฐ AGP 7.0.0 ๋ฒ์ ์ ๊ณต์์ ์ผ๋ก ์ง์ํ๊ณ ์์ต๋๋ค. ์ํํ ๋น๋๋ฅผ ์ํ์ฌ 2022.2 ์ดํ ๋ฒ์ ์ ์ฌ์ฉํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
2-4. Gradle ๋น๋ ์ค์
Project Settings > Player Settings > Android > Publishing Settings ๋ฅผ ์ด์ด Custom Gradle Properties Template ์ Custom Main Manifest ๋ฅผ ์ฒดํฌํฉ๋๋ค.

Assets/Plugins/Android/gradleTemplate.properties ํญ๋ชฉ์ ์ด์ด ๋ค์๊ณผ ๊ฐ์ด android.useAndroidX, android.enableJetifierํญ๋ชฉ์ true ๋ก ์ถ๊ฐ ํด์ค๋๋ค.
android.useAndroidX = true
android.enableJetifier=true
**ADDITIONAL_PROPERTIES**
Assets/Plugins/Android/AndroidManifest.xml ํญ๋ชฉ์ ์ด์ด <activity> ํญ๋ชฉ์ android:exported = "true" ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector" android:exported = "true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
2-5. Minify ์ค์
Release ๋น๋๋ฅผ ์ํ Minify(proguard) ์ค์ ์ ํฉ๋๋ค
Build Settings > Player Settings > AndroidTab > Publishing Settings > Custom Proguard File ์ค์ ์ ์ฒดํฌํ์ฌ ์๋ก์ด proguard-user.txt ํ์ผ์ ์์ฑํฉ๋๋ค.
Build Settings > Player Settings > AndroidTab > Publishing Settings > Minify ์์ Release๋ฅผ ํ์ฑํ ํฉ๋๋ค.
proguard-user.txt ํ์ผ์ ์ด๊ณ ๋ค์๊ณผ ๊ฐ์ ํ๋ก๊ฐ๋ ์ค์ ์ ์ถ๊ฐ ํฉ๋๋ค
#retrofit 2
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* <methods>;
}
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**
# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit
# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
#end of retrofit2
#gson
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
##---------------End: proguard configuration for Gson ----------
#end of gson
#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
#end of glide
#kotlin
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
<fields>;
}
-keepclassmembers class kotlin.Metadata {
public <fields>;
public <methods>;
}
#End of kotlin
#navergame sdk
# Application classes that will be serialized/deserialized over Gson
-keep class com.navercorp.nng.android.sdk.api.Host** { *; }
-keep class com.navercorp.nng.android.sdk.api.service** { *; }
-keep class com.navercorp.nng.android.sdk.api.entity** { *; }
-keep class com.navercorp.nng.android.sdk.NngNdkWrapper** { *; }
-keepclassmembers class com.navercorp.nng.android.sdk.NngNdkWrapper { *; }
-keep class com.navercorp.nng.android.sdk.NNGLink** { *; }
-keep class com.navercorp.nng.android.sdk.NNGLink$Companion { *; }
-keepclassmembers class com.navercorp.nng.android.sdk.NNGLink {
public static ** Companion;
}
-keep public interface com.navercorp.nng.android.sdk.NNGCallbackListener {*;}
-keep class com.navercorp.nng.android.sdk.NNGConfig** { *; }
#end of sdk
3. iOS ์ถ๊ฐ์ค์
iOS์ฉ ๊ฒ์์ ๊ฐ๋ฐํ ๋์๋ ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ์ถ๊ฐ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
3-1 .bundle ํ์ผ ๋งํฌ
Unity 5.4.0f3 ๋ฒ์ ์ด์์์๋ iOS์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ๋ .bundle ํ์ผ์ด ๋งํฌ๋์ง ์๋๋ก ์ค์ ๋ผ ์์ต๋๋ค. NNGSDK.bundle ํ์ผ์ ๋งํฌํ๋๋ก ๋ค์๊ณผ ๊ฐ์ด Select for platforms for plugin์์ iOS๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.

3-2. Xcode ์ค์
Xcode์์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค.
TARGETS ํญ๋ชฉ ์ค ํ๋ ์ ์ํฌ๋ฅผ ์ ํํฉ๋๋ค.
Build Setting ํญ์ ์ ํํ๊ณ Linking ํญ๋ชฉ์์ Other Linker Flags๋ฅผ ์ฐพ์ต๋๋ค.
Basic ๋๋ Customized๋ชจ๋ ์ธ ๊ฒฝ์ฐ Other Linker Flag๊ฐ ๋ณด์ด์ง ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.์ด ๊ฒฝ์ฐ All ๋ชจ๋๋ฅผ ์ ํํฉ๋๋ค.
์ฐ์๋จ์ ์์นํ ๊ฒ์์ฐฝ์ Other Linker Flag๋ฅผ ์ ๋ ฅํ๋ฉด ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
Other Linker Flags์ -ObjC ์ต์ ๊ณผ -lc++ ์ต์ ์ ์ถ๊ฐํฉ๋๋ค.

Info.plist์ ์๋์ ์ฌ์ฉ์ ๊ถํ ํ๋ ์ต์ ์ ์ถ๊ฐํฉ๋๋ค.
Privacy - Camera Usage Description
Privacy - Photo Library Usage Description

TARGETS ํญ๋ชฉ ์ค ์คํ๋ ์ฑ์ ์ ํํ๊ณ Infoํญ์ URL Types ํญ๋ชฉ์ Identifier ๊ฐ๊ณผ URL Schemes๊ฐ์์ ๋ ฅํฉ๋๋ค.
Identifier ๊ฐ์ ํด๋น TARGET์ General ํญ์์ ํ์ธํ ์ ์์ต๋๋ค.
URL Schemes ๊ฐ์๋ ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ ๋ ์ ๋ ฅํ URL Scheme ๊ฐ์์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค.


(1.3.6 ๋ฒ์ ์ดํ) Build Phases -> Link Binary With Libraries ์ SafariServices.framework ์ NaverLogin.framework ๋ฅผ ์ถ๊ฐํฉ๋๋ค.

(1.3.6 ๋ฒ์ ์ด์) General -> Framework and Libraries ์ SafariServices.framework ์NaverThirdPartyLogin.framework ๋ฅผ ์ถ๊ฐํฉ๋๋ค. NaverThirdPartyLogin.framework ์ Embed ์ค์ ์ Embed&Sign ์ผ๋ก ์ค์ ํฉ๋๋ค.

(1.3.7 ๋ฒ์ ์ด์) NaverThirdPartyLogin.xcframework ์ UnityFramework ํ๊ฒ์ด ์๋ Unity -> Xcode ํ๋ก์ ํธ ์์ฑ ์ดํ Unity-iPhone ํ๊ฒ์ผ๋ก ๋งํฌํด ์ค๋๋ค. NaverThirdPartyLogin.xcframework ํ์ผ์ navergame-sdk-unity/package/iOS/external-lib/NaverLogin/NaverThirdPartyLogin.xcframework ์ผ๋ก ์ฌ์ฉ ํฉ๋๋ค.
NaverGameSDK ์ฌ์ฉ
NaverGameSDK๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋จผ์ init ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
init() ๋ฉ์๋
init() ๋ฉ์๋๋ NaverGameSDK ์ ์ ํ ํ๋ ๋ฉ์๋ ์ ๋๋ค. ํ์ํ ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
loungeId: ๊ณต์๋ผ์ด์ง๋ฅผ ์ ์ฒญํ๊ณ ๋ฐ์ LoungeId
clientId: ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ๊ณ ๋ฐ์ ํด๋ผ์ด์ธํธ ์์ด๋
clientSecret: ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ๊ณ ๋ฐ์ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ
public void init(string loungeId, string clientId, string clientSecret);
๋ค์์ init() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
GLink.sharedInstance().init(
"naver_game_4developer",
"UKvNABLDsyEJusJGsXL2",
"rK4suc_Qd0"
);
terminateSdk() ๋ฉ์๋
terminateSdk() ๋ฉ์๋๋ NaverGameSDK ๋ฅผ ์ข ๋ฃ์ํค๋ ๋ฉ์๋์ ๋๋ค. ํน์ ์ํฉ์์ sdk ๋ฅผ ์ข ๋ฃ์์ผ์ผ ํ ๋ ํธ์ถํฉ๋๋ค. ์๋ฅผ๋ค์ด GLinkDelegate ์ฝ๋ฐฑ์ ํตํด์ ์ ๋ฌ๋๋ ์ธ๊ฒ์๋ฉ๋ด์ฝ๋ ๋ฅผ ์คํํ ๋์๋ ๋ฐ๋์ terminateSdk() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ sdk๋ฅผ ๋ซ์์ฃผ์ด์ผ ํฉ๋๋ค.
void terminateSdk();
๋ค์์ terminateSdk() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().terminateSdk()
executeHomeBanner() ๋ฉ์๋
๋ฑ๋กํ ๋ฐฐ๋์ฐฝ์ ๋์ฐ๋ ๋ฉ์๋ ์ ๋๋ค.
public void executeHomeBanner()
๋ค์์ executeHomeBanner() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().executeHomeBanner()
executeSorryBanner() ๋ฉ์๋
์ ๊ฒ์ฉ ๋๋ ํน์ ๊ณต์ง์ฌํญ ํ์ด์ง๋ฅผ ๋์ด๋ค. ์ด ํ์ด์ง์์๋ ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ์ด๋ํ๋๊ฒ์ด ์ ํ๋ฉ๋๋ค
public void executeSorryBanner()
๋ค์์ executeSorryBanner() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().executeSorryBanner();
executeBoard(int boardId) ๋ฉ์๋
ํน์ ๊ฒ์ํ์ ๋ฐ๋ก ์คํํ๋ ๋ฉ์๋ ์ ๋๋ค. boardId ๋ ์น์์ ๊ฒ์ํ ์ ์ ์ ๋ณด์ด๋ https://game.naver.com/lounge/{loungeId}/board/{boardId} ํํ์ URL์์ ์ ์ ์์ต๋๋ค.
public void executeBoard(int boardId);
๋ค์์ executeBoard() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().executeBoard(1);
executeFeed(long feedId, bool isTempFeedId) ๋ฉ์๋
๋ฑ๋ก๋ ๊ธ์ ๋ฒํธ๋ก ๋ฐ๋ก ์คํํ๋ ๋ฉ์๋ ์ ๋๋ค. ๋ง์ฝ ์์ฝ๋ ธ์ถ์ ํตํด์ ๋ฑ๋กํ ์์ฝ ๊ฒ์๊ธ์ ๊ฒฝ์ฐ์๋ ์์ฝ๊ธ์ ๋ฒํธ๋ฅผ feedId ์ ์ ๋ ฅํ๊ณ IsTempFeedId ๋ฅผ true ๋ก ์ ๋ ฅํด์ผ ํฉ๋๋ค.
์์ฝ๊ธ์ด ๊ฒ์๋๊ธฐ ์ ์๋ ๋ฉ์๋๋ฅผ ์คํํ๋๋ผ๋ ๊ธ์ด ๋ ธ์ถ๋์ง ์์ต๋๋ค.
feedId: ๊ฒ์๊ธ ๋๋ ์์ฝ๊ฒ์๊ธ์ ๋ฒํธ
isTempFeedId: FeedId ๊ฐ ๊ฒ์๊ธ ์ธ ๊ฒฝ์ฐ false, feedId๊ฐ ์์ฝ๊ฒ์๊ธ ์ธ ๊ฒฝ์ฐ true
void executeFeed(long feedId, bool isTempFeedId);
๋ค์์ executeFeed() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().executeFeed(50154, true);
executeFeedWriting(int boardId, string title, string text, string imageFilePath) ๋ฉ์๋
๊ธ์ฐ๊ธฐ ํ๋ฉด์ ์คํํ๋ ๋ฉ์๋ ์ ๋๋ค. boardId๋ ๊ฒ์ํ๋ฒํธ, title์ ๊ธ์ ์ ๋ชฉ, text๋ ๊ธ์ ๋ด์ฉ, imageFilePath๋ ์ฒจ๋ถ ์ด๋ฏธ์ง์ ๊ฒฝ๋ก์ด๋ฉฐ ์ด๋ฏธ์ง๋ ํ ๊ฐ๋ง ์ฒจ๋ถ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ ํ์๊ฐ ์๋๋ฉฐ ์ ๋ ฅ๋๋ ๊ฒฝ์ฐ ๊ธ ์ฐ๊ธฐ ํ๋ฉด์ ๋ฏธ๋ฆฌ ์ธํ ๋ฉ๋๋ค.
boardId: ๊ฒ์ํ ๋ฒํธ์ ๋๋ค. ์น์์ ๊ฒ์ํ ์ ์ ์ ๋ณด์ด๋ https://game.naver.com/lounge/{loungeId}/board/{boardId} ํํ์ URL์์ ์ ์ ์์ต๋๋ค.
title: ๊ธ์ ์ ๋ชฉ์ ๋๋ค.
text: ๋ณธ๋ฌธ์ ์ถ๊ฐ๋ ๋ฌธ์์ด ์ ๋๋ค.
imageFilePath: ์ฒจ๋ถ๋ ์ด๋ฏธ์ง์ LocalPath ์ ๋๋ค. ์๋๋ก์ด๋์ ๊ฒฝ์ฐ ์ฌ์ง ๊ถํ ํ๋์ ์ ์ฐจ๊ฐ ์์ผ๋ฏ๋ก ํด๋น ๊ฐ์ ์ง์ ์ ๋ ฅํ ์ ๋์์ฌ๋ถ๋ฅผ ๊ผผ๊ผผํ ํ์ธํด์ผ ํฉ๋๋ค.
void executeFeedWriting(
int boardId, String text, String text, String imageFilePath);
๋ค์์ executeFeedWriting() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().executeFeedWriting(54,"์ ๋ชฉ ํ
์คํธ","๋ณธ๋ฌธํ
์คํธ",
"content://com.example.contentprovidersample.provider/cheeses")
setCanWriteFeedByScreenshot(bool enabled) ๋ฉ์๋
์ ์ ๊ฐ ์คํฌ๋ฆฐ์ท์ ์บก์ณํ์๋ ์ด๋ฅผ ๊ฐ์งํ์ฌ ๊ธ์ฐ๊ธฐ๋ก ์ฐ๊ฒฐํ๋ ๋ฒํผ์ ๋์ฐ๋ ๊ฒ์ ์ค์ ํ๋ ๋ฉ์๋ ์ ๋๋ค. ๋ฏธํธ์ถ์ ๊ธฐ๋ณธ๊ฐ์ ON(true) ์ ๋๋ค.
enabled: true ์ด๋ฉด ์คํฌ๋ฆฐ์ท์ ์บก์ณํ์๋ ๊ธ์ฐ๊ธฐ ๋ฒํผ์ ๋์๋๋ค.
void setCanWriteFeedByScreenshot(bool enable);
๋ค์์ setCanWriteFeedByScreenshot() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().setCanWriteFeedByScreenshot(true)
setGameId(string gameId) ๋ฉ์๋
๋ค์ด๋ฒ๋ก๊ทธ์ธ๊ณผ ์ฐ๋๋์ด ํด๋น์ ์ ์ ๋ค์ด๋ฒ์์ด๋๋ฅผ ๋งค์นญ์ํต๋๋ค. ๊ธ์ฐ๊ธฐ์ ๋๊ธ์ฐ๊ธฐ๋ฑ์ ํตํ ์ด๋ฒคํธ์ฐธ์ฌ์ ๋น์ฒจ๋ ์ ์ ์ ๊ฒ์์์ด๋๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
initํจ์๊ฐ ํธ์ถ๋ ์ดํ์ ๊ฐ๋ฅํ ์์ ์ ํธ์ถํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
gameId: ์๋ณ๊ฐ๋ฅํ ๊ฒ์์์ด๋๋ฅผ ์ ๋ ฅํฉ๋๋ค. ๋ค์ด๋ฒ์์ด๋ ๋น ํ๋๋ง ์ ์ฅ๋ฉ๋๋ค.
void setGameId(string gameId);
๋ค์์ setGameId() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().setGameId("your_game_id_for_test")
setAppName(string appName) ๋ฉ์๋
์ฑ ์ด๋ฆ์ ์ค์ ํ๋ ๋ฉ์๋๋ก iOS ํ๊ฒฝ์์๋ง ์ ํจํฉ๋๋ค. ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์ ๋ฑ๋กํ ์ฑ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค.
initํจ์๊ฐ ํธ์ถ๋ ์ดํ์ ๊ฐ๋ฅํ ์์ ์ ํธ์ถํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
appName: ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์ ๋ฑ๋กํ ์ฑ ์ด๋ฆ์ ๋๋ค.
void setAppName(string appName);
๋ค์์ setAppName() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().setAppName("your_game_name")
setAppScheme(string appScheme) ๋ฉ์๋
์ฑ ์คํด์ ์ค์ ํ๋ ๋ฉ์๋๋ก iOS ํ๊ฒฝ์์๋ง ์ ํจํฉ๋๋ค. ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์ ๋ฑ๋กํ ์ฑ ์คํด๊ณผ ๋์ผํ๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค.
initํจ์๊ฐ ํธ์ถ๋ ์ดํ์ ๊ฐ๋ฅํ ์์ ์ ํธ์ถํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
appScheme: ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์ ๋ฑ๋กํ ์ฑ ์คํด์ ๋๋ค.
void setAppScheme(string appScheme);
๋ค์์ setAppScheme() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().setAppScheme("your_ios_app_scheme")
getAuthSettingDescription() ๋ฉ์๋
์ธ์ฆ ์ค๋ฅ ๋ฐ์ ์ ์ดํด๋ด์ผ ํ ๋๋ฒ๊ทธ ์ฉ๋์ ๋ฌธ์์ด์ ๋๋ค. Client ID, Client Secret, ์ฑ ์ด๋ฆ, ์ฑ ์คํด์ด ํฌํจ๋์ด ์์ต๋๋ค. ๊ฐ ๊ฐ์ด ๋ ๋ฒ์ฉ ์ถ๋ ฅ๋๋๋ฐ, ๊ดํธ ์์ด ์ถ๋ ฅ๋๋ ๋ด์ฉ์ ์ค์ ์ธ์ฆ์ ์ฌ์ฉ๋ ๊ฐ์ด๋ฉฐ ๊ดํธ๋ก ์ธ์ธ ๋ด์ฉ์ SDK์์ ์บ์ํ๊ณ ์๋ ๊ฐ์ ๋๋ค. ์ค์ ์ธ์ฆ์ ์ฌ์ฉ๋ ๊ฐ, SDK์ ์บ์๋ ๊ฐ, ๊ทธ๋ฆฌ๊ณ ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ๊ฐ๋ฐ์ ์ผํฐ์ ๋ฑ๋ก๋ ๊ฐ์ด ๋ชจ๋ ์ผ์นํด์ผ ํฉ๋๋ค.
string getAuthSettingDescription();
๋ค์์ getAuthSettingDescription() ๋ฉ์๋๋ฅผ ๊ตฌํํ ์์ ๋๋ค.
Glink.sharedInstance().getAuthSettingDescription()
getCountryCode() ๋ฉ์๋
๋จ๋ง๊ธฐ์ countryCode๋ฅผ ์ป์ด์ต๋๋ค.
public string getCountryCode(Activity activity);
countryCode๋ ๋ ๊ฐ์ ์ํ๋ฒณ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ตญ๊ฐ์ฝ๋(ISO 3166-1 alpha-2)์ ๋๋ค. ์ด๋ฅผ ํ์ฉํ๋ฉด ์ฝ๋ ๋ด์์ ๊ตญ๊ฐ๋ณ ๋ถ๊ธฐ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ฃผ์ ๊ตญ๊ฐ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ์ด์ธ์ ๊ตญ๊ฐ ์ฝ๋๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
๊ตญ๊ฐ์ฝ๋
๊ตญ๊ฐ
CN
์ค๊ตญ
JP
์ผ๋ณธ
KR
๋ํ๋ฏผ๊ตญ
TH
ํ๊ตญ
US
๋ฏธ๊ตญ
๋ค์์ getCountryCode() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ํ๋ฏผ๊ตญ์ ๊ฒฝ์ฐ์๋ง SDK ๋ฅผ ์ด๊ธฐํ ํ๊ณ ๋ฐฐ๋๋ฅผ ํธ์ถํ๋ ์์ ๋๋ค.
if (GLink.sharedInstance().getCountryCode().Equals("KR"))
{
GLink.sharedInstance().init("LoungeId","ClientId","ClientSecret");
GLink.sharedInstance().executeHomeBanner();
}
GLinkDelegate ๋๋ฆฌ๊ฒ์ดํธ
Sdk ๋ด๋ถ์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์๋ event ๋ฅผ ํตํด์ ์ด๋ฅผ GameEngine ์ ์๋ฆฝ๋๋ค.
SdkOpenedDelegate ์ด๋ฒคํธ
NaverGameSdk ๊ฐ ์คํ๋์์๋ ๋ฐ์ํฉ๋๋ค.
public delegate void SdkOpenedDelegate();
public static event SdkOpenedDelegate sdkOpenedEvent;
๋ฑ๋ก๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
private void Awake()
{
GLinkDelegate.sdkOpenedEvent += SdkOpenedEvent;
}
void SdkOpenedEvent()
{
Debug.Log("BannerOpenedEvent");
}
SdkClosedDelegate ์ด๋ฒคํธ
NaverGameSdk ๊ฐ ์ข ๋ฃ๋์์ ๋ ๋ฐ์ํฉ๋๋ค.
public delegate void SdkClosedDelegate();
public static event SdkClosedDelegate sdkClosedEvent;
๋ฑ๋ก๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
private void Awake()
{
GLinkDelegate.sdkClosedEvent += SdkClosedEvent;
}
void SdkClosedEvent()
{
Debug.Log("BannerClosedEvent");
}
SdkCallInGameMenuCode ๋๋ฆฌ๊ฒ์ดํธ
NaverGameSdk ์์ ์ธ๊ฒ์๋ฉ๋ด์ฝ๋ ๋ฅผ ์คํํด์ผ ํ ๋ ๋ฐ์ํฉ๋๋ค. ๊ณต์ ๋ผ์ด์ง ๊ด๋ฆฌํ์ด์ง > SDK ๊ด๋ฆฌ > ๋ฐฐ๋๊ด๋ฆฌ ํ์ด์ง์์ ๋ฐฐ๋์ '์ธ๊ฒ์ ๋ฉ๋ด' ๋ฅผ ๋ฑ๋กํ์๋ ์ฌ์ฉํฉ๋๋ค. Android ์ iOS ๊ฐ๊ฐ์ ํ๋ซํผ์ ๋ฐ๋ผ ๋ฑ๋กํ ๊ฐ์ด ๊ฐ์ ์ ๋ฌ๋๋ฏ๋ก ๋ค๋ฅธ ๊ฐ์ ์ ๋ ฅํ๋ค๋ฉด ๊ฐ์ฐจ ์ฒ๋ฆฌํด ์ฃผ์ ์ผ ํฉ๋๋ค.
public delegate void SdkCallInGameMenuCode(string InGameMenuCode);
public static event SdkCallInGameMenuCode sdkCallInGameMenuCode;
๋ฑ๋ก๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
private void Awake()
{
GLinkDelegate.sdkCallInGameMenuCode += SdkCallInGameMenuCode;
}
void SdkCallInGameMenuCode(string inGameMenuCode)
{
GLink.sharedInstance().terminateSdk();
Debug.Log("SdkCallInGameMenuCode " + inGameMenuCode);
}
๋น๋
๊ฐ ํ๋ซํผ์ ๋ง๊ฒ ๋น๋ํด์ ์ ์์ ์ผ๋ก ๋น๋๋๋ฉด SDK์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
1. ๋ฐ์ ๊ฐ๋ฅํ ๋น๋ ์๋ฌ
1-1 ์๋๋ก์ด๋ ๋น๋์๋ฌ
2. Unity 2019 ์ดํ๋ฒ์ ์ ๋น๋
GooglePlayStore ์ ์ฑ (https://support.google.com/googleplay/android-developer/answer/11926878?hl=ko) ์ ๋ฐ๋ผ 2022๋ 11์๋ถํฐ targetSDK 31์ด ๊ฐ์ ๋ฉ๋๋ค. ์ด์๋ฐ๋ผ NaverGameSDK๋ targetSDK31 ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ด๋๋๋ฉฐ, Unity 2019 ์ดํ ๋ฒ์ ์ ์ฌ๋ฌ๊ฐ์ง ์ ์ฝ์ฌํญ์ด ๋ง์ ๋น๋๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. Unity2020 ์ดํ ๋ฒ์ ์ ์ฌ์ฉ์ ๊ถ์ฅํด ๋๋ฆฌ๋ฉฐ Unity2019 ์ดํ ๋ฒ์ ์ ๋น๋์๋ฌ์ ๋ํ ๊ธฐ์ ์ ์ง์์ ํ๋ ์ ์ํด ๋ถํ๋๋ฆฝ๋๋ค.
2-0. Unity 2019 ๋ฒ์ ์์ targetSDK31 ์ด์์ผ๋ก gradle ๋น๋ ์ค์
Unity 2019 ๋ฒ์ ์์ targetSDK31 ์ด์์ ์ปดํ์ผ ํ๊ธฐ ์ํด์๋ ์ปค์คํ ๊ทธ๋๋ค์ ์ค์ ํด ์ฃผ์ ์ผ ํฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ฌ ๊ทธ๋๋ค ์ค์ ์ ์งํํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
2-1. Unity 2019 ๋ฒ์ ์ ์ํ NaverGameSDK Android ์ค์
Unity 2020 ์ดํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง์ 'NGSDK/Plugins/Android/navergamesdk.androidlib/libs ํด๋์์ [navergame-sdk-gradle-x.x.x.aar] ํ์ผ์ 'NGSDK/Plugins/Android/' ํด๋๋ก ์ด๋ํ๊ณ [navergamesdk.androidlib] ํด๋๋ ์ญ์ ํฉ๋๋ค.
Project Settings > Player > Android Tab > Publishing Settings > Build๋ก ์ด๋ํ์ฌ Custom Main Gradle Template ์ Custom Gradle Properties Template๋ฅผ ์ ํํฉ๋๋ค.
์ต์ ์ด ์ฒดํฌ๋์๋ค๋ฉด Assets/Plugins/Android ํด๋์ mainTemplate.gradle ํ์ผ์ด ์์ฑ๋์์ ๊ฒ์ ๋๋ค. ํด๋น ํ์ผ์ ํธ์ง๊ธฐ๋ก ์ด์ด dependencies ํญ๋ชฉ์ ๋ค์๊ณผ ๊ฐ์ด ์ข ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "com.naver.nid:naveridlogin-android-sdk:4.2.6" // naveridlogin
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.20" // Kotlin
implementation "androidx.viewpager2:viewpager2:1.0.0" // Viewpager2
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" //swiperefreshlayout
implementation "com.github.bumptech.glide:glide:3.7.0" // Glide
implementation "com.squareup.retrofit2:retrofit:2.9.0" // Retrofit2
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
**DEPS**}
1.2.0 ๋ฒ์ ๋ถํฐ ๊ธ์ฐ๊ธฐ ๊ธฐ๋ฅ์ ์ํ์ฌ naveridlogin-android-sdk ๊ฐ ์ถ๊ฐ๋์๊ณ , kotlin-stdlib, retrofit, converter-gson ์ ๋ฒ์ ์ด ๋ณ๊ฒฝ๋์์ผ๋ 1.x.x ๋ฒ์ ์์ ์ ๊ทธ๋ ์ด๋์์๋ ๋ฐ๋์ ํ์ธ ๋ถํ๋๋ฆฝ๋๋ค.
๊ทธ๋ฆฌ๊ณ gradleTemplate.properties ํญ๋ชฉ๋ ์ด์ด ๋ค์๊ณผ ๊ฐ์ด android.useAndroidX, android.enableJetifierํญ๋ชฉ์ true ๋ก ์ถ๊ฐ ํด์ค๋๋ค.
android.useAndroidX = true
android.enableJetifier=true
**ADDITIONAL_PROPERTIES**
๊ฐ๋ก ๋ชจ๋, ์ธ๋ก ๋ชจ๋
NaverGameSDK๋ ๊ฐ๋ก ๋ชจ๋์ ์ธ๋ก ๋ชจ๋๋ฅผ ๋ชจ๋ ์ง์ํ๋ค.
Android, iOS ํ๊ฒฝ ๋ชจ๋ ๋ณ๋๋ก ์ค์ ํ์ง ์์๋ ํ๋ฉด์ ๊ฐ๋ก, ์ธ๋ก ์ํ์ ๋ฐ๋ผ ๊ฐ๋ก ๋ชจ๋, ์ธ๋ก ๋ชจ๋๊ฐ ์๋์ผ๋ก ์ ์ฉ๋๋ค.
Last updated
Was this helpful?