SDK для Unity / Интеграция SDK на стороне приложения
 На главную

SDK для Unity

  • Руководство по интеграции

  • Демопроект

  • Аутентификация

  • Каталог

  • Покупка товара

  • Использование

  • Руководства по сборке приложений

  • Решение проблем

  • Как перейти на использование SDK версии 1.0.0 и выше

  • Интеграция SDK на стороне приложения

    1. Разработайте интерфейс для системы входа, внутриигрового магазина и других страниц вашего приложения.
    2. Настройте обработку событий в соответствии с логикой вашего приложения с помощью методов SDK. Чтобы начать работать с основными функциями SDK, следуйте пошаговым обучающим инструкциям ниже.

    Примечание
    Вы можете создать собственное решение, следуя инструкциям Unity, или использовать демосцену как шаблон. Чтобы адаптировать UI демосцены под свое приложение, воспользуйтесь конструктором интерфейса.
    Следуйте пошаговым обучающим инструкциям ниже, чтобы начать работать с основными функциями SDK.

    Аутентификация пользователя по имени пользователя/email-адресу и паролю

    Эта инструкция показывает, как с помощью методов SDK реализовать:

    • регистрацию пользователя;
    • запрос пользователем повторной отправки письма с подтверждением регистрации;
    • авторизацию пользователя;
    • сброс пароля пользователя.

    Для аутентификации пользователя может использоваться имя пользователя или email-адрес. В приведенных ниже примерах применяется имя пользователя, а email-адрес используется для подтверждения регистрации пользователя и для сброса пароля.

    Примечание
    Если вы дополнительно используете виджет авторизации на сайте (например, в веб-магазине), убедитесь, что на сайте и в вашем приложении аутентификация пользователя реализована одинаково. По умолчанию виджет использует email-адрес пользователя. Для настройки аутентификации по имени пользователя обратитесь к аккаунт-менеджеру проекта.

    Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации системы авторизации приведен в демо.

    Реализация регистрации пользователя

    В обучающей инструкции описана реализация следующей логики:

    Создание интерфейса страницы

    Создайте сцену для страницы регистрации и добавьте на нее следующие элементы:

    • поле для ввода имени пользователя;
    • поле для ввода email-адреса пользователя;
    • поле для ввода пароля пользователя;
    • кнопка регистрации пользователя.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт RegistrationPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели Inspector.
    3. Добавьте логику для обработки нажатия кнопки регистрации:

      1. В методе Start подпишитесь на событие нажатия кнопки.
      2. Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
      3. В анонимном методе объявите переменные username, email и password и инициализируйте их значениями из полей на странице.
      4. Вызовите метод SDK XsollaAuth.Instance.Register и передайте в него переменные username, email, password и следующие методы:

        • OnSuccess — вызывается в случае успешной регистрации;
        • OnError — вызывается в случае ошибки.

    Примечание

    В примерах скриптов методы OnSuccess и OnError вызывают стандартный метод Debug.Log. Код и описание ошибки передаются в параметре error.

    Вы можете добавить другие действия. Например, при успешной регистрации открывать страницу с повторным запросом письма о регистрации или страницу авторизации.

    Пример скрипта для страницы регистрации:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    using Xsolla.Auth;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class RegistrationPage : MonoBehaviour
        {
            // Declaration of variables for UI elements on the page
    
            [SerializeField] private InputField UsernameInput;
    
            [SerializeField] private InputField EmailInputField;
    
            [SerializeField] private InputField PasswordInputField;
    
            [SerializeField] private Button RegisterButton;
    
            private void Start()
            {
                // Handling the button click
             RegisterButton.onClick.AddListener(() =>
                {
                    var username = UsernameInput.text;
                    var email = EmailInputField.text;
                    var password = PasswordInputField.text;
    
                    XsollaAuth.Instance.Register(username, email, password, onSuccess: OnSuccess, onError: OnError);
                });
            }
    
            private void OnSuccess()
            {
                UnityEngine.Debug.Log("Registration successful");
                // Some actions
         }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.Log($"Registration failed. Description: {error.errorMessage}");
                // Some actions
         }
        }
    }
    

    Настройка письма о подтверждении регистрации

    При успешной регистрации пользователю приложения отправляется письмо для подтверждения регистрации на указанный email-адрес. Вы можете кастомизировать письма для пользователей в Личном кабинете.

    Если вы разрабатываете Android-приложение, настройте внешние ссылки, чтобы возвращать пользователя в приложение после подтверждения регистрации.

    Примечание
    Вы можете отключить подтверждение регистрации с помощью электронной почты, если для вас это приемлемо с точки зрения безопасности. Для отключения обратитесь к аккаунт-менеджеру проекта или напишите письмо на am@xsolla.com.

    Реализация запроса повторной отправки письма с подтверждением регистрации

    В обучающей инструкции описана реализация следующей логики:

    Создание интерфейса страницы

    Создайте сцену для страницы запроса повторной отправки письма и добавьте на нее следующие элементы:

    • поле для ввода имени пользователя или email-адреса;
    • кнопка повторной отправки письма.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт ResendConfirmationEmail, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели Inspector.
    3. Добавьте логику для обработки нажатия кнопки повторной отправки письма:

      1. В методе Start подпишитесь на событие нажатия кнопки.
      2. Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
      3. В анонимном методе объявите переменную username и инициализируйте ее значением из поля ввода на странице.
      4. Вызовите метод SDK XsollaAuth.Instance.ResendConfirmationLink и передайте в него переменную username и методы OnSuccess и OnError.

    Пример скрипта для страницы запроса повторной отправки письма:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    using Xsolla.Auth;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class ResendConfirmationEmail : MonoBehaviour
        {
            // Declaration of variables for UI elements on the page
    
            [SerializeField] private InputField UsernameInput;
    
            [SerializeField] private Button ResendEmailButton;
    
            private void Start()
            {
                // Handling the button click
             ResendEmailButton.onClick.AddListener(() =>
                {
                    var username = UsernameInput.text;
    
                    XsollaAuth.Instance.ResendConfirmationLink(username, onSuccess: OnSuccess, onError: OnError);
                });
            }
    
            private void OnSuccess()
            {
                UnityEngine.Debug.Log("Resend confirmation email successful");
                // Some actions
         }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.Log($"Resend confirmation email failed. Description: {error.errorMessage}");
                // Some actions
         }
        }
    }
    

    При успешном запросе пользователю отправляется письмо для подтверждения регистрации на указанный при регистрации email-адрес.

    Реализация авторизации пользователя

    В обучающей инструкции описана реализация следующей логики:

    Создание интерфейса страницы

    Создайте сцену для страницы авторизации и добавьте на нее следующие элементы:

    • поле для ввода имени пользователя;
    • поле для ввода пароля;
    • флажок для запоминания учетной записи;
    • кнопка авторизации.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт AutorizationPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели Inspector.
    3. Добавьте логику для обработки нажатия кнопки авторизации:

      1. В методе Start подпишитесь на событие нажатия кнопки.
      2. Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
      3. В анонимном методе объявите переменные username, password и инициализируйте их значениями из полей ввода на странице авторизации. Создайте переменную rememberMe и инициализируйте ее состоянием флажка для запоминания учетной записи.
      4. Вызовите метод SDK XsollaAuth.Instance.SignIn и передайте в него переменные username, password, rememberMe и методы OnSuccess и OnError.

    Примечание
    При успешной авторизации пользователя в параметре token передается токен авторизации, который используется в запросах к серверам Иксоллы.

    Пример скрипта для страницы авторизации:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    using Xsolla.Auth;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class AuthorizationPage : MonoBehaviour
        {
            // Declaration of variables for UI elements on the page
    
            [SerializeField] private InputField UsernameInput;
    
            [SerializeField] private InputField PasswordInputField;
    
            [SerializeField] private Toggle RememberMeToggle;
    
            [SerializeField] private Button AuthorizationButton;
    
            private void Start()
            {
                // Handling the button click
    
                AuthorizationButton.onClick.AddListener(() =>
                {
                    var username = UsernameInput.text;
                    var password = PasswordInputField.text;
                    var rememberMe = RememberMeToggle.isOn;
    
                    XsollaAuth.Instance.SignIn(username, password, rememberMe, null, onSuccess: OnSuccess, onError: OnError);
                });
            }
    
            private void OnSuccess(string token)
            {
                UnityEngine.Debug.Log($"Authorization successful. Token: {token}");
                // Some actions
         }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.Log($"Authorization failed. Description: {error.errorMessage}");
                // Some actions
         }
        }
    }
    

    Реализация сброса пароля

    В обучающей инструкции описана реализация следующей логики:

    Создание интерфейса страницы

    Создайте сцену для страницы сброса пароля и добавьте на нее следующие элементы:

    • поле для ввода имени пользователя или email-адреса;
    • кнопка сброса пароля.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт ResetPasswordPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели Inspector.
    3. Добавьте логику для обработки нажатия кнопки сброса пароля:

      1. В методе Start подпишитесь на событие нажатия кнопки.
      2. Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
      3. В анонимном методе объявите переменную username и инициализируйте ее значением из поля ввода на странице сброса пароля.
      4. Вызовите метод SDK XsollaAuth.Instance.ResetPassword и передайте в него переменную username и методы OnSuccess и OnError.

    Пример скрипта для страницы сброса пароля:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    using Xsolla.Auth;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class ResetPasswordPage : MonoBehaviour
        {
            // Declaration of variables for UI elements on the page
    
            [SerializeField] private InputField UsernameInput;
    
            [SerializeField] private Button ResetPasswordButton;
    
            private void Start()
            {
                // Handling the button click
    
                ResetPasswordButton.onClick.AddListener(() =>
                {
                    var username = UsernameInput.text;
    
                    XsollaAuth.Instance.ResetPassword(username, null, OnSuccess, OnError);
                });
            }
    
            private void OnSuccess()
            {
                UnityEngine.Debug.Log("Password reset successful");
                // Some actions
         }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.Log($"Password reset failed. Description: {error.errorMessage}");
                // Some actions
         }
        }
    }
    

    При успешном запросе сброса пароля пользователю отправляется письмо со ссылкой для изменения пароля. В Личном кабинете в настройках варианта авторизации (Общие настройки > URL > Callback URL) вы можете настроить URL-адрес, на который пользователь будет перенаправлен после успешной авторизации (аутентификации, подтверждения электронной почты или сброса пароля).

    Была ли статья полезна?
    Спасибо!
    Что может сделать страницу еще лучше? Сообщение
    Жаль, что так произошло
    Расскажите, почему статья не была полезна. Сообщение
    Спасибо за обратную связь!
    Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
    Скрыть

    Аутентификация пользователя через социальные сети 

    Эта инструкция показывает, как использовать методы SDK, чтобы реализовать регистрацию и авторизацию пользователя в приложении с помощью аккаунта в социальной сети.

    В отличие от аутентификации пользователя с помощью имени пользователя/email-адреса и пароля, реализация отдельной логики для регистрации пользователя не нужна. Если пользователь входит в систему впервые через аккаунт социальной сети, новая учетная запись создается автоматически.

    Если в вашем приложении аккаунт социальной сети является альтернативным способом аутентификации, аккаунт автоматически привязывается к уже существующей учетной записи пользователя при выполнении следующих условий:

    • Зарегистрированный с помощью имени пользователя или email-адреса пользователь вошел в приложение через аккаунт социальной сети.
    • Социальная сеть возвращает email-адрес.
    • Email-адрес из социальной сети совпадает с email-адресом, указанными пользователем при регистрации в вашем приложении.

    Примечание
    Вы можете реализовать ручную привязку аккаунта социальной сети. Добавьте в ваше приложение страницу привязки социальной сети к учетной записи пользователя, в контроллере страницы используйте метод SDK LinkSocialProvider.

    В обучающей инструкции описана реализация следующей логики:

    Примеры приведены для аутентификации пользователя с помощью аккаунта в Twitter, настройка других социальных сетей выполняется аналогично.

    Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации системы авторизации приведен в демо.

    Создание интерфейса страницы

    Создайте сцену для страницы входа в приложение и добавьте на нее кнопку авторизации через социальную сеть. На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт SocialAuthorizationPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса страницы входа в приложение и присвойте им значения в панели Inspector.
    3. Добавьте логику обработки нажатия кнопки авторизации:

      1. В методе Start подпишитесь на событие нажатия кнопки.
      2. Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
      3. Для передачи URL страницы авторизации объявите переменную url в анонимном методе. Инициализируйте ее с помощью метода SDK GetSocialNetworkAuthUrl, передав в параметре SocialProvider значение Facebook.
      4. Для открытия браузера вызовите метод BrowserHelper.Instance.Open, передайте в него переменную url и значение true для использования встроенного браузера.

    Примечание
    Аутентификация через социальные сети недоступна с помощью внешнего браузера. В состав SDK включен встроенный браузер, разработанный Иксоллой. Вы можете использовать его или любой другой.

      1. Для получения токена и закрытия браузера отследите изменение URL страницы после успешной регистрации пользователя:
        1. Объявите переменную singlePageBrowser и инициализируйте ее с помощью метода BrowserHelper.Instance.GetLastBrowser.
        2. Подпишитесь на событие изменения URL активной страницы и установите метод OnUrlChanged в качестве обработчика.

    1. Реализуйте получение токена:
      1. С помощью утилитарного метода ParseUtils.TryGetValueFromUrl выполните парсинг URL активной страницы, который передается в методе OnUrlChanged.
      2. Добавьте проверку на наличие в URL активной страницы кода аутентификации. Метод ParseUtils.TryGetValueFromUrl передает код аутентификации в переменной code.
      3. Для обмена кода аутентификации на токен вызовите метод SDK ExchangeCodeToToken и передайте в него переменную code и следующие методы:
        • OnSuccess — вызывается в случае успешной авторизации;
        • OnError — вызывается в случае ошибки.

    Примечание

    В примере скрипта методы OnSuccess и OnError вызывают стандартный метод Debug.Log. Вы можете добавить другие действия.

    Если пользователь успешно авторизовался, в параметре token передается токен авторизации, который используется в запросах к серверам Иксоллы. При ошибке в параметре error передаются код и описание ошибки.

      1. После получения токена удалите игровой объект с браузером.

    Пример скрипта для страницы авторизации:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    using Xsolla.Auth;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class SocialAuthorizationPage : MonoBehaviour
        {
            // Declaration of variables for UI elements on the page
    
            [SerializeField] private Button FacebookButton;
    
            private void Start()
            {
                // Handling the button click
    
                FacebookButton.onClick.AddListener(() =>
                {
                    // Opening browser
    
                    var url = XsollaAuth.Instance.GetSocialNetworkAuthUrl(SocialProvider.Facebook);
                    BrowserHelper.Instance.Open(url, true);
    
                    // Determining the end of authentication
                 BrowserHelper.Instance.InAppBrowser.AddUrlChangeHandler(OnUrlChanged);
                });
            }
    
            // Getting token
         private void OnUrlChanged(string url)
            {
                if (ParseUtils.TryGetValueFromUrl(url, ParseParameter.code, out var code))
                {
                    XsollaAuth.Instance.ExchangeCodeToToken(code, OnSuccess, OnError);
                    Destroy(BrowserHelper.Instance.gameObject);
                }
            }
    
            private void OnSuccess(string token)
            {
                UnityEngine.Debug.Log($"Authorization successful. Token: {token}");
                // Some actions
         }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.Log($"Authorization failed. Description: {error.errorMessage}");
                // Some actions
         }
        }
    }
    

    Была ли статья полезна?
    Спасибо!
    Что может сделать страницу еще лучше? Сообщение
    Жаль, что так произошло
    Расскажите, почему статья не была полезна. Сообщение
    Спасибо за обратную связь!
    Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
    Скрыть

    Отображение каталога товаров

    Эта обучающая инструкция показывает, как с помощью методов SDK реализовать во внутриигровом магазине отображение:

    • виртуальных предметов;
    • групп виртуальных предметов;
    • бандлов;
    • пакетов виртуальных валют.

    Перед началом работы добавьте товары в Личном кабинете:

    1. Настройте виртуальные предметы и их группы.
    2. Настройте пакеты виртуальной валюты.
    3. Настройте бандлы.

    В обучающей инструкции описана реализация следующей логики:

    Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации каталога товаров во внутриигровом магазине приведен в демо.

    Примечание

    В примере для каждого товара в каталоге отображаются:

    • название товара;
    • описание товара;
    • стоимость товара;
    • изображение.

    Вы также можете отображать другие данные о товаре, которые хранятся во внутриигровом магазине.

    Реализация отображения виртуальных предметов

    Создание виджета предмета

    1. Создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели Hierarchy на панель Project.
    3. Выберите созданный префаб и в панели Inspector нажмите Open Prefab.
    4. Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение виджета;
      • название предмета;
      • описание предмета;
      • стоимость предмета;
      • изображение предмета.

    На рисунке ниже приведен пример структуры виджета.

    Создание скрипта виджета предмета

    1. Создайте скрипт VirtualItemWidget, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса виджета предмета и присвойте им значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class VirtualItemWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
    
            public Text NameText;
    
            public Text DescriptionText;
    
            public Text PriceText;
    
            public Image IconImage;
        }
    }
    

    Создание страницы для отображения списка предметов

    1. На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение страницы;
      • область отображения виджетов предметов.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт VirtualItemsPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные:
      • WidgetsContainer — контейнер для виджетов;
      • WidgetPrefab — префаб виджета предмета.

    1. Добавьте скрипт к игровому объекту страницы:
      1. Выберите объект в панели Hierarchy.
      2. В панели Inspector нажмите Add Component и выберите скрипт VirtualItemsPage.
    2. Присвойте переменным значения в панели Inspector.

    1. Добавьте логику для авторизации. Для этого в методе Start вызовите метод SDK XsollaAuth.Instance.SignIn и передайте в него:
      • имя пользователя или email-адрес в параметре username;
      • пароль пользователя в параметре password;

    Примечание
    В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).

      • флаг в параметре rememberUser для запоминания учетной записи;
      • метод OnAuthenticationSuccess для обработки успешной авторизации пользователя;
      • метод OnError для обработки ошибки.

    1. Добавьте логику получения списка предметов. В методе OnAuthenticationSuccess вызовите метод SDK XsollaCatalog.Instance.GetCatalog и передайте в него:
      • ID проекта в параметре projectId;

    Примечание
    ID проекта можно найти в разделе Настройки проекта Личного кабинета. В примере скрипта в параметр передается значение из настроек SDK.

      • метод OnItemsRequestSuccess для обработки успешного получения списка предметов;
      • метод OnError для обработки ошибки;
      • сдвиг в получении предметов относительно первого элемента в параметре offset;
      • количество загружаемых предметов в параметре limit.

    Примечание
    Параметры offset и limit необязательные. Используйте их для реализации пагинации — постраничного отображения предметов в каталоге. Максимальное количество предметов на странице — 50. Если в каталоге больше 50 предметов, пагинация обязательна.

    1. В методе OnItemsRequestSuccess добавьте логику создания виджета для каждого из полученных предметов:
      1. Создайте экземпляр виджета предмета как дочерний объект контейнера.
      2. Присвойте полученный компонент VirtualItemWidget переменной widget.

    1. Передайте в виджет предмета полученные данные:
      1. В элемент с названием предмета передайте значение переменной storeItem.name.
      2. В элемент с описанием предмета передайте значение переменной storeItem.description.
      3. Для отображения цены предмета реализуйте следующую логику:
        • Если значение переменной storeItem.price не равно null, значит, этот предмет продается за реальную валюту. Сформируйте цену в формате {amount} {currency} и передайте ее в элемент виджета.
        • Если значение переменной storeItem.virtual_prices не равно null, значит, этот предмет продается за виртуальную валюту. Сформируйте цену в формате {name}: {amount} и передайте ее в элемент виджета.

    Примечание
    Переменная storeItem.virtual_prices представляет собой массив цен предмета в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках предмета в разделе Магазин > Виртуальные предметы Личного кабинета.

      1. Для отображения изображения предмета, используйте утилитарный метод ImageLoader.Instance.GetImageAsync и передайте в него:
        • URL изображения;
        • анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения пакета.

    Пример скрипта контроллера страницы:

    Copy
    Full screen
    Small screen
    using System.Linq;
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Catalog;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class VirtualItemsPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
    
            public Transform WidgetsContainer;
    
            public GameObject WidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
    
                XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, null, OnAuthenticationSuccess, OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for catalog from store
    
                XsollaCatalog.Instance.GetCatalog(XsollaSettings.StoreProjectId, OnItemsRequestSuccess, OnError, offset: 0, limit: 50);
            }
    
            private void OnItemsRequestSuccess(StoreItems storeItems)
            {
                // Iterating the items collection and assign values for appropriate ui elements
    
                foreach (var storeItem in storeItems.items)
                {
                    var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
                    var widget = widgetGo.GetComponent<VirtualItemWidget>();
    
                    widget.NameText.text = storeItem.name;
                    widget.DescriptionText.text = storeItem.description;
    
                    if (storeItem.price != null)
                    {
                        var realMoneyPrice = storeItem.price;
                        widget.PriceText.text = $"{realMoneyPrice.amount} {realMoneyPrice.currency}";
                    }
                    else if (storeItem.virtual_prices != null)
                    {
                        var virtualCurrencyPrice = storeItem.virtual_prices.First(x => x.is_default);
                        widget.PriceText.text = $"{virtualCurrencyPrice.name}: {virtualCurrencyPrice.amount}";
                    }
    
                    ImageLoader.Instance.GetImageAsync(storeItem.image_url, (url, sprite) => widget.IconImage.sprite = sprite);
                }
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    На рисунке ниже приведен результат работы скрипта.

    Реализация отображения списка групп виртуальных предметов

    Создание виджета предмета

    1. Создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели Hierarchy на панель Project.
    3. Выберите созданный префаб и в панели Inspector нажмите Open Prefab.
    4. Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение виджета;
      • название предмета;
      • описание предмета;
      • стоимость предмета;
      • изображение предмета.

    На рисунке ниже приведен пример структуры виджета.

    Создание скрипта виджета предмета

    1. Создайте скрипт VirtualItemWidget, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса виджета предмета и присвойте им значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class VirtualItemWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
    
            public Text NameText;
    
            public Text DescriptionText;
    
            public Text PriceText;
    
            public Image IconImage;
        }
    }
    

    Создание виджета кнопки для просмотра группы предметов

    1. Создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели Hierarchy на панель Project.
    3. Выберите созданный префаб и в панели Inspector нажмите Open Prefab.
    4. Добавьте в качестве дочернего объекта префаба кнопку просмотра группы предметов и настройте ее внешний вид.

    На рисунке ниже приведен пример структуры виджета.

    Создание скрипта виджета кнопки для просмотра группы предметов

    1. Создайте скрипт VirtualItemGroupButton, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для кнопки просмотра группы предметов и названия группы и присвойте им значения в панели Inspector.
    3. Добавьте скрипт к корневому объекту префаба:
      1. Выберите объект в панели Hierarchy.
      2. В панели Inspector нажмите Add Component и выберите скрипт VirtualItemGroupButton.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class VirtualItemGroupButton : MonoBehaviour
        {
            // Declaration of variables for UI elements
         public Text NameText;
    
            public Button Button;
        }
    }
    

    Создание страницы для отображения списка предметов

    1. На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение страницы;
      • область отображения кнопок выбора группы объектов;
      • область отображения виджетов предметов.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт VirtualItemsByGroupsPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные:
      • GroupButtonsContainer — контейнер для кнопок групп;
      • GroupButtonPrefab — префаб кнопки;
      • ItemWidgetsContainer — контейнер для виджетов предметов;
      • WidgetPrefab — префаб виджета предмета.

    1. Добавьте скрипт к игровому объекту страницы:
      1. Выберите объект в панели Hierarchy.
      2. В панели Inspector нажмите Add Component и выберите скрипт VirtualItemsByGroupsPage.
    2. Присвойте переменным значения в панели Inspector.
    3. Добавьте логику для авторизации. Для этого в методе Start вызовите метод SDK XsollaAuth.Instance.SignIn и передайте в него:
      • имя пользователя или email-адрес в параметре username;
      • пароль пользователя в параметре password;

    Примечание
    В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).

      • флаг в параметре rememberUser для запоминания учетной записи;
      • метод OnAuthenticationSuccess для обработки успешной авторизации пользователя;
      • метод OnError для обработки ошибки.

    1. Добавьте логику получения списка предметов. В методе OnAuthenticationSuccess вызовите метод SDK XsollaCatalog.Instance.GetCatalog и передайте в него:
      • ID проекта в параметре projectId;

    Примечание
    ID проекта можно найти в разделе Настройки проекта Личного кабинета. В примере скрипта в параметр передается значение из настроек SDK.

      • метод OnItemsRequestSuccess для обработки успешного получения списка предметов;
      • метод OnError для обработки ошибки;
      • сдвиг в получении предметов относительно первого элемента в параметре offset;
      • количество загружаемых предметов в параметре limit.

    Примечание
    Параметры offset и limit необязательные. Используйте их для реализации пагинации — постраничного отображения предметов в каталоге. Максимальное количество предметов на странице — 50. Если в каталоге больше 50 предметов, пагинация обязательна.

    1. В методе OnItemsRequestSuccess добавьте логику формирования списка групп предметов:
      1. Получите список уникальных групп из полученного списка предметов. Добавьте к нему элемент All, при котором будут отображаться все предметы вне зависимости от категории.
      2. Очистите контейнер кнопок, удалив все дочерние объекты. Для этого вызовите вспомогательный метод DeleteAllChildren и передайте ему объект контейнера.
      3. Для каждой группы предметов:

        1. Создайте экземпляр виджета кнопки как дочерний объект контейнера.
        2. Присвойте полученный компонент VirtualItemGroupButton переменной groupButton.
        3. В элемент с названием группы предметов передайте значение переменной groupName.
        4. На событие нажатия кнопки добавьте анонимный метод. В нем вызовите метод OnGroupSelected и передайте в качестве параметров название группы предметов и список предметов.

      1. Для отображения всех предметов вызовите метод OnGroupSelected и передайте All в качестве названия группы.

    1. В методе OnGroupSelected добавьте логику для начального отображения предметов:
      1. Создайте переменную itemsForDisplay и присвойте ей все полученные предметы, если в названии группы предметов указанно All. Иначе — присвойте переменной itemsForDisplay предметы, название группы которых совпадает с переменной groupName.
      2. Очистите контейнер кнопок, удалив все дочерние объекты. Для этого вызовите вспомогательный метод DeleteAllChildren и передайте в него объект контейнера.

    1. Добавьте логику создания виджета для каждого из полученных предметов:
      1. Создайте экземпляр виджета предмета как дочерний объект контейнера.
      2. Присвойте полученный компонент VirtualItemWidget переменной widget.

    1. Передайте в виджет предмета полученные данные:
      1. В элемент с названием предмета передайте значение переменной storeItem.name.
      2. В элемент с описанием предмета передайте значение переменной storeItem.description.
      3. Для отображения цены предмета реализуйте следующую логику:

        • Если значение переменной storeItem.price не равно null, значит, этот предмет продается за реальную валюту. Сформируйте цену в формате {amount} {currency} и передайте ее в элемент виджета.
        • Если значение переменной storeItem.virtual_prices не равно null, значит, этот предмет продается за виртуальную валюту. Сформируйте цену в формате {name}: {amount} и передайте ее в элемент виджета.

    Примечание
    Переменная storeItem.virtual_prices представляет собой массив цен предмета в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках предмета в разделе Магазин > Виртуальные предметы Личного кабинета.

      1. Для отображения изображения предмета, используйте утилитарный метод ImageLoader.Instance.GetImageAsync и передайте в него:
        • URL изображения;
        • анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения пакета.

    Copy
    Full screen
    Small screen
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Catalog;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class VirtualItemsByGroupsPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
         public Transform GroupButtonsContainer;
    
            public GameObject GroupButtonPrefab;
    
            public Transform ItemWidgetsContainer;
    
            public GameObject ItemWidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
             XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, onSuccess: OnAuthenticationSuccess,
                    onError: OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for catalog from store
             XsollaCatalog.Instance.GetCatalog(XsollaSettings.StoreProjectId, OnItemsRequestSuccess, OnError, offset: 0,
                    limit: 50);
            }
    
            private void OnItemsRequestSuccess(StoreItems storeItems)
            {
                // Selecting the group’s name from items and order them alphabetical
             var groupNames = storeItems.items
                    .SelectMany(x => x.groups)
                    .GroupBy(x => x.name)
                    .Select(x => x.First())
                    .OrderBy(x => x.name)
                    .Select(x => x.name)
                    .ToList();
    
                // Add group name for “all groups”, which will mean show all items regardless of group affiliation
             groupNames.Insert(0, "All");
    
                // Clear container
             DeleteAllChildren(GroupButtonsContainer);
    
                // Iterating the group names and creating ui-button for each
             foreach (var groupName in groupNames)
                {
                    var buttonObj = Instantiate(GroupButtonPrefab, GroupButtonsContainer, false);
                    var groupButton = buttonObj.GetComponent<VirtualItemGroupButton>();
    
                    groupButton.NameText.text = groupName;
                    groupButton.Button.onClick.AddListener(() => OnGroupSelected(groupName, storeItems));
                }
    
                // Calling method for redraw page
             OnGroupSelected("All", storeItems);
            }
    
            private void OnGroupSelected(string groupName, StoreItems storeItems)
            {
                // Declaring variable for items which will display on page
             IEnumerable<StoreItem> itemsForDisplay;
                if (groupName == "All")
                {
                    itemsForDisplay = storeItems.items;
                }
                else
                {
                    itemsForDisplay = storeItems.items.Where(item => item.groups.Any(group => group.name == groupName));
                }
    
                // Clear container
             DeleteAllChildren(ItemWidgetsContainer);
    
                // Iterating the items collection and assign values for appropriate ui elements
             foreach (var storeItem in itemsForDisplay)
                {
                    var widgetGo = Instantiate(ItemWidgetPrefab, ItemWidgetsContainer, false);
                    var widget = widgetGo.GetComponent<VirtualItemWidget>();
    
                    widget.NameText.text = storeItem.name;
                    widget.DescriptionText.text = storeItem.description;
    
                    if (storeItem.price != null)
                    {
                        var realMoneyPrice = storeItem.price;
                        widget.PriceText.text = $"{realMoneyPrice.amount} {realMoneyPrice.currency}";
                    }
                    else if (storeItem.virtual_prices != null)
                    {
                        var virtualCurrencyPrice = storeItem.virtual_prices.First(x => x.is_default);
                        widget.PriceText.text = $"{virtualCurrencyPrice.name}: {virtualCurrencyPrice.amount}";
                    }
    
                    ImageLoader.Instance.GetImageAsync(storeItem.image_url,
                        (url, sprite) => widget.IconImage.sprite = sprite);
                }
            }
    
            // Utility method for delete all children of container
         private static void DeleteAllChildren(Transform parent)
            {
                var childList = parent.Cast<Transform>().ToList();
                foreach (var childTransform in childList)
                {
                    Destroy(childTransform.gameObject);
                }
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    Пример скрипта контроллера страницы:

    Реализация отображения бандлов

    Создание виджета бандла

    1. Создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели Hierarchy на панель Project.
    3. Выберите созданный префаб и в панели Inspector нажмите Open Prefab.
    4. Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:

      • фоновое изображение виджета;
      • название бандла;
      • описание бандла;
      • стоимость бандла;
      • описание содержимого бандла (предметы и их количество);
      • изображение бандла.

    На рисунке ниже приведен пример структуры виджета.

    Создание скрипта виджета

    1. Создайте скрипт BundleWidget, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса виджета бандла и присвойте им значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class BundleWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
         public Text NameText;
    
            public Text DescriptionText;
    
            public Text PriceText;
    
            public Text ContentText;
    
            public Image IconImage;
        }
    }
    

    Создание страницы для отображения списка бандлов

    1. На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение страницы;
      • область отображения виджетов бандлов.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт BundlesPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные:
      • WidgetsContainer — контейнер для виджетов;
      • WidgetPrefab — префаб виджета бандла.

    1. Добавьте скрипт к игровому объекту страницы:
      1. Выберите объект в панели Hierarchy.
      2. В панели Inspector нажмите Add Component и выберите скрипт BundlesPage.

    1. Присвойте переменным значения в панели Inspector.
    2. Добавьте логику для авторизации. Для этого в методе Start вызовите метод SDK XsollaAuth.Instance.SignIn и передайте в него:
      • имя пользователя или email-адрес в параметре username;
      • пароль пользователя в параметре password;

    Примечание
    В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).

      • флаг в параметре rememberUser для запоминания учетной записи;
      • метод OnAuthenticationSuccess для обработки успешной авторизации пользователя;
      • метод OnError для обработки ошибки.

    1. Добавьте логику получения списка бандлов. В методе OnAuthenticationSuccess вызовите метод SDK XsollaCatalog.Instance.GetBundles и передайте в него:
      • ID проекта в параметре projectId;

    Примечание
    ID проекта можно найти в разделе Настройки проекта Личного кабинета. В примере скрипта в параметр передается значение из настроек SDK.

      • метод OnItemsRequestSuccess для обработки успешного получения списка бандлов;
      • метод OnError для обработки ошибки.

    1. В методе OnBundlesRequestSuccess добавьте логику создания виджета для каждого из полученных бандлов:
      1. Создайте экземпляр виджета бандла как дочерний объект контейнера.
      2. Присвойте полученный компонент BundleWidget переменной widget.

    1. Передайте в виджет бандла полученные данные:
      1. В элемент с названием бандла передайте значение переменной bundleItem.name.
      2. В элемент с описанием бандла передайте значение переменной bundleItem.description.
      3. Сформируйте описание содержимого бандла:
        1. Из каждого предмета, входящего в бандл, сформируйте строку, содержащую название предмета и его количество в формате {name} x {quantity}.
        2. Объедините эти строки в одну, используя символ переноса строки в качестве разделителя.
        3. Передайте получившуюся строку в элемент виджета.

      1. Для отображения цены бандла реализуйте следующую логику:
        • Если значение переменной bundleItem.price не равно null, значит, этот бандл продается за реальную валюту. Сформируйте цену в формате {amount} {currency} и передайте ее в элемент виджета.
        • Если значение переменной bundleItem.virtual_prices не равно null, значит, этот бандл продается за виртуальную валюту. Сформируйте цену в формате {name}: {amount} и передайте ее в элемент виджета.

    Примечание
    Переменная bundleItem.virtual_prices представляет собой массив цен бандла в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках бандла в разделе Магазин > Бандлы Личного кабинета.

      1. Для отображения изображения предмета, используйте утилитарный метод ImageLoader.Instance.GetImageAsync и передайте в него:
        • URL изображения;
        • анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения бандла.

    Пример скрипта контроллера страницы:

    Copy
    Full screen
    Small screen
    using System.Linq;
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Catalog;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class BundlesPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
         public Transform WidgetsContainer;
    
            public GameObject WidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
             XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, onSuccess: OnAuthenticationSuccess, onError: OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for bundles from store
             XsollaCatalog.Instance.GetBundles(XsollaSettings.StoreProjectId, OnBundlesRequestSuccess, OnError);
            }
    
            private void OnBundlesRequestSuccess(BundleItems bundleItems)
            {
                // Iterating the bundles collection and assign values for appropriate ui elements
             foreach (var bundleItem in bundleItems.items)
                {
                    var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
                    var widget = widgetGo.GetComponent<BundleWidget>();
    
                    widget.NameText.text = bundleItem.name;
                    widget.DescriptionText.text = bundleItem.description;
    
                    var bundleContent = bundleItem.content.Select(x => $"{x.name} x {x.quantity}");
                    widget.ContentText.text = string.Join("\n", bundleContent);
    
                    if (bundleItem.price != null)
                    {
                        var realMoneyPrice = bundleItem.price;
                        widget.PriceText.text = $"{realMoneyPrice.amount} {realMoneyPrice.currency}";
                    }
                    else if (bundleItem.virtual_prices != null)
                    {
                        var virtualCurrencyPrice = bundleItem.virtual_prices.First(x => x.is_default);
                        widget.PriceText.text = $"{virtualCurrencyPrice.name}: {virtualCurrencyPrice.amount}";
                    }
    
                    ImageLoader.Instance.GetImageAsync(bundleItem.image_url,
                        (url, sprite) => widget.IconImage.sprite = sprite);
                }
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    На рисунке ниже приведен результат работы скрипта.

    Реализация отображения пакетов виртуальной валюты

    Создание виджета пакета виртуальной валюты

    1. Создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели Hierarchy на панель Project.
    3. Выберите созданный префаб и в панели Inspector нажмите Open Prefab.
    4. Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:

      • фоновое изображение виджета;
      • название пакета;
      • описание пакета;
      • стоимость пакета;
      • изображение пакета.

    На рисунке ниже приведен пример структуры виджета.

    Создание скрипта виджета

    1. Создайте скрипт VirtualCurrencyPackageWidget, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса виджета бандла и присвойте им значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class VirtualCurrencyPackageWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
    
            public Text NameText;
    
            public Text DescriptionText;
    
            public Text PriceText;
    
            public Image IconImage;
        }
    }
    

    Создание страницы для отображения списка пакетов виртуальной валюты

    1. На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение страницы;
      • область отображения виджетов пакетов виртуальной валюты.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт VirtualCurrencyPackagesPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные:
      • WidgetsContainer — контейнер для виджетов;
      • WidgetPrefab — префаб виджета пакета.

    1. Добавьте скрипт к игровому объекту страницы:
      1. Выберите объект в панели Hierarchy.
      2. В панели Inspector нажмите Add Component и выберите скрипт VirtualCurrencyPackagesPage.
    2. Присвойте переменным значения в панели Inspector.
    3. Добавьте логику для авторизации. Для этого в методе Start вызовите метод SDK XsollaAuth.Instance.SignIn и передайте в него:

      • имя пользователя или email-адрес в параметре username;
      • пароль пользователя в параметре password;

    Примечание
    В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).

      • флаг в параметре rememberUser для запоминания учетной записи;
      • метод OnAuthenticationSuccess для обработки успешной авторизации пользователя;
      • метод OnError для обработки ошибки.

    1. Добавьте логику получения списка предметов. В методе OnAuthenticationSuccess вызовите метод SDK XsollaCatalog.Instance.GetVirtualCurrencyPackagesList и передайте в него:
      • ID проекта в параметре projectId;

    Примечание
    ID проекта можно найти в разделе Настройки проекта Личного кабинета. В примере скрипта в параметр передается значение из настроек SDK.

      • метод OnItemsRequestSuccess для обработки успешного получения списка пакетов;
      • метод OnError для обработки ошибки.

    1. В методе OnPackagesRequestSuccess добавьте логику создания виджета для каждого из полученных пакетов:
      1. Создайте экземпляр виджета пакета как дочерний объект контейнера.
      2. Присвойте полученный компонент VirtualCurrencyPackageWidget переменной widget.

    1. Передайте в виджет пакета полученные данные:
      1. В элемент с названием пакета передайте значение переменной packageItem.name.
      2. В элемент с описанием пакета передайте значение переменной packageItem.description.
      3. Для отображения цены пакета реализуйте следующую логику:

        • Если значение переменной packageItem.price не равно null, значит, этот предмет продается за реальную валюту. Сформируйте цену в формате {amount} {currency} и передайте ее в элемент виджета.
        • Если значение переменной packageItem.virtual_prices не равно null, значит, этот предмет продается за виртуальную валюту. Сформируйте цену в формате {name}: {amount} и передайте ее в элемент виджета.

    Примечание
    Переменная packageItem.virtual_prices представляет собой массив цен пакета в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках пакета в разделе Магазин > Виртуальная валюта > Пакеты Личного кабинета.

      1. Для отображения изображения предмета, используйте утилитарный метод ImageLoader.Instance.GetImageAsync и передайте в него:
        • URL изображения;
        • анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения пакета.

    Пример скрипта контроллера страницы:

    Copy
    Full screen
    Small screen
    using System.Linq;
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Catalog;
    using Xsolla.Core;
    
    namespace Recipes
    {
        public class VirtualCurrencyPackagesPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
         public Transform WidgetsContainer;
    
            public GameObject WidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
             XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, onSuccess: OnAuthenticationSuccess, onError: OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for packages from store
             XsollaCatalog.Instance.GetVirtualCurrencyPackagesList(XsollaSettings.StoreProjectId, OnPackagesRequestSuccess, OnError);
            }
    
            private void OnPackagesRequestSuccess(VirtualCurrencyPackages packageItems)
            {
                // Iterating the packages collection and assign values for appropriate ui elements
             foreach (var packageItem in packageItems.items)
                {
                    var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
                    var widget = widgetGo.GetComponent<VirtualCurrencyPackageWidget>();
    
                    widget.NameText.text = packageItem.name;
                    widget.DescriptionText.text = packageItem.description;
    
                    if (packageItem.price != null)
                    {
                        var realMoneyPrice = packageItem.price;
                        widget.PriceText.text = $"{realMoneyPrice.amount} {realMoneyPrice.currency}";
                    }
                    else if (packageItem.virtual_prices != null)
                    {
                        var virtualCurrencyPrice = packageItem.virtual_prices.First(x => x.is_default);
                        widget.PriceText.text = $"{virtualCurrencyPrice.name}: {virtualCurrencyPrice.amount}";
                    }
    
                    ImageLoader.Instance.GetImageAsync(packageItem.image_url,
                        (url, sprite) => widget.IconImage.sprite = sprite);
                }
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    На рисунке ниже приведен результат работы скрипта.

    Была ли статья полезна?
    Спасибо!
    Что может сделать страницу еще лучше? Сообщение
    Жаль, что так произошло
    Расскажите, почему статья не была полезна. Сообщение
    Спасибо за обратную связь!
    Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
    Скрыть

    Продажа виртуальных предметов за реальную валюту

    Эта инструкция показывает, как использовать методы SDK, чтобы реализовать покупку товаров за реальную валюту.

    Перед началом работы реализуйте отображение виртуальных предметов в каталоге. В примере описана реализация покупки виртуальных предметов. Настройка покупки других типов товаров выполняется аналогично.

    В обучающей инструкции описана реализация следующей логики:

    Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примере. Возможный вариант реализации отображения каталога и покупки товаров за виртуальную валюту приведен в демо.

    Доработка виджета предмета

    Добавьте в виджет предмета кнопку для покупки и настройте ее внешний вид.

    На рисунке ниже приведен пример структуры виджета.

    Доработка скрипта виджета предмета

    1. Откройте скрипт VirtualItemWidget.
    2. Объявите переменную кнопки для покупки предмета и присвойте ей значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class VirtualItemWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
    
            public Text NameText;
    
            public Text DescriptionText;
    
            public Text PriceText;
    
            public Image IconImage;
    
            public Button BuyButton;
        }
    }
    

    Доработка контроллера страницы для отображения списка предметов

    1. Откройте скрипт VirtualItemsPage.
    2. В методе OnAuthenticationSuccess передайте в переменную Token.Instance токен авторизации.

    Примечание
    Вы можете использовать один из следующих токенов:

    1. Добавьте логику обработки нажатия кнопки для покупки виртуального предмета:
      1. В методе OnItemsRequestSuccess подпишитесь на событие нажатия кнопки для покупки виртуального предмета.
      2. Добавьте анонимный метод, который будет вызываться после нажатия кнопки.
      3. В анонимном методе вызовите метод SDK XsollaCatalog.Instance.PurchaseItem для формирования заказа и передайте в него:

        • ID проекта в параметре projectId;
        • идентификатор предмета в параметре itemSku;
        • метод OnOrderCreateSuccess для обработки успешного формирования заказа на покупку предмета;
        • метод OnError для обработки ошибки.

    1. Реализуйте открытие страницы оплаты. Для этого добавьте метод OnOrderCreateSuccess и вызовите в нем:
      • метод SDK XsollaOrders.Instance.OpenPurchaseUi, чтобы открыть страницу оплаты;
      • корутину TrackOrderStatus, чтобы отслеживать изменения статуса заказа.

    Примечание
    По умолчанию страница оплаты открывается во встроенном браузере. Чтобы открывать страницу оплаты во внешнем браузере, в главном меню редактора Unity выберите пункт Window > Xsolla > Edit Settings и снимите флажок Enable in-app browser? в панели Inspector. При использовании внешнего браузера для Android-приложений рекомендуется настроить внешние ссылки для перенаправления пользователя в приложение после оплаты.

    1. В корутине TrackOrderStatus реализуйте получение данных о статусе заказа раз в секунду. Для этого используйте метод SDK XsollaOrders.Instance.CheckOrderStatus и передайте в него:
      • ID проекта в параметре projectId;
      • номер заказа из данных платежа в параметре orderId;
      • анонимный метод для обработки успешного получения информации о статусе;
      • анонимный метод для обработки ошибки.

    1. В методе обработки успешного получения информации о статусе реализуйте вызов метода OnPurchaseSuccess при оплате заказа (статус платежа done или paid).
    2. В методе OnPurchaseSuccess реализуйте обработку успешной покупки виртуального предмета.

    Примечание

    В примере скрипта при успешной покупке предмета вызывается стандартный метод Debug.Log. Вы можете добавить другие действия, например, отображение инвентаря.

    Реализация логики для добавления купленных предметов в инвентарь не требуется, действие выполняется автоматически.

    1. Если для открытия страницы оплаты использовался встроенный браузер, закройте его.

    Пример скрипта для страницы:

    Copy
    Full screen
    Small screen
    using System.Collections;
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Catalog;
    using Xsolla.Core;
    using Xsolla.Orders;
    
    namespace Recipes
    {
        public class VirtualItemsPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
    
            public Transform WidgetsContainer;
    
            public GameObject WidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
    
                XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, onSuccess: OnAuthenticationSuccess, onError: OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for catalog from store
             Token.Instance = Token.Create(token);
                XsollaCatalog.Instance.GetCatalog(XsollaSettings.StoreProjectId, OnItemsRequestSuccess, OnError, offset: 0, limit: 50);
            }
    
            private void OnItemsRequestSuccess(StoreItems storeItems)
            {
                // Iterating the items collection and assign values for appropriate ui elements
    
                foreach (var storeItem in storeItems.items)
                {
                    if (storeItem.price == null)
                        continue;
    
                    var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
                    var widget = widgetGo.GetComponent<VirtualItemWidget>();
    
                    widget.NameText.text = storeItem.name;
                    widget.DescriptionText.text = storeItem.description;
    
                    var realMoneyPrice = storeItem.price;
                    widget.PriceText.text = $"{realMoneyPrice.amount} {realMoneyPrice.currency}";
    
                    ImageLoader.Instance.GetImageAsync(storeItem.image_url,
                        (url, sprite) => widget.IconImage.sprite = sprite);
    
                    widget.BuyButton.onClick.AddListener(() =>
                    {
                        XsollaCatalog.Instance.PurchaseItem(XsollaSettings.StoreProjectId, storeItem.sku, OnOrderCreateSuccess, OnError);
                    });
                }
            }
    
            private void OnOrderCreateSuccess(PurchaseData purchaseData)
            {
                XsollaOrders.Instance.OpenPurchaseUi(purchaseData);
                StartCoroutine(TrackOrderStatus(purchaseData));
            }
    
            private IEnumerator TrackOrderStatus(PurchaseData purchaseData)
            {
                var isDone = false;
                while (!isDone)
                {
                    XsollaOrders.Instance.CheckOrderStatus
                    (
                        XsollaSettings.StoreProjectId,
                        purchaseData.order_id,
                        status =>
                        {
                            if (status.status == "paid" || status.status == "done")
                            {
                                isDone = true;
                                OnPurchaseSuccess();
                            }
                        },
                        error => { OnError(error); }
                    );
    
                    yield return new WaitForSeconds(1f);
                }
            }
    
            private void OnPurchaseSuccess()
            {
                UnityEngine.Debug.Log($"Purchase successful");
                BrowserHelper.Instance.Close();
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    Была ли статья полезна?
    Спасибо!
    Что может сделать страницу еще лучше? Сообщение
    Жаль, что так произошло
    Расскажите, почему статья не была полезна. Сообщение
    Спасибо за обратную связь!
    Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
    Скрыть

    Продажа виртуальных предметов за виртуальную валюту

    Эта инструкция показывает, как использовать методы SDK, чтобы реализовать покупку товаров за виртуальную валюту.

    Перед началом работы реализуйте отображение виртуальных предметов в каталоге. В примере описана реализация покупки виртуальных предметов. Настройка покупки других типов товаров выполняется аналогично.

    В обучающей инструкции описана реализация следующей логики:

    Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примере. Возможный вариант реализации отображения каталога и покупки товаров за виртуальную валюту приведен в демо.

    Доработка виджета предмета

    Добавьте в виджет предмета кнопку для покупки и настройте ее внешний вид.

    На рисунке ниже приведен пример структуры виджета.

    Доработка скрипта виджета предмета

    1. Откройте скрипт VirtualItemWidget.
    2. Объявите переменную кнопки для покупки предмета и присвойте ей значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class VirtualItemWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
    
            public Text NameText;
    
            public Text DescriptionText;
    
            public Text PriceText;
    
            public Image IconImage;
    
            public Button BuyButton;
        }
    }
    

    Доработка контроллера страницы для отображения списка предметов

    1. Откройте скрипт VirtualItemsPage.
    2. В методе OnAuthenticationSuccess передайте в переменную Token.Instance токен авторизации.

    Примечание
    Вы можете использовать один из следующих токенов:

    1. Добавьте логику обработки нажатия кнопки для покупки виртуального предмета:
      1. В методе OnItemsRequestSuccess подпишитесь на событие нажатия кнопки для покупки виртуального предмета.
      2. Добавьте анонимный метод, который будет вызываться после нажатия кнопки.
      3. В анонимном методе вызовите метод SDK XsollaCatalog.Instance.PurchaseItem для формирования заказа и передайте в него:

        • ID проекта в параметре projectId;
        • идентификатор предмета в параметре itemSku;
        • метод OnOrderCreateSuccess для обработки успешного формирования заказа на покупку предмета;
        • метод OnError для обработки ошибки.

    1. В методе OnOrderCreateSuccess реализуйте проверку статуса заказа. Для этого используйте метод SDK XsollaOrders.Instance.CheckOrderStatus и передайте в него:
      • ID проекта в параметре projectId;
      • номер заказа из данных платежа в параметре orderId;
      • анонимный метод для обработки успешного получения информации о статусе;
      • анонимный метод для обработки ошибки.

    1. В методе обработки успешного получения информации о статусе реализуйте вызов метода OnPurchaseSuccess при оплате заказа (статус платежа done или paid).
    2. В методе OnPurchaseSuccess реализуйте обработку успешной покупки виртуального предмета.

    Примечание

    В примере скрипта при успешной покупке предмета вызывается стандартный метод Debug.Log. Вы можете добавить другие действия, например, отображение инвентаря и изменение баланса виртуальной валюты.

    Реализация логики для добавления купленных предметов в инвентарь не требуется, действие выполняется автоматически.

    Пример скрипта для страницы:

    Copy
    Full screen
    Small screen
    using System.Linq;
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Catalog;
    using Xsolla.Core;
    using Xsolla.Orders;
    
    namespace Recipes
    {
        public class VirtualItemsPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
    
            public Transform WidgetsContainer;
    
            public GameObject WidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
    
                XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, onSuccess: OnAuthenticationSuccess, onError: OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for catalog from store
             Token.Instance = Token.Create(token);
                XsollaCatalog.Instance.GetCatalog(XsollaSettings.StoreProjectId, OnItemsRequestSuccess, OnError, offset: 0, limit: 50);
            }
    
            private void OnItemsRequestSuccess(StoreItems storeItems)
            {
                // Iterating the items collection and assign values for appropriate ui elements
             foreach (var storeItem in storeItems.items)
                {
                    if (storeItem.virtual_prices.Length == 0)
                        continue;
    
                    var widget = Instantiate(WidgetPrefab, WidgetsContainer, false).GetComponent<VirtualItemWidget>();
    
                    widget.NameText.text = storeItem.name;
                    widget.DescriptionText.text = storeItem.description;
    
                    var defaultPrice = storeItem.virtual_prices.First(x => x.is_default);
                    widget.PriceText.text = $"{defaultPrice.name}: {defaultPrice.amount}";
    
                    ImageLoader.Instance.GetImageAsync(storeItem.image_url, (url, sprite) => widget.IconImage.sprite = sprite);
    
                    widget.BuyButton.onClick.AddListener(() =>
                    {
                        var price = storeItem.virtual_prices.First(x => x.is_default);
                        XsollaCatalog.Instance.PurchaseItemForVirtualCurrency(XsollaSettings.StoreProjectId, storeItem.sku, price.sku, OnOrderCreateSuccess, OnError);
                    });
                }
            }
    
            private void OnOrderCreateSuccess(PurchaseData purchaseData)
            {
                XsollaOrders.Instance.CheckOrderStatus
                (
                    XsollaSettings.StoreProjectId,
                    purchaseData.order_id,
                    status =>
                    {
                        if (status.status == "paid" || status.status == "done")
                        {
                            OnPurchaseSuccess();
                        }
                    },
                    error =>
                    {
                        OnError(error);
                    }
                );
            }
    
    
            private void OnPurchaseSuccess()
            {
                UnityEngine.Debug.Log($"Purchase successful");
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    Была ли статья полезна?
    Спасибо!
    Что может сделать страницу еще лучше? Сообщение
    Жаль, что так произошло
    Расскажите, почему статья не была полезна. Сообщение
    Спасибо за обратную связь!
    Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
    Скрыть

    Отображение баланса виртуальной валюты

    Эта обучающая инструкция показывает, как с помощью методов SDK реализовать в приложении отображение баланса виртуальной валюты.

    Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации каталога товаров во внутриигровом магазине приведен в демо.

    Создание виджета для отображения баланса

    1. Создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели Hierarchy на панель Project.
    3. Выберите созданный префаб и в панели Inspector нажмите Open Prefab.
    4. Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение виджета;
      • название виртуальной валюты;
      • количество виртуальной валюты;
      • изображение виртуальной валюты.

    На рисунке ниже приведен пример структуры виджета.

    Создание скрипта виджета для отображения баланса

    1. Создайте скрипт VirtualCurrencyWidget, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса виджета бандла и присвойте им значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class VirtualCurrencyWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
    
            public Text NameText;
    
            public Text AmountText;
    
            public Image IconImage;
        }
    }
    

    Создание страницы со списком виртуальных валют

    1. На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение страницы;
      • область отображения виджетов.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы со списком виртуальных валют

    1. Создайте скрипт VirtualCurrenciesPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные:
      • WidgetsContainer — контейнер для виджетов;
      • WidgetPrefab — префаб виджета для просмотра баланса.

    1. Добавьте скрипт к игровому объекту страницы:
      1. Выберите объект в панели Hierarchy.
      2. В панели Inspector нажмите Add Component и выберите скрипт VirtualCurrenciesPage.

    1. Присвойте переменным значения в панели Inspector.
    2. Добавьте логику для авторизации. Для этого в методе Start вызовите метод SDK XsollaAuth.Instance.SignIn и передайте в него:
      • имя пользователя или email-адрес в параметре username;
      • пароль пользователя в параметре password;

    Примечание
    В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).

      • флаг в параметре rememberUser для запоминания учетной записи;
      • метод OnAuthenticationSuccess для обработки успешной авторизации пользователя;
      • метод OnError для обработки ошибки.

    1. Добавьте логику получения списка виртуальных валют. Для этого в методе OnAuthenticationSuccess:
      1. Передайте в переменную Token.Instance токен авторизации.

    Примечание
    Вы можете использовать один из следующих токенов:

      1. Вызовите метод SDK XsollaInventory.Instance.GetVirtualCurrencyBalance и передайте в него:
        • ID проекта в параметре projectId;

    Примечание
    ID проекта можно найти в разделе Настройки проекта Личного кабинета. В примере скрипта в параметр передается значение из настроек SDK.

        • метод OnBalanceRequestSuccess для обработки успешного получения списка виртуальных валют;
        • метод OnError для обработки ошибки.

    1. Для каждой из полученных виртуальных валют в методе OnBalanceRequestSuccess добавьте логику создания виджета для отображения баланса:
      1. Создайте экземпляр виджета как дочерний объект контейнера.
      2. Присвойте полученный компонент VirtualCurrencyWidget переменной widget.

    1. Передайте в виджет для отображения баланса полученные данные:
      1. В элемент с названием виртуальной валюты передайте значение переменной balanceItem.name.
      2. В элемент с количеством виртуальной валюты передайте значение переменной balanceItem.amount.ToString().
      3. Для показа изображения виртуальной валюты используйте утилитарный метод ImageLoader.Instance.GetImageAsync и передайте в него:
        • URL изображения;
        • анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения виртуальной валюты.

    Пример скрипта контроллера страницы:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Core;
    using Xsolla.Inventory;
    
    namespace Recipes
    {
        public class VirtualCurrenciesPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
    
            public Transform WidgetsContainer;
    
            public GameObject WidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
    
                XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, null, OnAuthenticationSuccess, OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for virtual currencies
    
                Token.Instance = Token.Create(token);
                XsollaInventory.Instance.GetVirtualCurrencyBalance(XsollaSettings.StoreProjectId, OnBalanceRequestSuccess, OnError);
            }
    
            private void OnBalanceRequestSuccess(VirtualCurrencyBalances balance)
            {
                // Iterating the virtual currencies list and assign values for appropriate ui elements
    
                foreach (var balanceItem in balance.items)
                {
                    var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
                    var widget = widgetGo.GetComponent<VirtualCurrencyWidget>();
    
                    widget.NameText.text = balanceItem.name;
                    widget.AmountText.text = balanceItem.amount.ToString();
    
                    ImageLoader.Instance.GetImageAsync(balanceItem.image_url, (url, sprite) => widget.IconImage.sprite = sprite);
                }
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    На рисунке ниже приведен результат работы скрипта.

    Была ли статья полезна?
    Спасибо!
    Что может сделать страницу еще лучше? Сообщение
    Жаль, что так произошло
    Расскажите, почему статья не была полезна. Сообщение
    Спасибо за обратную связь!
    Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
    Скрыть

    Отображение предметов в инвентаре

    Эта обучающая инструкция показывает, как с помощью методов SDK реализовать отображение предметов в инвентаре пользователя.

    Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации инвентаря приведен в демо.

    Создание виджета предмета

    1. Создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели Hierarchy на панель Project.
    3. Выберите созданный префаб и в панели Inspector нажмите Open Prefab.
    4. Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение виджета;
      • название предмета;
      • описание предмета;
      • количество предметов;
      • изображение предмета.

    На рисунке ниже приведен пример структуры виджета.

    Создание скрипта виджета предмета

    1. Создайте скрипт InventoryItemWidget, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные для элементов интерфейса виджета предмета и присвойте им значения в панели Inspector.

    Пример скрипта виджета:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Recipes
    {
        public class InventoryItemWidget : MonoBehaviour
        {
            // Declaration of variables for UI elements
    
            public Text NameText;
    
            public Text DescriptionText;
    
            public Text QuantityText;
    
            public Image IconImage;
        }
    }
    

    Создание страницы для отображения инвентаря

    1. На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт GameObject > Create Empty.
    2. Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
      • фоновое изображение страницы;
      • область отображения виджетов предметов.

    На рисунке ниже приведен пример структуры страницы.

    Создание контроллера страницы

    1. Создайте скрипт InventoryItemsPage, наследуемый от стандартного класса MonoBehaviour.
    2. Объявите переменные:
      • WidgetsContainer — контейнер для виджетов предметов;
      • WidgetPrefab — префаб виджета предмета.

    1. Добавьте скрипт к игровому объекту страницы:
      1. Выберите объект в панели Hierarchy.
      2. В панели Inspector нажмите Add Component и выберите скрипт InventoryItemsPage.

    1. Присвойте переменным значения в панели Inspector.
    2. Добавьте логику для авторизации. Для этого в методе Start вызовите метод SDK XsollaAuth.Instance.SignIn и передайте в него:
      • имя пользователя или email-адрес в параметре username;
      • пароль пользователя в параметре password;

    Примечание
    В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).

      • флаг в параметре rememberUser для запоминания учетной записи;
      • метод OnAuthenticationSuccess для обработки успешной авторизации пользователя;
      • метод OnError для обработки ошибки.

    1. Добавьте логику получения предметов инвентаря. Для этого в методе OnAuthenticationSuccess:
      1. Передайте в переменную Token.Instance токен авторизации.

    Примечание
    Вы можете использовать один из следующих токенов:

      1. Вызовите метод SDK XsollaInventory.Instance.GetInventoryItems и передайте в него:
        • ID проекта в параметре projectId;

    Примечание
    ID проекта можно найти в разделе Настройки проекта Личного кабинета. В примере скрипта в параметр передается значение из настроек SDK.

        • метод OnItemsRequestSuccess для обработки успешного получения списка пакетов;
        • метод OnError для обработки ошибки.

    1. Для каждого из полученных предметов в методе OnItemsRequestSuccess добавьте логику создания виджета:
      1. С помощью метода InventoryItem.IsVirtualCurrency добавьте проверку, что полученный предмет не является виртуальной валютой.

    Примечание
    В данном примере в инвентаре отображаются только виртуальные предметы, бандлы и подписки. Реализуйте отображение баланса виртуальной валюты игрока на отдельной странице.

      1. Создайте экземпляр виджета как дочерний объект контейнера.
      2. Присвойте полученный компонент InventoryItemWidget переменной widget.

    1. Передайте в виджет предмета полученные данные:
      1. В элемент с названием предмета передайте значение переменной inventoryItem.name.
      2. В элемент с описанием предмета передайте значение переменной inventoryItem.description.
      3. В элемент с количеством предметов передайте значение переменной inventoryItem.amount.ToString().
      4. Для показа изображения предмета используйте утилитарный метод ImageLoader.Instance.GetImageAsync и передайте в него:
        • URL изображения;
        • анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения предмета.

    Пример скрипта контроллера страницы:

    Copy
    Full screen
    Small screen
    using UnityEngine;
    using Xsolla.Auth;
    using Xsolla.Core;
    using Xsolla.Inventory;
    
    namespace Recipes
    {
        public class InventoryItemsPage : MonoBehaviour
        {
            // Declaration of variables for containers and widget prefabs
         public Transform WidgetsContainer;
    
            public GameObject WidgetPrefab;
    
            private void Start()
            {
                // Starting the authentication process
             XsollaAuth.Instance.SignIn("xsolla", "xsolla", true, null, null, OnAuthenticationSuccess, OnError);
            }
    
            private void OnAuthenticationSuccess(string token)
            {
                // After successful authentication starting the request for virtual currencies
             Token.Instance = Token.Create(token);
                XsollaInventory.Instance.GetInventoryItems(XsollaSettings.StoreProjectId, OnItemsRequestSuccess, OnError);
            }
    
            private void OnItemsRequestSuccess(InventoryItems inventoryItems)
            {
                // Iterating the item list and assign values for appropriate ui elements
    
                foreach (var inventoryItem in inventoryItems.items)
                {
                    if (inventoryItem.IsVirtualCurrency())
                        continue;
    
                    var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
                    var widget = widgetGo.GetComponent<InventoryItemWidget>();
    
                    widget.NameText.text = inventoryItem.name;
                    widget.DescriptionText.text = inventoryItem.description;
                    widget.QuantityText.text = inventoryItem.quantity.ToString();
    
                    ImageLoader.Instance.GetImageAsync(inventoryItem.image_url, (url, sprite) => widget.IconImage.sprite = sprite);
                }
            }
    
            private void OnError(Error error)
            {
                UnityEngine.Debug.LogError($"Error message: {error.errorMessage}");
            }
        }
    }
    

    На рисунке ниже приведен результат работы скрипта.

    Была ли статья полезна?
    Спасибо!
    Что может сделать страницу еще лучше? Сообщение
    Жаль, что так произошло
    Расскажите, почему статья не была полезна. Сообщение
    Спасибо за обратную связь!
    Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
    Скрыть
    Прогресс интеграции
    Спасибо за обратную связь!

    Полезные ссылки

    Последнее обновление: 8 августа 2022

    Нашли опечатку или ошибку в тексте? Выделите ее и нажмите Ctrl+Enter.

    Сообщите о проблеме
    Мы постоянно улучшаем качество нашей документации. Ваш отзыв поможет нам в этом.
    Укажите email-адрес, чтобы мы могли связаться с вами
    Спасибо за обратную связь!