Unity SDK

Prev Next

Available in Classic and VPC

This guide describes how to integrate your game with the dashboard using the GAMEPOT Unity SDK in Unity. By installing the SDK and configuring your environment, you can integrate the features necessary for game development.

Required specifications

The recommended specifications required to use GAMEPOT SDK for Unity are as follows:

  • Minimum specifications: 2022.3.44f1 or later
  • If you need support for a lower version of Unity, contact Ncloud Support with your request.

Install SDK and configure environment

You can install the GAMEPOT Unity SDK, configure the environment, and integrate the game and GAMEPOT dashboard to use features required for the game development.

The GAMEPOT SDK supports the following languages.

  • Korean, English, Italian, Thai, Vietnamese, Japanese, Chinese (Simplified/Traditional), Indonesian, German, Spanish, French

When the app is launched, it is automatically displayed in the supported language in the SDK based on the device's language. If it is an unsupported language, it will be displayed in English.

SDK installation

The following describes how to install GAMEPOT Unity SDK and configure a project in Unity.

  1. From Unity official Distribution GitHub, Download the latest version.
  2. In Unity, click the Assets > Import Package > Custom Package... menus, in that order, and then load the nbase-unity-plugin-[version].unitypackage file.
    • Starting with GAMEPOT 3.0, it is distributed via Maven distribution and CocoaPods, and integrates with dozens of external libraries with simple setup per device.
Note

For iOS builds, CocoaPods must be installed to work properly.

It is installed including External Dependency Manager for Unity, which enables you to install Android and iOS packages conveniently.

Set Gradle for Android

Follow the Gradle setup procedure required for Android builds in order.

  1. In Player Settings, under Publishing Settings, select Custom Main Gradle Template and Custom Gradle Properties Template.
    gamepot-UnitySDK01.png
  2. Raise the minimum API level to 24.
    gamepot-UnitySDK02.png
  3. Click the Assets > External Dependency Manager > Android Resolver > Settings menus, in that order, and then deselect the Enable Auto-Resolution and Explode AARs fields.
    gamepot-UnitySDK03.png
  4. Open the Dependency configuration file in the editor as shown in the image below to review the settings.
    gamepot-UnitySDK04.png

The following file defines the dependency packages that are required by default to use the NBase SDK. If you want to use additional features, you can add them to the following file to use the module on Android and iOS.

What are dependency modules?
Dependency modules are modules for using external SDKs, such as io.nbase:nbase-adapter-provider-google for Google login, which must be installed with the module provided by Google.

XML example:

<?xml version="1.0" encoding="UTF-8"?>
<dependencies>
    <androidPackages>
        <androidPackage spec="io.nbase:nbasesdk:3.0.87"/>
    </androidPackages>
    <iosPods>
        <iosPod name="NBase" version="3.0.59" minTargetSdk="15.0" />
    </iosPods>
</dependencies>
  • When using Google login and Google Play Store payment

XML example:

<dependencies>
    <androidPackages>
        <androidPackage spec="io.nbase:nbasesdk:3.0.87"/>
        <androidPackage spec="io.nbase:nbase-adapter-provider-google:3.0.10"/>
        <androidPackage spec="io.nbase:nbase-adapter-billing-googleplay:3.0.6" />
    </androidPackages>
    <iosPods>
        <iosPod name="NBase" version="3.0.59" minTargetSdk="15.0" />
        <iosPod name="NBaseAdapterProviderGoogle" version="3.0.56" minTargetSdk="15.0" />
    </iosPods>
</dependencies>

The following dependency modules are supported.

Name Description Dependency modules
io.nbase:nbasesdk GAMEPOT base module X
io.nbase:nbase-adapter-provider-google Google login X
io.nbase:nbase-adapter-provider-apple Apple login X
io.nbase:nbase-adapter-provider-facebook Facebook login com.facebook.android:facebook-login:latest.release
io.nbase:nbase-adapter-provider-kakao Kakao login X
io.nbase:nbase-adapter-provider-line LINE login X
io.nbase:nbase-adapter-provider-naver NAVER login X
io.nbase:nbase-adapter-provider-huawei Huawei login X
io.nbase:nbase-adapter-provider-playgame Google Play Games login X
io.nbase:nbase-adapter-provider-x X login X
io.nbase:nbase-adapter-billing-googleplay Google Play Store com.android.billingclient:billing-ktx:7.1.1
io.nbase:nbase-adapter-billing-onestore ONE Store X
io.nbase:nbase-adapter-billing-galaxy Galaxy Store X
io.nbase:nbase-adapter-billing-huawei Huawei Store X

Email and guest logins are applied to the base module.

After configuring all dependencies, click Assets > External Dependency Manager > Android Resolver > Force Resolve within the Unity Editor.

After defining in Dependencies.xml, if you run Force Resolve, the content defined in the mainTemplate.gradle file is automatically defined as implementation, and this content must be completed to import the relevant libraries when building.

Set iOS

Open the /Assets/NBaseSDK/Editor/NBaseSDKDependencies.xml file.

Add the necessary framework between "iosPods" and "/iosPods." The basic framework required is added.

XML example:

<?xml version="1.0" encoding="UTF-8"?>
<dependencies>
	<androidPackages>
        ...
	</androidPackages>
    <iosPods>
		<iosPod name="NBase" version="3.0.59" minTargetSdk="15.0" />
    </iosPods>
</dependencies>

If you want to install the necessary framework, such as Firebase, you can do so separately as shown below.

XML example:

<iosPods> 
       ...
        <iosPod name="FirebaseMessaging" version="10.20.0" minTargetSdk="9.0" />
        <iosPod name="Firebase/Analytics" version="10.15.0" minTargetSdk="9.0" />
        ...
</iosPods>

If CocoaPods is not installed,
Click Assets > External Dependency Manager > iOS Resolver > Install Cocoapods within the Unity Editor.

Caution

When you build a Unity project for iOS, the Unity-iPhone.xcworkspace file is created, which you need to open.
If you don't open the Unity-iPhone.xcworkspace file instead of Unity-iPhone.xcodeproj, the CocoaPods dependency will not be used.
Starting with Unity 2021, the project will be selected automatically.

Name Description Dependeny modules
NBase GAMEPOT base module X
NBaseAdapterProviderGoogle Google login X
NBaseAdapterProviderFacebook Facebook login FBSDKLoginKit (17.4.0)
NBaseAdapterProviderNaver NAVER login X
NBaseAdapterProviderLine LINE login X
NBaseAdapterProviderKakao Kakao login X
NBaseAdapterProviderX X login X
Caution

Some dependent frameworks can only be added through the Swift Package Manager.

The following describes how to manually add essential dependency frameworks that require installation via Swift Package Manager.

  1. In Xcode, go to Project Settings, and then enter the Package Dependencies settings.
    gamepot-UnitySDK05.png

  2. Add https://github.com/apollographql/apollo-ios.git to the URL input field at the top right, search for it, select apollo-ios, and then add it with Add Package.

  3. Add the Apollo and ApolloAPI modules displayed in the modal to the main target (Unity-iPhone) of your project.
    gamepot-UnitySDK06.png

    The following table, this section, describes the dependency modules added via Swift Package Manager.

    Name Dependency modules Location Version Framework
    NBase Apollo https://github.com/apollographql/apollo-ios.git 1.15.2

Preparation

Before applying the GAMEPOT Unity SDK, verify the following essential configuration items.

  1. Copy the project ID and project key from Dashboard > Project settings.
  2. Add/edit login, store, and integration settings in Dashboard > Project settings.
  3. See Configuration by login method for each login, set it in the console and add it to the dashboard.
  4. Before in-app payment, see Configuration by store to set it in the console and add it to the dashboard.
  5. Before in-app payment, register items in Dashboard > Payment > In-app for each payment store.

Reset

To perform an initialization, add the following code to the object used in the first scene loaded when the game starts.

C# Example:

using UnityEngine;
using NBaseSDK;

 public class GamePotExample : MonoBehaviour
 {
     void Start()
     { 
       NBaseSDK.NBase.initialize(projectId, projectKey, [storeId], [language], [region], (init, error) => {
           if (error != null)
           {
               Debug.Log(error.Message);
               return;
           }
           Debug.Log(init.ToString());
       });
     }
 }

Parameter

The following table describes the parameters required for initialization.

Key Description Required
projectId Dashboard → Project settings O
projectKey Dashboard → Project settings O
storeId See the following table. O
language Language (en, ko, ja...) O
region Region name (kr, jp, sg, us, eu) O

See the following table for store identifiers.

Key Description
Store.google.ToString() Google Play Store
Store.one.ToString() ONE Store
Store.galaxy.ToString() Galaxy Store
Store.amazon.ToString() Amazon Store
Store.huawei.ToString() Huawei Store
Store.pc.ToString() PC store
Store.steam.ToString() Steam store

Callback information

The following table describes the information passed to the initialization callback.

Key Type Description
Status bool Condition
Language string Language
Country string Country
RemoteIp string IP
Sandbox bool Sandbox status

Reset (event receipt)

First, you need to create a script that receives NBase events.
This script is called NBaseListener and can be placed on any object in the scene. It is recommended that you call the DontDestroyOnLoad method to ensure that the object exists permanently.

The image below illustrates an example of configuring the NBaseListener script in a scene.
gamepot-UnitySDK09.png

C# Example:

using UnityEngine;
using NBaseSDK;
public class NBaseListener: MonoBehaviour, NBaseEventListener
{
	void Start()
	{
        DontDestroyOnLoad(this.gameObject);
        NBaseSDK.NBase.SetEventListener(this);
    }	
}

Login feature

Use login feature

Use the following code to use the SDK login feature that functions when clicking the login button according to the login UI implemented by the developer. Before that, you must complete all the console and dashboard settings required for login to work properly.

C# Example:

NBaseSDK.NBase.signIn(Provider.google.ToString(), (user, error) => {
    if (error != null)
    {
        if (error.Code == NBaseSDK.NBase.ErrorCode.MEMBER_WITHDRAW) // Withdrawal status
        {
            // Withdrawal
            Debug.Log(error.Message.ToString());    // Withdrawal message
        }
        else if (error.Code == NBaseSDK.NBase.ErrorCode.SERVICE_MAINTENANCE) // Maintenance
        {
            Debug.Log(error.Message.ToString());    // Maintenance message
            // case 1: Use in-game popup implemented directly by the developer
            // case 2: Call the code below to use the SDK's own popup
            // NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
            //     // Popup handling
            // });
        }
        else if (error.Code == NBaseSDK.NBase.ErrorCode.UPDATE_REQUIRED) // Update
        {
            Debug.Log(error.Message.ToString());    // Update message
            // case 1: Use in-game popup implemented directly by the developer
            // case 2: Call the code below to use the SDK's own popup
            // NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
            //     // Popup handling
            // });
        }
        else if (error.Code == NBaseSDK.NBase.ErrorCode.MEMBER_BANNED) // Access blocked
        {
            Debug.Log(error.Message.ToString());    // Block message
        }
        else 
        {
            // signIn Failed
            Debug.Log(error.Message.ToString());
        }
    }
    else
    {
        // signIn Success
        Debug.Log(user.ToString());
    }
    return;
});

If you use the pop-up provided by the SDK when updating or checking, add the following code.

C# Example:

NBaseSDK.NBase.showAppStatusPopup(appStatus, (status, error) =>
{
    bool shouldClose = false;
    bool shouldNext = false;
    var closeValue = status.Close; 
    var nextValue = status.Next;

    if (closeValue != null)
    {
        if (bool.TryParse(closeValue.ToString(), out bool result))
        {
            shouldClose = result;
        }
    }

    if (shouldClose)
    {
        // App Close
    }

    if (nextValue != null)
    {
        if (bool.TryParse(nextValue.ToString(), out bool result))
        {
            shouldNext = result;
        }
    }

    if (shouldNext)
    {
        // Next, Optional update
    }
});

Parameter

The following table describes the provider values used in the login feature.

Key Description
Provider.google.ToString() Google
Provider.anonymous.ToString() Guest
Provider.facebook.ToString() Facebook
Provider.apple.ToString() Apple
Provider.kakao.ToString() Kakao
Provider.googleplay.ToString() Play Games
Provider.steam.ToString() Steam
Provider.x.ToString() X
Provider.line.ToString() LINE
Provider.naver.ToString() NAVER
Provider.github.ToString() GitHub
Provider.microsoft.ToString() Microsoft
Provider.huawei.ToString() Huawei

User information

The following table describes the fields of the user object.

Key Type Description
Id string User's unique ID
SocialId string Social ID
Name string Name (if provided)
Email string Email (if provided)
Token string Token
Age int Age (if provided)
Profile string Profile (if provided)
CustomField string Custom field
IsSignUp bool Registration status
AppStatus AppStatus Maintenance/update status

App status information

The following table describes the fields of the AppStatus object.

Key Type Description
Message string Message
StartedAt long Start Time
EndedAt long End time
CurrentAppVersion string Current app version
UpdateAppVersion string Update app version
CurrentAppVersionCode string Current app version code
UpdateAppVersionCode string Update app version code
IsForce bool Whether to force update
Url string URL registered for maintenance/update

Login UI provided by SDK

You can use the login UI provided by GAMEPOT SDK in a completed form.
Use the following code to call the login UI provided by the SDK.

C# Example:

NBaseSDK.NBase.openSignInUI((user, error) => {
    if (error != null)
    {
        if (error.Code == NBaseSDK.NBase.ErrorCode.MEMBER_WITHDRAW) // Withdrawal status
        {
            // Withdrawal
            Debug.Log(error.Message.ToString());    // Withdrawal message
        }
        else if (error.Code == NBaseSDK.NBase.ErrorCode.SERVICE_MAINTENANCE) // Maintenance
        {
            Debug.Log(error.Message.ToString());    // Maintenance message
            // case 1: Use in-game popup implemented directly by the developer
            // case 2: Call the code below to use the SDK's own popup
            // NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
            //     // Popup handling
            // });
        }
        else if (error.Code == NBaseSDK.NBase.ErrorCode.UPDATE_REQUIRED) // Update
        {
            Debug.Log(error.Message.ToString());    // Update message
            // case 1: Use in-game popup implemented directly by the developer
            // case 2: Call the code below to use the SDK's own popup
            // NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
            //     // Popup handling
            // });
        }
        else if (error.Code == NBaseSDK.NBase.ErrorCode.MEMBER_BANNED) // Access blocked
        {
            Debug.Log(error.Message.ToString());    // Block message
        }
        else 
        {
            // signIn Failed
            Debug.Log(error.Message.ToString());
        }
    }
    else
    {
        // signIn Success
        Debug.Log(user.ToString());
    }
    return;
});

Auto login (optional)

After initialization, it may attempt to automatically log in with the last authentication method you logged in with. We recommend checking the last login provider type before attempting automatic login.

C# Example:

// Check the last login provider type.
string lastProviderType = NBaseSDK.NBase.getLastProviderType();

if (lastProviderType != Provider.none.ToString())
{
    // Attempt automatic login only if last login information is available.
    NBaseSDK.NBase.signInLastLoggedIn((user, error) => {
        if (error != null)
        {
            if (error.Code == NBaseSDK.NBase.ErrorCode.MEMBER_WITHDRAW) // Withdrawal status
            {
                // Withdrawal
                Debug.Log(error.Message.ToString());    // Withdrawal message
            }
            else if (error.Code == NBaseSDK.NBase.ErrorCode.SERVICE_MAINTENANCE) // Maintenance
            {
                // Maintenance
                Debug.Log(error.Message.ToString());    // Maintenance message
                /* case 1: Use in-game popup implemented directly by the developer
                case 2: Call the code below to use the SDK's own popup
                NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
                    // Popup handling
                });
                */
            }
            else if (error.Code == NBaseSDK.NBase.ErrorCode.UPDATE_REQUIRED) // Update
            {
                // Update
                Debug.Log(error.Message.ToString());    // Update message
                /* case 1: Use in-game popup implemented directly by the developer
                case 2: Call the code below to use the SDK's own popup
                NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
                    // Popup handling
                });
                */
            }
            else if (error.Code == NBaseSDK.NBase.ErrorCode.MEMBER_BANNED) // Access blocked
            {
                // Access blocked
                Debug.Log(error.Message.ToString());    // Block message
            }
            else
            {
                // signIn Failed
                Debug.Log(error.Message.ToString());
            }
        }
        else
        {
            // signIn Success
            Debug.Log(user.ToString());
        }
    });
}
else
{
    // No last login information
    Debug.Log("No last login provider found");
}

The getLastProviderType() method returns the last logged-in provider type.

The signInLastLoggedIn() method attempts automatic login using the last authentication method used to log in.

Callback information

The following table describes the values passed to the automatic login callback.

Key Type Description
user User User information upon successful login
error Error Error information upon login failure

Log out

Use the following code to use the SDK logout feature.

C# Example:

NBaseSDK.NBase.signOut((status, error) => {
    if (error != null)
    {
        // signOut Failed
        Debug.Log("signOut Failed: " + error.Message.ToString());
    }
    else
    {
        // signOut Success
        Debug.Log("signOut Success: " + status.ToString());
        // Processing logic after successful logout
    }
});

Callback information

The following table describes the values passed to the logout callback.

Key Type Description
status Boolean Success or Failure

Membership withdrawal

Use the following code to use the SDK membership withdrawal feature.

C# Example:

NBaseSDK.NBase.deleteMember(providerId, (status, error) => {
    if (error != null)
    {
        // deleteMember Failed
        Debug.Log("deleteMember Failed: " + error.Message.ToString());
    }
    else
    {
        // deleteMember Success
        Debug.Log("deleteMember Success: " + status.ToString());
        // Logic after successful membership withdrawal
    }
});

Parameter

The following table, this section, describes the parameters that must be passed for a membership withdrawal.

Key Type Description Required
providerId String Logged-in provider type (example: Provider.google.ToString(), Provider.anonymous.ToString(), etc.) O

Callback information

The following table describes the callback values for membership withdrawal.

Key Type Description
status Boolean Success or Failure

Authenticate with ID and password (optional)

This is an authentication method that allows users to log in using their email address and password.
This method performs user authentication based on the user's email address and password, and plays an important role in the traditional email/password-based authentication system.

C# Example:

NBaseSDK.NBase.signInWithPassword(username, password, (user, error) => {
    if (error != null)
    {
        Debug.Log(error.Message.ToString());
        return;
    }
});

Log in with credentials (optional)

Use the following code to log in using credentials (access tokens) obtained from external social accounts.

C# Example:

NBaseSDK.NBase.signInWithCredential(Provider.google.ToString(), providerToken, (user, error) => {
    if (error != null)
    {
        if (error.Code == NBaseSDK.NBase.ErrorCode.SERVICE_MAINTENANCE) // Maintenance
        {
            // Maintenance
            Debug.Log("Maintenance: " + error.Message.ToString());
            /* case 1: Use in-game popup implemented directly by the developer
            case 2: Call the code below to use the SDK's own popup
            NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
                // Popup handling
            });
            */
        }
        else if (error.Code == NBaseSDK.NBase.ErrorCode.UPDATE_REQUIRED) // Update
        {
            // Update
            Debug.Log("Update: " + error.Message.ToString());
            /* case 1: Use in-game popup implemented directly by the developer
            case 2: Call the code below to use the SDK's own popup
            NBaseSDK.NBase.showAppStatusPopup(user?.AppStatus, (status, error) => {
                // Popup handling
            });
            */
        }
        else
        {
            // signInWithCredential Failed
            Debug.Log("signInWithCredential Failed: " + error.Message.ToString());
        }
    }
    else
    {
        // signInWithCredential Success
        Debug.Log("signInWithCredential Success: " + user.ToString());
    }
});

Parameter

The following table describes the parameters required for credential login.

Key Type Description Required
provider String Provider ID (example: Provider.google.ToString(), Provider.facebook.ToString(), etc.) O
providerToken String Access token of the social account O

Callback information

The following table describes the credential login callback values.

Key Type Description
user User User information upon successful login
error Error Error information upon login failure

External account integration feature

This section describes the feature that allows you to integrate and manage external social accounts with your GAMEPOT user account.

Use external account integration feature

Use the following code to integrate another social account with your current GAMEPOT user account.

C# Example:

NBaseSDK.NBase.createLinking(Provider.google.ToString(), (linkingId, error) => {
    if (error != null)
    {
        // createLinking Failed
        Debug.Log("createLinking Failed: " + error.Message.ToString());
    }
    else
    {
        // createLinking Success
        Debug.Log("createLinking Success: " + linkingId);
        // Processing logic after successful account integration
    }
});

Parameter

The following table describes the parameters required for account integration.

Key Type Description Required
providerId String Provider type to integrate (example: Provider.google.ToString(), Provider.facebook.ToString(), etc.) O

Callback information

The following table describes the callback values for account integration.

Key Type Description
linkingId String Integration ID returned when integration is successful

Check integration list

Use the following code to check the list of social accounts currently integrated with your GAMEPOT user account.

C# Example:

NBaseSDK.NBase.getLinkedLists((linkings, error) => {
    if (error != null)
    {
        // getLinkedLists Failed
        Debug.Log("getLinkedLists Failed: " + error.Message.ToString());
    }
    else
    {
        // getLinkedLists Success
        Debug.Log("getLinkedLists Success: " + linkings.ToString());
        // Processing logic after checking the integration list
    }
});

Callback information

The following table describes the values provided when checking the account integration list.

Key Type Description
linkings List List of integrated accounts

Linking object

The following table describes the fields of the Linking object.

Key Type Description
id String Integration ID (use when removing account integration)
username String Social ID
provider String Social provider type

Remove integration

To remove a specific social account integration from your current GAMEPOT user account, use the following code.

C# Example:

NBaseSDK.NBase.deleteLinking(linkingId, (status, error) => {
    if (error != null)
    {
        // deleteLinking Failed
        Debug.Log("deleteLinking Failed: " + error.Message.ToString());
    }
    else
    {
        // deleteLinking Success
        Debug.Log("deleteLinking Success: " + status.ToString());
        // Processing logic after successful integration removal
    }
});

Parameter

The following table describes the parameters required for account integration removal.

Key Type Description Required
linkingId String Integration ID to remove (obtained from createLinking or getLinkedLists) O

Callback information

The following table describes the callback values for account integration removal.

Key Type Description
status Boolean Success or Failure

Check app status

Use the following code to check the current client's maintenance/update status.

C# Example:

NBaseSDK.NBase.checkAppStatus((status, error) =>
    {
        switch(status.State)
        {
            case NBaseSDK.NBase.AppStatus.Status.SUCCESS:
                // SUCCESS
                break;
            case NBaseSDK.NBase.AppStatus.Status.FAILED:
                // FAILED
                break;
            case NBaseSDK.NBase.AppStatus.Status.MAINTENANCE:
                // Maintenance
                /* case 1: Use in-game popup implemented directly by the developer
                case 2: Call the code below to use the SDK's own popup
                NBaseSDK.NBase.showAppStatusPopup(status, (status, error) => {
                    // Popup handling
                });
                */
                break;
            case NBaseSDK.NBase.AppStatus.Status.UPDATE:
                // Update
                /* case 1: Use in-game popup implemented directly by the developer
                case 2: Call the code below to use the SDK's own popup
                NBaseSDK.NBase.showAppStatusPopup(status, (status, error) => {
                    // Popup handling
                });
                */
                break;
        }
    });

Unity Standalone information

Standalone refers to builds for Mac, Windows, and Linux.
The GAMEPOT SDK supports cross-platform, but the features supported by mobile and Standalone are different, so see the table below to plan your development.

Service Android iOS Web PC Remarks
Login O O O Validate token after PC login.
Payment O O O Navigate to the PC payment page.
Notice O O O O Provide list query excluding the UI.
Support O O O O Navigate to PC.
Leaderboard O O O O
Friend management O O O O
Push O O X X
Maintenance check O O O O
Update O O O O
Coupons O O O O
Chat O O O O
Data storage O O O O
Security O O X Under preparation
Player O O O O
Note

The web version is a feature only available in the GamePot 3.0 Typescript version.

Newtonsoft.Json crash

The NBase Unity SDK uses Unity's Newtonsoft JSON package to parse API requests. JSON is one of the most commonly used libraries, so there is a possibility that you already have JSON in your project and you will get the following library duplication error.

In this case, you can delete the Newtonsoft.Json file in the Plugins/Standalone path or delete the JSON library already in the project and use Unity's JSON. Unity's JSON package has been modified to work with the Unity engine and is a fully supported version of IL2CPP.

Troubleshooting

Q. UnityPlayerActivity.java uses or overrides a deprecated API.
A. Select Edit > Project Settings > Player > Publishing Settings > Custom Properties Gradle Template.

Q. error:1E08010C:DECODER routines::unsupported
A. This occurs when the Google authentication key value does not match. See the Google Play Store guide and enter the key correctly.

Q. Aside from official Maven addresses such as ONE Store or GAMEPOT Beta, downloads are not possible from Maven and jitpack.io.
The following error occurs in Unity.

Text example:

Could not determine the dependencies of task ':unityLibrary:compileReleaseAidl'.
> Could not resolve all task dependencies for configuration ':unityLibrary:releaseCompileClasspath'.
     > Could not find io.nbase:nbasesdk:0.0.71-beta.
         Required by:
                 project :unityLibrary

For modules that do not use public Maven, you must enter the following Maven address. Enter the Maven address together when configuring the NBaseSDKDependencies file.

XML example:

<!-- # ONE Store -->
<androidPackage spec="com.onestorecorp.sdk:sdk-iap:21.01.00"/>
    <repositories>
        <repository>https://repo.onestore.co.kr/repository/onestore-sdk-public</repository>
    </repositories>
</androidPackage>

<!-- # NBase Beta Maven repository -->
<androidPackage spec="io.nbase:nbasesdk:3.0.84"/>
    <repositories>
        <repository>https://repo.nbase.io/repository/nbase-releases/</repository>
    </repositories>
</androidPackage>

You can also add the address for jitpack.io.

Q. Minimum API level increase notice
A. Raise the minimum API level from 22 to 24.
The image below illustrates where to adjust the API level.
gamepot-UnitySDK13.png

Q. Authorization failed: Error Domain=AKAuthenticationError Code=-7026
A. Add Sign In with Apple by clicking TARGETS > +Capability.
The image below illustrates the page for adding the Sign in with Apple feature.
gamepot-UnitySDK14.png

Q. Couldn't get credential from result.10: Developer console is not set up correctly
A. This error may occur because the client ID of the web application type is not set in Google Cloud Console > Set credentials > OAuth 2.0 client ID.

Q. 16: Cannot find a matching credential.
A. This error can occur when the Google Cloud Console > Set credentials > OAuth 2.0 client ID is not registered.

Q. java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/billingclient/api/BillingClient;
A. Add the following code.

XML example:

<androidPackage spec="com.android.billingclient:billing:7.0.0" /> 

Q. (iOS) A crash occurs when the app is launched, and the "/AdapterProviderFacebook' (no such file)" error is confirmed .
A. Add Xcode TARGETS → General → Frameworks, Libraries, and Embedded Content → AdapterProviderFacebook.xcframework.

Q. (iOS) After launching, an "'/usr/lib/swift/NBase.framework/NBase' (no such file, not in dyld cache)" error occurs .
A. Add NBase.xcframework as shown below.
The image below illustrates the process of adding NBase.xcframework to the project.

gamepot-UnitySDK07.png

gamepot-UnitySDK08.png

Q. (iOS) In the iOS 18 environment, an "NSBundle file:///System/Library/Frameworks/Metal.framework/ principal class is nil because all fallbacks have failed" error occurs .

A. Open the Edit Scheme window (shortcut: CMD + SHIFT + ,), deselect API Validation from the Metal field.
The image below illustrates where to disable the Metal API Validation option.

gamepot-UnitySDK15.png