Управление покупками
Эта инструкция показывает, как с помощью методов 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
вызовите метод SDKXsollaLogin.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка предметов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaStore.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#
uusing System.Linq;
using UnityEngine;
using Xsolla.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.Instance.SignIn("xsolla", "xsolla", true, null, OnAuthenticationSuccess, OnError);
}
private void OnAuthenticationSuccess(string token)
{
// After successful authentication starting the request for catalog from store
XsollaStore.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
вызовите метод SDKXsollaLogin.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка предметов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaStore.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.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.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
XsollaStore.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
вызовите метод SDKXsollaLogin.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка бандлов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaStore.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.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.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
XsollaStore.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
вызовите метод SDKXsollaLogin.Instance.SignIn
и передайте в него:
- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка предметов. В методе
OnAuthenticationSuccess
вызовите метод SDKXsollaStore.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.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.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
XsollaStore.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
передайте в переменнуюXsollaStore.Instance.Token
токен авторизации.
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.SignIn
. - Pay Station access token, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.GetUserAccessToken
. Используйте этот токен, если вы реализовали собственную систему авторизации.
- Добавьте логику обработки нажатия кнопки для покупки виртуального предмета:
- В методе
OnItemsRequestSuccess
подпишитесь на событие нажатия кнопки для покупки виртуального предмета. - Добавьте анонимный метод, который будет вызываться после нажатия кнопки.
- В анонимном методе вызовите метод SDK
XsollaStore.Instance.ItemPurchase
для формирования заказа и передайте в него:
- В методе
- ID проекта в параметре
projectId
; - идентификатор предмета в параметре
itemSku
; - метод
OnOrderCreateSuccess
для обработки успешного формирования заказа на покупку предмета; - метод
OnError
для обработки ошибки.
- ID проекта в параметре
- Реализуйте открытие страницы оплаты. Для этого добавьте метод
OnOrderCreateSuccess
и вызовите в нем:- метод SDK
XsollaStore.Instance.OpenPurchaseUi
, чтобы открыть страницу оплаты; - корутину
TrackOrderStatus
, чтобы отслеживать изменения статуса заказа.
- метод SDK
- В корутине
TrackOrderStatus
реализуйте получение данных о статусе заказа раз в секунду. Для этого используйте метод SDKXsollaStore.Instance.CheckOrderStatus
и передайте в него:- ID проекта в параметре
projectId
; - номер заказа из данных платежа в параметре
orderId
; - анонимный метод для обработки успешного получения информации о статусе;
- анонимный метод для обработки ошибки.
- ID проекта в параметре
- В методе обработки успешного получения информации о статусе реализуйте вызов метода
OnPurchaseSuccess
при оплате заказа (статус платежаdone
илиpaid
). - В методе
OnPurchaseSuccess
реализуйте обработку успешной покупки виртуального предмета.
В примере скрипта при успешной покупке предмета вызывается стандартный метод Debug.Log. Вы можете добавить другие действия, например, отображение инвентаря.
Реализация логики для добавления купленных предметов в инвентарь не требуется, действие выполняется автоматически.
- Если для открытия страницы оплаты использовался встроенный браузер, закройте его.
Пример скрипта для страницы:
- C#
using System.Collections;
using System.Linq;
using UnityEngine;
using Xsolla.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.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);
XsollaStore.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(() => { XsollaStore.Instance.ItemPurchase(XsollaSettings.StoreProjectId, storeItem.sku, OnOrderCreateSuccess, OnError); });
}
}
private void OnOrderCreateSuccess(PurchaseData purchaseData)
{
XsollaStore.Instance.OpenPurchaseUi(purchaseData);
StartCoroutine(TrackOrderStatus(purchaseData));
}
private IEnumerator TrackOrderStatus(PurchaseData purchaseData)
{
var isDone = false;
while (!isDone)
{
XsollaStore.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
передайте в переменнуюXsollaStore.Instance.Token
токен авторизации.
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.SignIn
. - Pay Station access token, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.GetUserAccessToken
. Используйте этот токен, если вы реализовали собственную систему авторизации.
- Добавьте логику обработки нажатия кнопки для покупки виртуального предмета:
- В методе
OnItemsRequestSuccess
подпишитесь на событие нажатия кнопки для покупки виртуального предмета. - Добавьте анонимный метод, который будет вызываться после нажатия кнопки.
- В анонимном методе вызовите метод SDK
XsollaStore.Instance.ItemPurchase
для формирования заказа и передайте в него:
- В методе
- ID проекта в параметре
projectId
; - идентификатор предмета в параметре
itemSku
; - метод
OnOrderCreateSuccess
для обработки успешного формирования заказа на покупку предмета; - метод
OnError
для обработки ошибки.
- ID проекта в параметре
- В методе
OnOrderCreateSuccess
реализуйте проверку статуса заказа. Для этого используйте метод SDKXsollaStore.Instance.CheckOrderStatus
и передайте в него:- ID проекта в параметре
projectId
; - номер заказа из данных платежа в параметре
orderId
; - анонимный метод для обработки успешного получения информации о статусе;
- анонимный метод для обработки ошибки.
- ID проекта в параметре
- В методе обработки успешного получения информации о статусе реализуйте вызов метода
OnPurchaseSuccess
при оплате заказа (статус платежаdone
илиpaid
). - В методе
OnPurchaseSuccess
реализуйте обработку успешной покупки виртуального предмета.
В примере скрипта при успешной покупке предмета вызывается стандартный метод Debug.Log. Вы можете добавить другие действия, например, отображение инвентаря и изменение баланса виртуальной валюты.
Реализация логики для добавления купленных предметов в инвентарь не требуется, действие выполняется автоматически.
Пример скрипта для страницы:
- C#
using System.Linq;
using UnityEngine;
using Xsolla.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.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);
XsollaStore.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);
XsollaStore.Instance.ItemPurchaseForVirtualCurrency(XsollaSettings.StoreProjectId, storeItem.sku, price.sku, OnOrderCreateSuccess, OnError);
});
}
}
private void OnOrderCreateSuccess(PurchaseData purchaseData)
{
XsollaStore.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
вызовите метод SDKXsollaLogin.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения списка виртуальных валют. Для этого в методе
OnAuthenticationSuccess
:- Передайте в переменную
XsollaStore.Instance.Token
токен авторизации.
- Передайте в переменную
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.SignIn
. - Pay Station access token, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.GetUserAccessToken
. Используйте этот токен, если вы реализовали собственную систему авторизации.
- Вызовите метод SDK
XsollaStore.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.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.Instance.SignIn("xsolla", "xsolla", true, null, OnAuthenticationSuccess, OnError);
}
private void OnAuthenticationSuccess(string token)
{
// After successful authentication starting the request for virtual currencies
Token.Instance = Token.Create(token);
XsollaStore.Instance.GetVirtualCurrencyBalance(XsollaSettings.StoreProjectId, OnBalanceRequestSuccess, OnError);
}
private void OnBalanceRequestSuccess(VirtualCurrenciesBalance 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
вызовите метод SDKXsollaLogin.Instance.SignIn
и передайте в него:- имя пользователя или email-адрес в параметре
username
; - пароль пользователя в параметре
password
;
- имя пользователя или email-адрес в параметре
xsolla
, пароль: xsolla
).- флаг в параметре
rememberUser
для запоминания учетной записи; - метод
OnAuthenticationSuccess
для обработки успешной авторизации пользователя; - метод
OnError
для обработки ошибки.
- флаг в параметре
- Добавьте логику получения предметов инвентаря. Для этого в методе
OnAuthenticationSuccess
:- Передайте в переменную
XsollaStore.Instance.Token
токен авторизации.
- Передайте в переменную
- JWT, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.SignIn
. - Pay Station access token, полученный при авторизации пользователя с помощью метода SDK
XsollaLogin.Instance.GetUserAccessToken
. Используйте этот токен, если вы реализовали собственную систему авторизации.
- Вызовите метод SDK
XsollaStore.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.Core;
using Xsolla.Login;
using Xsolla.Store;
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
XsollaLogin.Instance.SignIn("xsolla", "xsolla", true, null, OnAuthenticationSuccess, OnError);
}
private void OnAuthenticationSuccess(string token)
{
// After successful authentication starting the request for virtual currencies
Token.Instance = Token.Create(token);
XsollaStore.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.