Интеграция SDK на стороне приложения
- Разработайте интерфейс для системы входа, внутриигрового магазина и других страниц вашего приложения.
- Настройте обработку событий в соответствии с логикой вашего приложения с помощью методов SDK. Чтобы начать работать с основными функциями SDK, следуйте пошаговым обучающим инструкциям ниже.
Эта инструкция показывает, как с помощью методов SDK реализовать:
- регистрацию пользователя;
- запрос пользователем повторной отправки письма с подтверждением регистрации;
- авторизацию пользователя;
- сброс пароля пользователя.
Для аутентификации пользователя может использоваться имя пользователя или email-адрес. В приведенных ниже примерах применяется имя пользователя, а email-адрес используется для подтверждения регистрации пользователя и для сброса пароля.
Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации системы авторизации приведен в демо.
Реализация регистрации пользователя
В обучающей инструкции описана реализация следующей логики:
Создание интерфейса страницы
Создайте сцену для страницы регистрации и добавьте на нее следующие элементы:
- поле для ввода имени пользователя;
- поле для ввода email-адреса пользователя;
- поле для ввода пароля пользователя;
- кнопка регистрации пользователя.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
RegistrationPage
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели
Inspector . - Добавьте логику для обработки нажатия кнопки регистрации:
- В методе
Start
подпишитесь на событие нажатия кнопки. - Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
- В анонимном методе объявите переменные
username
,email
иpassword
и инициализируйте их значениями из полей на странице. - Вызовите метод SDK
XsollaAuth.Instance.Register
и передайте в него переменныеusername
,email
,password
и следующие методы:
- В методе
OnSuccess
— вызывается в случае успешной регистрации;OnError
— вызывается в случае ошибки.
В примерах скриптов методы OnSuccess
и OnError
вызывают стандартный метод Debug.Log. Код и описание ошибки передаются в параметре error
.
Вы можете добавить другие действия. Например, при успешной регистрации открывать страницу с повторным запросом письма о регистрации или страницу авторизации.
Пример скрипта для страницы регистрации:
- C#
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, password, email, 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-приложение, настройте внешние ссылки, чтобы возвращать пользователя в приложение после подтверждения регистрации.
Реализация запроса повторной отправки письма с подтверждением регистрации
В обучающей инструкции описана реализация следующей логики:
Создание интерфейса страницы
Создайте сцену для страницы запроса повторной отправки письма и добавьте на нее следующие элементы:
- поле для ввода имени пользователя или email-адреса;
- кнопка повторной отправки письма.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
ResendConfirmationEmail
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели
Inspector . - Добавьте логику для обработки нажатия кнопки повторной отправки письма:
- В методе
Start
подпишитесь на событие нажатия кнопки. - Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
- В анонимном методе объявите переменную
username
и инициализируйте ее значением из поля ввода на странице. - Вызовите метод SDK
XsollaAuth.Instance.ResendConfirmationLink
и передайте в него переменнуюusername
и методыOnSuccess
иOnError
.
- В методе
Пример скрипта для страницы запроса повторной отправки письма:
- C#
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-адрес.
Реализация авторизации пользователя
В обучающей инструкции описана реализация следующей логики:
Создание интерфейса страницы
Создайте сцену для страницы авторизации и добавьте на нее следующие элементы:
- поле для ввода имени пользователя;
- поле для ввода пароля;
- флажок для запоминания учетной записи;
- кнопка авторизации.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
AutorizationPage
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели
Inspector . - Добавьте логику для обработки нажатия кнопки авторизации:
- В методе
Start
подпишитесь на событие нажатия кнопки. - Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
- В анонимном методе объявите переменные
username
,password
и инициализируйте их значениями из полей ввода на странице авторизации. Создайте переменнуюrememberMe
и инициализируйте ее состоянием флажка для запоминания учетной записи. - Вызовите метод SDK
XsollaAuth.Instance.SignIn
и передайте в него переменныеusername
,password
,rememberMe
и методыOnSuccess
иOnError
.
- В методе
token
передается токен авторизации, который используется в запросах к серверам Иксоллы.Пример скрипта для страницы авторизации:
- C#
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-адреса;
- кнопка сброса пароля.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
ResetPasswordPage
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса страницы и присвойте им значения в панели
Inspector . - Добавьте логику для обработки нажатия кнопки сброса пароля:
- В методе
Start
подпишитесь на событие нажатия кнопки. - Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
- В анонимном методе объявите переменную
username
и инициализируйте ее значением из поля ввода на странице сброса пароля. - Вызовите метод SDK
XsollaAuth.Instance.ResetPassword
и передайте в него переменнуюusername
и методыOnSuccess
иOnError
.
- В методе
Пример скрипта для страницы сброса пароля:
- C#
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, 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
}
}
}
При успешном запросе сброса пароля пользователю отправляется письмо со ссылкой для изменения пароля. В Личном кабинете в настройках варианта авторизации (Безопасность > OAuth 2.0 аутентификация > URI переадресации OAuth 2.0) вы можете настроить URL-адрес, на который пользователь будет перенаправлен после успешной авторизации (аутентификации, подтверждения электронной почты или сброса пароля).
Эта инструкция показывает, как использовать методы SDK, чтобы реализовать регистрацию и авторизацию пользователя в приложении с помощью аккаунта в социальной сети.
В отличие от аутентификации пользователя с помощью имени пользователя/email-адреса и пароля, реализация отдельной логики для регистрации пользователя не нужна. Если пользователь входит в систему впервые через аккаунт социальной сети, новая учетная запись создается автоматически.
Если в вашем приложении аккаунт социальной сети является альтернативным способом аутентификации, аккаунт автоматически привязывается к уже существующей учетной записи пользователя при выполнении следующих условий:
- Зарегистрированный с помощью имени пользователя или email-адреса пользователь вошел в приложение через аккаунт социальной сети.
- Социальная сеть возвращает email-адрес.
- Email-адрес из социальной сети совпадает с email-адресом, указанными пользователем при регистрации в вашем приложении.
LinkSocialProvider
.В обучающей инструкции описана реализация следующей логики:
Примеры приведены для аутентификации пользователя с помощью аккаунта в Twitter, настройка других социальных сетей выполняется аналогично.
Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации системы авторизации приведен в демо.
Создание интерфейса страницы
Создайте сцену для страницы входа в приложение и добавьте на нее кнопку авторизации через социальную сеть. На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
SocialAuthorizationPage
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса страницы входа в приложение и присвойте им значения в панели
Inspector . - Добавьте логику обработки нажатия кнопки авторизации:
- В методе
Start
подпишитесь на событие нажатия кнопки. - Добавьте анонимный метод, который будет вызываться после нажатия на кнопку.
- Для передачи URL страницы авторизации объявите переменную
url
в анонимном методе. Инициализируйте ее с помощью метода SDKGetSocialNetworkAuthUrl
, передав в параметреSocialProvider
значениеFacebook
. - Для открытия браузера вызовите метод
BrowserHelper.Instance.Open
, передайте в него переменнуюurl
и значениеtrue
для использования встроенного браузера.
- В методе
- Для получения токена и закрытия браузера отследите изменение URL страницы после успешной регистрации пользователя:
- Объявите переменную
singlePageBrowser
и инициализируйте ее с помощью методаBrowserHelper.Instance.GetLastBrowser
. - Подпишитесь на событие изменения URL активной страницы и установите метод
OnUrlChanged
в качестве обработчика.
- Объявите переменную
- Для получения токена и закрытия браузера отследите изменение URL страницы после успешной регистрации пользователя:
- Реализуйте получение токена:
- С помощью утилитарного метода
ParseUtils.TryGetValueFromUrl
выполните парсинг URL активной страницы, который передается в методеOnUrlChanged
. - Добавьте проверку на наличие в URL активной страницы кода аутентификации. Метод
ParseUtils.TryGetValueFromUrl
передает код аутентификации в переменнойcode
. - Для обмена кода аутентификации на токен вызовите метод SDK
ExchangeCodeToToken
и передайте в него переменнуюcode
и следующие методы:OnSuccess
— вызывается в случае успешной авторизации;OnError
— вызывается в случае ошибки.
- С помощью утилитарного метода
В примере скрипта методы OnSuccess
и OnError
вызывают стандартный метод Debug.Log. Вы можете добавить другие действия.
Если пользователь успешно авторизовался, в параметре token
передается токен авторизации, который используется в запросах к серверам Иксоллы. При ошибке в параметре error
передаются код и описание ошибки.
- После получения токена удалите игровой объект с браузером.
Пример скрипта для страницы авторизации:
- C#
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);
BrowserHelper.Instance.Close();
}
}
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 реализовать во внутриигровом магазине отображение:
- виртуальных предметов;
- групп виртуальных предметов;
- бандлов;
- пакетов виртуальных валют.
Перед началом работы добавьте товары в Личном кабинете:
В обучающей инструкции описана реализация следующей логики:
Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации каталога товаров во внутриигровом магазине приведен в демо.
В примере для каждого товара в каталоге отображаются:
- название товара;
- описание товара;
- стоимость товара;
- изображение.
Вы также можете отображать другие данные о товаре, которые хранятся во внутриигровом магазине.
Реализация отображения виртуальных предметов
Создание виджета предмета
- Создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели
Hierarchy на панельProject . - Выберите созданный префаб и в панели
Inspector нажмитеOpen Prefab . - Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение виджета;
- название предмета;
- описание предмета;
- стоимость предмета;
- изображение предмета.
На рисунке ниже приведен пример структуры виджета.
Создание скрипта виджета предмета
- Создайте скрипт
VirtualItemWidget
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса виджета предмета и присвойте им значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Создание страницы для отображения списка предметов
- На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение страницы;
- область отображения виджетов предметов.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
VirtualItemsPage
, наследуемый от стандартного классаMonoBehaviour
. - Объявите переменные:
WidgetsContainer
— контейнер для виджетов;WidgetPrefab
— префаб виджета предмета.
- Добавьте скрипт к игровому объекту страницы:
- Выберите объект в панели
Hierarchy . - В панели
Inspector нажмитеAdd Component и выберите скриптVirtualItemsPage
.
- Выберите объект в панели
- Присвойте переменным значения в панели
Inspector .
- Добавьте логику для авторизации. Для этого в методе
Start
вызовите метод SDKXsollaAuth.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка предметов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaCatalog.Instance.GetCatalog
и передайте в него:- ID проекта в параметре
projectId
;
- ID проекта в параметре
- метод
OnItemsRequestSuccess
для обработки успешного получения списка предметов; - метод
OnError
для обработки ошибки; - сдвиг в получении предметов относительно первого элемента в параметре
offset
; - количество загружаемых предметов в параметре
limit
.
- метод
offset
и limit
необязательные. Используйте их для реализации пагинации — постраничного отображения предметов в каталоге. Максимальное количество предметов на странице — 50. Если в каталоге больше 50 предметов, пагинация обязательна.- В методе
OnItemsRequestSuccess
добавьте логику создания виджета для каждого из полученных предметов:- Создайте экземпляр виджета предмета как дочерний объект контейнера.
- Присвойте полученный компонент
VirtualItemWidget
переменнойwidget
.
- Передайте в виджет предмета полученные данные:
- В элемент с названием предмета передайте значение переменной
storeItem.name
. - В элемент с описанием предмета передайте значение переменной
storeItem.description
. - Для отображения цены предмета реализуйте следующую логику:
- Если значение переменной
storeItem.price
не равноnull
, значит, этот предмет продается за реальную валюту. Сформируйте цену в формате{amount} {currency}
и передайте ее в элемент виджета. - Если значение переменной
storeItem.virtual_prices
не равноnull
, значит, этот предмет продается за виртуальную валюту. Сформируйте цену в формате{name}: {amount}
и передайте ее в элемент виджета.
- Если значение переменной
- В элемент с названием предмета передайте значение переменной
storeItem.virtual_prices
представляет собой массив цен предмета в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках предмета в разделе Магазин > Виртуальные предметы Личного кабинета.- Для отображения изображения предмета, используйте утилитарный метод
ImageLoader.Instance.GetImageAsync
и передайте в него:- URL изображения;
- анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения пакета.
- Для отображения изображения предмета, используйте утилитарный метод
Пример скрипта контроллера страницы:
- C#
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}");
}
}
}
На рисунке ниже приведен результат работы скрипта.
Реализация отображения списка групп виртуальных предметов
Создание виджета предмета
- Создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели
Hierarchy на панельProject . - Выберите созданный префаб и в панели
Inspector нажмитеOpen Prefab . - Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение виджета;
- название предмета;
- описание предмета;
- стоимость предмета;
- изображение предмета.
На рисунке ниже приведен пример структуры виджета.
Создание скрипта виджета предмета
- Создайте скрипт
VirtualItemWidget
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса виджета предмета и присвойте им значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Создание виджета кнопки для просмотра группы предметов
- Создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели
Hierarchy на панельProject . - Выберите созданный префаб и в панели
Inspector нажмитеOpen Prefab . - Добавьте в качестве дочернего объекта префаба кнопку просмотра группы предметов и настройте ее внешний вид.
На рисунке ниже приведен пример структуры виджета.
Создание скрипта виджета кнопки для просмотра группы предметов
- Создайте скрипт
VirtualItemGroupButton
, наследуемый от стандартного классаMonoBehaviour
. - Объявите переменные для кнопки просмотра группы предметов и названия группы и присвойте им значения в панели
Inspector . - Добавьте скрипт к корневому объекту префаба:
- Выберите объект в панели
Hierarchy . - В панели
Inspector нажмитеAdd Component и выберите скриптVirtualItemGroupButton
.
- Выберите объект в панели
Пример скрипта виджета:
- C#
using UnityEngine;
using UnityEngine.UI;
namespace Recipes
{
public class VirtualItemGroupButton : MonoBehaviour
{
// Declaration of variables for UI elements
public Text NameText;
public Button Button;
}
}
Создание страницы для отображения списка предметов
- На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение страницы;
- область отображения кнопок выбора группы объектов;
- область отображения виджетов предметов.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
VirtualItemsByGroupsPage
, наследуемый от стандартного классаMonoBehaviour
. - Объявите переменные:
GroupButtonsContainer
— контейнер для кнопок групп;GroupButtonPrefab
— префаб кнопки;ItemWidgetsContainer
— контейнер для виджетов предметов;WidgetPrefab
— префаб виджета предмета.
- Добавьте скрипт к игровому объекту страницы:
- Выберите объект в панели
Hierarchy . - В панели
Inspector нажмитеAdd Component и выберите скриптVirtualItemsByGroupsPage
.
- Выберите объект в панели
- Присвойте переменным значения в панели
Inspector . - Добавьте логику для авторизации. Для этого в методе
Start
вызовите метод SDKXsollaAuth.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка предметов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaCatalog.Instance.GetCatalog
и передайте в него:- ID проекта в параметре
projectId
;
- ID проекта в параметре
- метод
OnItemsRequestSuccess
для обработки успешного получения списка предметов; - метод
OnError
для обработки ошибки; - сдвиг в получении предметов относительно первого элемента в параметре
offset
; - количество загружаемых предметов в параметре
limit
.
- метод
offset
и limit
необязательные. Используйте их для реализации пагинации — постраничного отображения предметов в каталоге. Максимальное количество предметов на странице — 50. Если в каталоге больше 50 предметов, пагинация обязательна.- В методе
OnItemsRequestSuccess
добавьте логику формирования списка групп предметов:- Получите список уникальных групп из полученного списка предметов. Добавьте к нему элемент
All
, при котором будут отображаться все предметы вне зависимости от категории. - Очистите контейнер кнопок, удалив все дочерние объекты. Для этого вызовите вспомогательный метод
DeleteAllChildren
и передайте ему объект контейнера. - Для каждой группы предметов:
- Получите список уникальных групп из полученного списка предметов. Добавьте к нему элемент
- Создайте экземпляр виджета кнопки как дочерний объект контейнера.
- Присвойте полученный компонент
VirtualItemGroupButton
переменнойgroupButton
. - В элемент с названием группы предметов передайте значение переменной
groupName
. - На событие нажатия кнопки добавьте анонимный метод. В нем вызовите метод
OnGroupSelected
и передайте в качестве параметров название группы предметов и список предметов.
- Для отображения всех предметов вызовите метод
OnGroupSelected
и передайтеAll
в качестве названия группы.
- Для отображения всех предметов вызовите метод
- В методе
OnGroupSelected
добавьте логику для начального отображения предметов:- Создайте переменную
itemsForDisplay
и присвойте ей все полученные предметы, если в названии группы предметов указанноAll
. Иначе — присвойте переменнойitemsForDisplay
предметы, название группы которых совпадает с переменнойgroupName
. - Очистите контейнер кнопок, удалив все дочерние объекты. Для этого вызовите вспомогательный метод
DeleteAllChildren
и передайте в него объект контейнера.
- Создайте переменную
- Добавьте логику создания виджета для каждого из полученных предметов:
- Создайте экземпляр виджета предмета как дочерний объект контейнера.
- Присвойте полученный компонент
VirtualItemWidget
переменнойwidget
.
- Передайте в виджет предмета полученные данные:
- В элемент с названием предмета передайте значение переменной
storeItem.name
. - В элемент с описанием предмета передайте значение переменной
storeItem.description
. - Для отображения цены предмета реализуйте следующую логику:
- В элемент с названием предмета передайте значение переменной
- Если значение переменной
storeItem.price
не равноnull
, значит, этот предмет продается за реальную валюту. Сформируйте цену в формате{amount} {currency}
и передайте ее в элемент виджета. - Если значение переменной
storeItem.virtual_prices
не равноnull
, значит, этот предмет продается за виртуальную валюту. Сформируйте цену в формате{name}: {amount}
и передайте ее в элемент виджета.
- Если значение переменной
storeItem.virtual_prices
представляет собой массив цен предмета в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках предмета в разделе Магазин > Виртуальные предметы Личного кабинета.- Для отображения изображения предмета, используйте утилитарный метод
ImageLoader.Instance.GetImageAsync
и передайте в него:- URL изображения;
- анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения пакета.
- Для отображения изображения предмета, используйте утилитарный метод
- C#
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}");
}
}
}
Пример скрипта контроллера страницы:
Реализация отображения бандлов
Создание виджета бандла
- Создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели
Hierarchy на панельProject . - Выберите созданный префаб и в панели
Inspector нажмитеOpen Prefab . - Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение виджета;
- название бандла;
- описание бандла;
- стоимость бандла;
- описание содержимого бандла (предметы и их количество);
- изображение бандла.
На рисунке ниже приведен пример структуры виджета.
Создание скрипта виджета
- Создайте скрипт
BundleWidget
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса виджета бандла и присвойте им значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Создание страницы для отображения списка бандлов
- На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение страницы;
- область отображения виджетов бандлов.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
BundlesPage
, наследуемый от стандартного классаMonoBehaviour
. - Объявите переменные:
WidgetsContainer
— контейнер для виджетов;WidgetPrefab
— префаб виджета бандла.
- Добавьте скрипт к игровому объекту страницы:
- Выберите объект в панели
Hierarchy . - В панели
Inspector нажмитеAdd Component и выберите скриптBundlesPage
.
- Выберите объект в панели
- Присвойте переменным значения в панели
Inspector . - Добавьте логику для авторизации. Для этого в методе
Start
вызовите метод SDKXsollaAuth.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка бандлов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaCatalog.Instance.GetBundles
и передайте в него:- ID проекта в параметре
projectId
;
- ID проекта в параметре
- метод
OnItemsRequestSuccess
для обработки успешного получения списка бандлов; - метод
OnError
для обработки ошибки.
- метод
- В методе
OnBundlesRequestSuccess
добавьте логику создания виджета для каждого из полученных бандлов:- Создайте экземпляр виджета бандла как дочерний объект контейнера.
- Присвойте полученный компонент
BundleWidget
переменнойwidget
.
- Передайте в виджет бандла полученные данные:
- В элемент с названием бандла передайте значение переменной
bundleItem.name
. - В элемент с описанием бандла передайте значение переменной
bundleItem.description
. - Сформируйте описание содержимого бандла:
- Из каждого предмета, входящего в бандл, сформируйте строку, содержащую название предмета и его количество в формате
{name} x {quantity}
. - Объедините эти строки в одну, используя символ переноса строки в качестве разделителя.
- Передайте получившуюся строку в элемент виджета.
- Из каждого предмета, входящего в бандл, сформируйте строку, содержащую название предмета и его количество в формате
- В элемент с названием бандла передайте значение переменной
- Для отображения цены бандла реализуйте следующую логику:
- Если значение переменной
bundleItem.price
не равноnull
, значит, этот бандл продается за реальную валюту. Сформируйте цену в формате{amount} {currency}
и передайте ее в элемент виджета. - Если значение переменной
bundleItem.virtual_prices
не равноnull
, значит, этот бандл продается за виртуальную валюту. Сформируйте цену в формате{name}: {amount}
и передайте ее в элемент виджета.
- Если значение переменной
- Для отображения цены бандла реализуйте следующую логику:
bundleItem.virtual_prices
представляет собой массив цен бандла в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках бандла в разделе Магазин > Бандлы Личного кабинета.- Для отображения изображения предмета, используйте утилитарный метод
ImageLoader.Instance.GetImageAsync
и передайте в него:- URL изображения;
- анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения бандла.
- Для отображения изображения предмета, используйте утилитарный метод
Пример скрипта контроллера страницы:
- C#
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}");
}
}
}
На рисунке ниже приведен результат работы скрипта.
Реализация отображения пакетов виртуальной валюты
Создание виджета пакета виртуальной валюты
- Создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели
Hierarchy на панельProject . - Выберите созданный префаб и в панели
Inspector нажмитеOpen Prefab . - Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение виджета;
- название пакета;
- описание пакета;
- стоимость пакета;
- изображение пакета.
На рисунке ниже приведен пример структуры виджета.
Создание скрипта виджета
- Создайте скрипт
VirtualCurrencyPackageWidget
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса виджета бандла и присвойте им значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Создание страницы для отображения списка пакетов виртуальной валюты
- На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение страницы;
- область отображения виджетов пакетов виртуальной валюты.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
VirtualCurrencyPackagesPage
, наследуемый от стандартного классаMonoBehaviour
. - Объявите переменные:
WidgetsContainer
— контейнер для виджетов;WidgetPrefab
— префаб виджета пакета.
- Добавьте скрипт к игровому объекту страницы:
- Выберите объект в панели
Hierarchy . - В панели
Inspector нажмитеAdd Component и выберите скриптVirtualCurrencyPackagesPage
.
- Выберите объект в панели
- Присвойте переменным значения в панели
Inspector . - Добавьте логику для авторизации. Для этого в методе
Start
вызовите метод SDKXsollaAuth.Instance.SignIn
и передайте в него:
- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка предметов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaCatalog.Instance.GetVirtualCurrencyPackagesList
и передайте в него:- ID проекта в параметре
projectId
;
- ID проекта в параметре
- метод
OnItemsRequestSuccess
для обработки успешного получения списка пакетов; - метод
OnError
для обработки ошибки.
- метод
- В методе
OnPackagesRequestSuccess
добавьте логику создания виджета для каждого из полученных пакетов:- Создайте экземпляр виджета пакета как дочерний объект контейнера.
- Присвойте полученный компонент
VirtualCurrencyPackageWidget
переменнойwidget
.
- Передайте в виджет пакета полученные данные:
- В элемент с названием пакета передайте значение переменной
packageItem.name
. - В элемент с описанием пакета передайте значение переменной
packageItem.description
. - Для отображения цены пакета реализуйте следующую логику:
- В элемент с названием пакета передайте значение переменной
- Если значение переменной
packageItem.price
не равноnull
, значит, этот предмет продается за реальную валюту. Сформируйте цену в формате{amount} {currency}
и передайте ее в элемент виджета. - Если значение переменной
packageItem.virtual_prices
не равноnull
, значит, этот предмет продается за виртуальную валюту. Сформируйте цену в формате{name}: {amount}
и передайте ее в элемент виджета.
- Если значение переменной
packageItem.virtual_prices
представляет собой массив цен пакета в разных валютах. В примере реализовано отображение цены, указанной по умолчанию в настройках пакета в разделе Магазин > Виртуальная валюта > Пакеты Личного кабинета.- Для отображения изображения предмета, используйте утилитарный метод
ImageLoader.Instance.GetImageAsync
и передайте в него:- URL изображения;
- анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения пакета.
- Для отображения изображения предмета, используйте утилитарный метод
Пример скрипта контроллера страницы:
- C#
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, чтобы реализовать покупку товаров за реальную валюту.
Перед началом работы реализуйте отображение виртуальных предметов в каталоге. В примере описана реализация покупки виртуальных предметов. Настройка покупки других типов товаров выполняется аналогично.
В обучающей инструкции описана реализация следующей логики:
Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примере. Возможный вариант реализации отображения каталога и покупки товаров за виртуальную валюту приведен в демо.
Доработка виджета предмета
Добавьте в виджет предмета кнопку для покупки и настройте ее внешний вид.
На рисунке ниже приведен пример структуры виджета.
Доработка скрипта виджета предмета
- Откройте скрипт
VirtualItemWidget
. - Объявите переменную кнопки для покупки предмета и присвойте ей значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Доработка контроллера страницы для отображения списка предметов
- Откройте скрипт
VirtualItemsPage
. - В методе
OnAuthenticationSuccess
передайте в переменнуюToken.Instance
токен авторизации.
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaAuth.Instance.SignIn
. - JWT, полученный в серверной части вашего приложения по custom ID (ID пользователя, сформированный на вашем сервере). Используйте этот токен, если вы реализовали собственную систему авторизации.
- Добавьте логику обработки нажатия кнопки для покупки виртуального предмета:
- В методе
OnItemsRequestSuccess
подпишитесь на событие нажатия кнопки для покупки виртуального предмета. - Добавьте анонимный метод, который будет вызываться после нажатия кнопки.
- В анонимном методе вызовите метод SDK
XsollaCatalog.Instance.PurchaseItem
для формирования заказа и передайте в него:
- В методе
- ID проекта в параметре
projectId
; - идентификатор предмета в параметре
itemSku
; - метод
OnOrderCreateSuccess
для обработки успешного формирования заказа на покупку предмета; - метод
OnError
для обработки ошибки.
- ID проекта в параметре
- Реализуйте открытие страницы оплаты. Для этого добавьте метод
OnOrderCreateSuccess
и вызовите в нем:- метод SDK
XsollaOrders.Instance.OpenPurchaseUi
, чтобы открыть страницу оплаты; - корутину
TrackOrderStatus
, чтобы отслеживать изменения статуса заказа.
- метод SDK
- В корутине
TrackOrderStatus
реализуйте получение данных о статусе заказа раз в секунду. Для этого используйте метод SDKXsollaOrders.Instance.CheckOrderStatus
и передайте в него:- ID проекта в параметре
projectId
; - номер заказа из данных платежа в параметре
orderId
; - анонимный метод для обработки успешного получения информации о статусе;
- анонимный метод для обработки ошибки.
- ID проекта в параметре
- В методе обработки успешного получения информации о статусе реализуйте вызов метода
OnPurchaseSuccess
при оплате заказа (статус платежаdone
илиpaid
). - В методе
OnPurchaseSuccess
реализуйте обработку успешной покупки виртуального предмета.
В примере скрипта при успешной покупке предмета вызывается стандартный метод Debug.Log. Вы можете добавить другие действия, например, отображение инвентаря.
Реализация логики для добавления купленных предметов в инвентарь не требуется, действие выполняется автоматически.
- Если для открытия страницы оплаты использовался встроенный браузер, закройте его.
Пример скрипта для страницы:
- C#
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, чтобы реализовать покупку товаров за виртуальную валюту.
Перед началом работы реализуйте отображение виртуальных предметов в каталоге. В примере описана реализация покупки виртуальных предметов. Настройка покупки других типов товаров выполняется аналогично.
В обучающей инструкции описана реализация следующей логики:
Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примере. Возможный вариант реализации отображения каталога и покупки товаров за виртуальную валюту приведен в демо.
Доработка виджета предмета
Добавьте в виджет предмета кнопку для покупки и настройте ее внешний вид.
На рисунке ниже приведен пример структуры виджета.
Доработка скрипта виджета предмета
- Откройте скрипт
VirtualItemWidget
. - Объявите переменную кнопки для покупки предмета и присвойте ей значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Доработка контроллера страницы для отображения списка предметов
- Откройте скрипт
VirtualItemsPage
. - В методе
OnAuthenticationSuccess
передайте в переменнуюToken.Instance
токен авторизации.
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaAuth.Instance.SignIn
. - JWT, полученный в серверной части вашего приложения по custom ID (ID пользователя, сформированный на вашем сервере). Используйте этот токен, если вы реализовали собственную систему авторизации.
- Добавьте логику обработки нажатия кнопки для покупки виртуального предмета:
- В методе
OnItemsRequestSuccess
подпишитесь на событие нажатия кнопки для покупки виртуального предмета. - Добавьте анонимный метод, который будет вызываться после нажатия кнопки.
- В анонимном методе вызовите метод SDK
XsollaCatalog.Instance.PurchaseItem
для формирования заказа и передайте в него:
- В методе
- ID проекта в параметре
projectId
; - идентификатор предмета в параметре
itemSku
; - метод
OnOrderCreateSuccess
для обработки успешного формирования заказа на покупку предмета; - метод
OnError
для обработки ошибки.
- ID проекта в параметре
- В методе
OnOrderCreateSuccess
реализуйте проверку статуса заказа. Для этого используйте метод SDKXsollaOrders.Instance.CheckOrderStatus
и передайте в него:- ID проекта в параметре
projectId
; - номер заказа из данных платежа в параметре
orderId
; - анонимный метод для обработки успешного получения информации о статусе;
- анонимный метод для обработки ошибки.
- ID проекта в параметре
- В методе обработки успешного получения информации о статусе реализуйте вызов метода
OnPurchaseSuccess
при оплате заказа (статус платежаdone
илиpaid
). - В методе
OnPurchaseSuccess
реализуйте обработку успешной покупки виртуального предмета.
В примере скрипта при успешной покупке предмета вызывается стандартный метод Debug.Log. Вы можете добавить другие действия, например, отображение инвентаря и изменение баланса виртуальной валюты.
Реализация логики для добавления купленных предметов в инвентарь не требуется, действие выполняется автоматически.
Пример скрипта для страницы:
- C#
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 реализовать в приложении отображение баланса виртуальной валюты.
Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации каталога товаров во внутриигровом магазине приведен в демо.
Создание виджета для отображения баланса
- Создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели
Hierarchy на панельProject . - Выберите созданный префаб и в панели
Inspector нажмитеOpen Prefab . - Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение виджета;
- название виртуальной валюты;
- количество виртуальной валюты;
- изображение виртуальной валюты.
На рисунке ниже приведен пример структуры виджета.
Создание скрипта виджета для отображения баланса
- Создайте скрипт
VirtualCurrencyWidget
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса виджета бандла и присвойте им значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Создание страницы со списком виртуальных валют
- На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение страницы;
- область отображения виджетов.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы со списком виртуальных валют
- Создайте скрипт
VirtualCurrenciesPage
, наследуемый от стандартного классаMonoBehaviour
. - Объявите переменные:
WidgetsContainer
— контейнер для виджетов;WidgetPrefab
— префаб виджета для просмотра баланса.
- Добавьте скрипт к игровому объекту страницы:
- Выберите объект в панели
Hierarchy . - В панели
Inspector нажмитеAdd Component и выберите скриптVirtualCurrenciesPage
.
- Выберите объект в панели
- Присвойте переменным значения в панели
Inspector . - Добавьте логику для авторизации. Для этого в методе
Start
вызовите метод SDKXsollaAuth.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка виртуальных валют. Для этого в методе
OnAuthenticationSuccess
:- Передайте в переменную
Token.Instance
токен авторизации.
- Передайте в переменную
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaAuth.Instance.SignIn
. - JWT, полученный в серверной части вашего приложения по custom ID (ID пользователя, сформированный на вашем сервере). Используйте этот токен, если вы реализовали собственную систему авторизации.
- Вызовите метод SDK
XsollaInventory.Instance.GetVirtualCurrencyBalance
и передайте в него:- ID проекта в параметре
projectId
;
- ID проекта в параметре
- Вызовите метод SDK
- метод
OnBalanceRequestSuccess
для обработки успешного получения списка виртуальных валют; - метод
OnError
для обработки ошибки.
- метод
- Для каждой из полученных виртуальных валют в методе
OnBalanceRequestSuccess
добавьте логику создания виджета для отображения баланса:- Создайте экземпляр виджета как дочерний объект контейнера.
- Присвойте полученный компонент
VirtualCurrencyWidget
переменнойwidget
.
- Передайте в виджет для отображения баланса полученные данные:
- В элемент с названием виртуальной валюты передайте значение переменной
balanceItem.name
. - В элемент с количеством виртуальной валюты передайте значение переменной
balanceItem.amount.ToString()
. - Для показа изображения виртуальной валюты используйте утилитарный метод
ImageLoader.Instance.GetImageAsync
и передайте в него:- URL изображения;
- анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения виртуальной валюты.
- В элемент с названием виртуальной валюты передайте значение переменной
Пример скрипта контроллера страницы:
- C#
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 реализовать отображение предметов в инвентаре пользователя.
Для своего приложения вам потребуется создать интерфейс и логику сложнее, чем в примерах. Возможный вариант реализации инвентаря приведен в демо.
Создание виджета предмета
- Создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Преобразуйте созданный игровой объект в префаб. Для этого перетащите игровой объект из панели
Hierarchy на панельProject . - Выберите созданный префаб и в панели
Inspector нажмитеOpen Prefab . - Добавьте в качестве дочерних объектов префаба следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение виджета;
- название предмета;
- описание предмета;
- количество предметов;
- изображение предмета.
На рисунке ниже приведен пример структуры виджета.
Создание скрипта виджета предмета
- Создайте скрипт
InventoryItemWidget
, наследуемый от стандартного класса MonoBehaviour. - Объявите переменные для элементов интерфейса виджета предмета и присвойте им значения в панели
Inspector .
Пример скрипта виджета:
- C#
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;
}
}
Создание страницы для отображения инвентаря
- На сцене создайте пустой игровой объект. Для этого в главном меню выберите пункт
GameObject > Create Empty . - Добавьте в качестве дочерних объектов следующие элементы интерфейса и настройте их внешний вид:
- фоновое изображение страницы;
- область отображения виджетов предметов.
На рисунке ниже приведен пример структуры страницы.
Создание контроллера страницы
- Создайте скрипт
InventoryItemsPage
, наследуемый от стандартного классаMonoBehaviour
. - Объявите переменные:
WidgetsContainer
— контейнер для виджетов предметов;WidgetPrefab
— префаб виджета предмета.
- Добавьте скрипт к игровому объекту страницы:
- Выберите объект в панели
Hierarchy . - В панели
Inspector нажмитеAdd Component и выберите скриптInventoryItemsPage
.
- Выберите объект в панели
- Присвойте переменным значения в панели
Inspector . - Добавьте логику для авторизации. Для этого в методе
Start
вызовите метод SDKXsollaAuth.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения предметов инвентаря. Для этого в методе
OnAuthenticationSuccess
:- Передайте в переменную
Token.Instance
токен авторизации.
- Передайте в переменную
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaAuth.Instance.SignIn
. - JWT, полученный в серверной части вашего приложения по custom ID (ID пользователя, сформированный на вашем сервере). Используйте этот токен, если вы реализовали собственную систему авторизации.
- Вызовите метод SDK
XsollaInventory.Instance.GetInventoryItems
и передайте в него:- ID проекта в параметре
projectId
;
- ID проекта в параметре
- Вызовите метод SDK
- метод
OnItemsRequestSuccess
для обработки успешного получения списка пакетов; - метод
OnError
для обработки ошибки.
- метод
- Для каждого из полученных предметов в методе
OnItemsRequestSuccess
добавьте логику создания виджета:- С помощью метода
InventoryItem.IsVirtualCurrency
добавьте проверку, что полученный предмет не является виртуальной валютой.
- С помощью метода
- Создайте экземпляр виджета как дочерний объект контейнера.
- Присвойте полученный компонент
InventoryItemWidget
переменнойwidget
.
- Передайте в виджет предмета полученные данные:
- В элемент с названием предмета передайте значение переменной
inventoryItem.name
. - В элемент с описанием предмета передайте значение переменной
inventoryItem.description
. - В элемент с количеством предметов передайте значение переменной
inventoryItem.amount.ToString()
. - Для показа изображения предмета используйте утилитарный метод
ImageLoader.Instance.GetImageAsync
и передайте в него:- URL изображения;
- анонимную функцию для обратного вызова, в которой установите полученный спрайт в качестве изображения предмета.
- В элемент с названием предмета передайте значение переменной
Пример скрипта контроллера страницы:
- C#
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}");
}
}
}
На рисунке ниже приведен результат работы скрипта.
Полезные ссылки
Нашли опечатку или ошибку в тексте? Выделите ее и нажмите Ctrl+Enter.