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

SDK enterprise-уровня для Unity

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример скрипта для страницы регистрации:
Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;
using Xsolla.Auth;
using Xsolla.Core;

namespace Xsolla.Samples.Authorization
{
	public class RegistrationPage : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public InputField UsernameInput;
		public InputField EmailInputField;
		public InputField PasswordInputField;
		public Button RegisterButton;

		private void Start()
		{
			// Handling the button click
			RegisterButton.onClick.AddListener(() =>
			{
				// Get the username, email and password from input fields
				var username = UsernameInput.text;
				var email = EmailInputField.text;
				var password = PasswordInputField.text;

				// Call the user registration method
				// Pass credentials and callback functions for success and error cases
				XsollaAuth.Register(username, password, email, OnSuccess, OnError);
			});
		}

		private void OnSuccess(LoginLink loginLink)
		{
			Debug.Log("Registration successful");
			// Add actions taken in case of success
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Registration failed. Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;
using Xsolla.Auth;
using Xsolla.Core;

namespace Xsolla.Samples.Authorization
{
	public class ResendConfirmationEmailPage : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public InputField UsernameInput;
		public Button ResendEmailButton;

		private void Start()
		{
			// Handling the button click
			ResendEmailButton.onClick.AddListener(() =>
			{
				// Get the username from the input field
				var username = UsernameInput.text;

				// Call the resend confirmation email method
				// Pass the username and callback functions for success and error cases
				XsollaAuth.ResendConfirmationLink(username, OnSuccess, OnError);
			});
		}

		private void OnSuccess()
		{
			Debug.Log("Resend confirmation email successful");
			// Add actions taken in case of success
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Resend confirmation email failed. Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;
using Xsolla.Auth;
using Xsolla.Core;

namespace Xsolla.Samples.Authorization
{
	public class AuthorizationPage : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public InputField UsernameInput;
		public InputField PasswordInputField;
		public Button SignInButton;

		private void Start()
		{
			// Handling the button click
			SignInButton.onClick.AddListener(() =>
			{
				// Get the username and password from input fields
				var username = UsernameInput.text;
				var password = PasswordInputField.text;

				// Call the user authorization method
				// Pass credentials and callback functions for success and error cases
				XsollaAuth.SignIn(username, password, OnSuccess, OnError);
			});
		}

		private void OnSuccess()
		{
			Debug.Log("Authorization successful");
			// Add actions taken in case of success
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Authorization failed. Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;
using Xsolla.Auth;
using Xsolla.Core;

namespace Xsolla.Samples.Authorization
{
	public class ResetPasswordPage : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public InputField UsernameInput;
		public Button ResetPasswordButton;

		private void Start()
		{
			// Handling the button click
			ResetPasswordButton.onClick.AddListener(() =>
			{
				// Get the username from the input field
				var username = UsernameInput.text;

				// Call the password reset method
				// Pass the username and callback functions for success and error cases
				XsollaAuth.ResetPassword(username, OnSuccess, OnError);
			});
		}

		private void OnSuccess()
		{
			Debug.Log("Password reset successful");
			// Add actions taken in case of success
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Password reset failed. Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

При возникновении ошибки код и описание ошибки передаются в параметре error.

Пример скрипта для страницы авторизации:
Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;
using Xsolla.Auth;
using Xsolla.Core;

namespace Xsolla.Samples.Authorization
{
	public class SocialAuthorizationPage : MonoBehaviour
	{
		// Declaration of variables for SocialProvider and signIn button
		public SocialProvider SocialProvider = SocialProvider.Facebook;
		public Button SignInButton;

		private void Start()
		{
			// Handling the button click
			SignInButton.onClick.AddListener(() =>
			{
				// Call the social authorization method
				// Pass the social network provider and callback functions for success, error and cancel cases
				XsollaAuth.AuthViaSocialNetwork(SocialProvider, OnSuccess, OnError, OnCancel);
			});
		}

		private void OnSuccess()
		{
			Debug.Log("Social authorization successful");
			// Add actions taken in case of success
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Social authorization failed. Error: {error.errorMessage}");
			// Add actions taken in case of error
		}

		private void OnCancel()
		{
			Debug.Log("Social authorization cancelled by user.");
			// Add actions taken in case the user canceles authorization
		}
	}
}

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.DisplayCatalog
{
	public class VirtualItemWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text DescriptionText;
		public Text PriceText;
		public Image IconImage;
	}
}

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

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

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

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

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

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

  1. Добавьте логику для авторизации и получения списка предметов, как указано в примере скрипта.
Примечание

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

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

Пример скрипта контроллера страницы:
Copy
Full screen
Small screen
using System.Linq;
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Catalog;
using Xsolla.Core;

namespace Xsolla.Samples.DisplayCatalog
{
	public class VirtualItemsPage : MonoBehaviour
	{
		// Declaration of variables for widget's container and prefab
		public Transform WidgetsContainer;
		public GameObject WidgetPrefab;

		private void Start()
		{
			// Starting the authentication process
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// Starting the items request from the store after successful authentication
			XsollaCatalog.GetCatalog(OnItemsRequestSuccess, OnError);
		}

		private void OnItemsRequestSuccess(StoreItems storeItems)
		{
			// Iterating the items collection
			foreach (var storeItem in storeItems.items)
			{
				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
				var widget = widgetGo.GetComponent<VirtualItemWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = storeItem.name;
				widget.DescriptionText.text = storeItem.description;

				// The item can be purchased for real money or virtual currency
				// Checking the price type and assigning the values for appropriate UI elements
				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}";
				}

				// Loading the item image and assigning it to the UI element
				ImageLoader.LoadSprite(storeItem.image_url, sprite => widget.IconImage.sprite = sprite);
			}
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.DisplayCatalog
{
	public class VirtualItemWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text DescriptionText;
		public Text PriceText;
		public Image IconImage;
	}
}

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.DisplayCatalog
{
	public class VirtualItemGroupButton : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Button Button;
	}
}

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

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

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

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

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

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

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

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

Пример скрипта контроллера страницы:
Copy
Full screen
Small screen
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Catalog;
using Xsolla.Core;

namespace Xsolla.Samples.DisplayCatalog
{
	public class VirtualItemsByGroupsPage : MonoBehaviour
	{
		// Declaration of variables for widget's container and prefab
		public Transform GroupButtonsContainer;
		public GameObject GroupButtonPrefab;
		public Transform ItemWidgetsContainer;
		public GameObject ItemWidgetPrefab;

		private void Start()
		{
			// Starting the authentication process
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// Starting the items request from the store after successful authentication
			// Pass the callback functions for success and error cases
			XsollaCatalog.GetCatalog(OnItemsRequestSuccess, OnError);
		}

		private void OnItemsRequestSuccess(StoreItems storeItems)
		{
			// Selecting the group’s name from items and order them alphabetically
			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 catalog category with all items regardless of group affiliation
			groupNames.Insert(0, "All");

			// Iterating the group names collection
			foreach (var groupName in groupNames)
			{
				// Instantiating the button prefab as child of the container
				var buttonGo = Instantiate(GroupButtonPrefab, GroupButtonsContainer, false);
				var groupButton = buttonGo.GetComponent<VirtualItemGroupButton>();

				// Assigning the values for UI elements
				groupButton.NameText.text = groupName;

				// Adding listener for button click event
				groupButton.Button.onClick.AddListener(() => OnGroupSelected(groupName, storeItems));
			}

			// Calling method for redraw page
			OnGroupSelected("All", storeItems);
		}

		private void OnGroupSelected(string groupName, StoreItems storeItems)
		{
			// Clear container
			DeleteAllChildren(ItemWidgetsContainer);

			// Declaring variable for items to be displayed on the page
			IEnumerable<StoreItem> itemsForDisplay;
			if (groupName == "All")
			{
				itemsForDisplay = storeItems.items;
			}
			else
			{
				itemsForDisplay = storeItems.items.Where(item => item.groups.Any(group => group.name == groupName));
			}

			// Iterating the items collection and assigning values for appropriate UI elements
			foreach (var storeItem in itemsForDisplay)
			{
				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(ItemWidgetPrefab, ItemWidgetsContainer, false);
				var widget = widgetGo.GetComponent<VirtualItemWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = storeItem.name;
				widget.DescriptionText.text = storeItem.description;

				// The item can be purchased for real money or virtual currency
				// Checking the price type and assigning the appropriate value for price text
				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}";
				}

				// Loading the image for item icon and assigning it to the UI element
				ImageLoader.LoadSprite(storeItem.image_url, sprite => widget.IconImage.sprite = sprite);
			}
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			//  Add actions taken in case of error
		}

		// Utility method to delete all children of a container
		private static void DeleteAllChildren(Transform parent)
		{
			var childList = parent.Cast<Transform>().ToList();
			foreach (var childTransform in childList)
			{
				Destroy(childTransform.gameObject);
			}
		}
	}
}

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.DisplayCatalog
{
	public class BundleWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text DescriptionText;
		public Text PriceText;
		public Text ContentText;
		public Image IconImage;
	}
}

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

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

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

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

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

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

  1. Присвойте переменным значения в панели Inspector.
  2. Добавьте логику для авторизации и получения списка бандлов, как указано в примере скрипта.
Примечание

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

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

Пример скрипта контроллера страницы:
Copy
Full screen
Small screen
using System.Linq;
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Catalog;
using Xsolla.Core;

namespace Xsolla.Samples.DisplayCatalog
{
	public class BundlesPage : MonoBehaviour
	{
		// Declaration of variables for widget's container and prefab
		public Transform WidgetsContainer;
		public GameObject WidgetPrefab;

		private void Start()
		{
			// Starting the authentication process
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// Starting the bundle request from the store after successful authentication
			// Pass the callback functions for success and error cases
			XsollaCatalog.GetBundles(OnBundlesRequestSuccess, OnError);
		}

		private void OnBundlesRequestSuccess(BundleItems bundleItems)
		{
			// Iterating the bundles collection
			foreach (var bundleItem in bundleItems.items)
			{
				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
				var widget = widgetGo.GetComponent<BundleWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = bundleItem.name;
				widget.DescriptionText.text = bundleItem.description;

				// Creating the string with bundle content and assigning it to the UI element
				var bundleContent = bundleItem.content.Select(x => $"{x.name} x {x.quantity}");
				widget.ContentText.text = string.Join("\n", bundleContent);

				// The bundle can be purchased for real money or virtual currency
				// Checking the price type and assigning the values for appropriate UI elements
				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}";
				}

				// Loading the bundle image and assigning it to the UI element
				ImageLoader.LoadSprite(bundleItem.image_url, sprite => widget.IconImage.sprite = sprite);
			}
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.DisplayCatalog
{
	public class VirtualCurrencyPackageWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text DescriptionText;
		public Text PriceText;
		public Image IconImage;
	}
}

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

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

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

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

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

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

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

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

Пример скрипта контроллера страницы:
Copy
Full screen
Small screen
using System.Linq;
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Catalog;
using Xsolla.Core;

namespace Xsolla.Samples.DisplayCatalog
{
	public class VirtualCurrencyPackagesPage : MonoBehaviour
	{
		// Declaration of variables for widget's container and prefab
		public Transform WidgetsContainer;
		public GameObject WidgetPrefab;

		private void Start()
		{
			// Starting the authentication process
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// After successful authentication starting the request for packages from store
			// Pass the callback functions for success and error cases
			XsollaCatalog.GetVirtualCurrencyPackagesList(OnPackagesRequestSuccess, OnError);
		}

		private void OnPackagesRequestSuccess(VirtualCurrencyPackages packageItems)
		{
			// Iterating the virtual currency packages collection
			foreach (var packageItem in packageItems.items)
			{
				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
				var widget = widgetGo.GetComponent<VirtualCurrencyPackageWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = packageItem.name;
				widget.DescriptionText.text = packageItem.description;

				// The package can be purchased for real money or virtual currency
				// Checking the price type and assigning the values for appropriate UI elements
				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}";
				}

				// Loading the package image and assigning it to the UI element
				ImageLoader.LoadSprite(packageItem.image_url, sprite => widget.IconImage.sprite = sprite);
			}
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.SellForRealMoney
{
	public class VirtualItemWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text DescriptionText;
		public Text PriceText;
		public Image IconImage;
		public Button BuyButton;
	}
}

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

  1. Откройте скрипт VirtualItemsPage.
  2. Добавьте логику обработки нажатия кнопки для покупки виртуального предмета, как указано в примере скрипта.
Примечание

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

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

Пример скрипта для страницы:
Copy
Full screen
Small screen
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Catalog;
using Xsolla.Core;

namespace Xsolla.Samples.SellForRealMoney
{
	public class VirtualItemsPage : MonoBehaviour
	{
		// Declaration of variables for widget's container and prefab
		public Transform WidgetsContainer;
		public GameObject WidgetPrefab;

		private void Start()
		{
			// Starting the authentication process
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// Starting the items request from the store after successful authentication
			// Pass the callback functions for success and error cases
			XsollaCatalog.GetCatalog(OnItemsRequestSuccess, OnError);
		}

		private void OnItemsRequestSuccess(StoreItems storeItems)
		{
			// Iterating the items collection
			foreach (var storeItem in storeItems.items)
			{
				// Skipping items without prices in real money
				if (storeItem.price == null)
					continue;

				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
				var widget = widgetGo.GetComponent<VirtualItemWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = storeItem.name;
				widget.DescriptionText.text = storeItem.description;

				// Assigning the price and currency values for UI elements
				var price = storeItem.price;
				widget.PriceText.text = $"{price.amount} {price.currency}";

				// Loading the item image and assigning it to the UI element
				ImageLoader.LoadSprite(storeItem.image_url, sprite => widget.IconImage.sprite = sprite);

				// Assigning the click listener for the buy button
				widget.BuyButton.onClick.AddListener(() =>
				{
					// Starting the purchase process
					// Pass the item SKU and callback functions for success and error cases
					XsollaCatalog.Purchase(storeItem.sku, OnPurchaseSuccess, OnError);
				});
			}
		}

		private void OnPurchaseSuccess(OrderStatus status)
		{
			Debug.Log("Purchase successful");
			// Add actions taken in case of success
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.SellForVirtualCurrency
{
	public class VirtualItemWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text DescriptionText;
		public Text PriceText;
		public Image IconImage;
		public Button BuyButton;
	}
}

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

  1. Откройте скрипт VirtualItemsPage.
  2. Добавьте логику обработки нажатия кнопки для покупки виртуального предмета, как указано в примере скрипта.
Примечание

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

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

Пример скрипта для страницы:
Copy
Full screen
Small screen
using System.Linq;
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Catalog;
using Xsolla.Core;

namespace Xsolla.Samples.SellForVirtualCurrency
{
	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
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// After successful authentication starting the request for catalog from store
			// Pass the callback functions for success and error cases
			XsollaCatalog.GetCatalog(OnItemsRequestSuccess, OnError);
		}

		private void OnItemsRequestSuccess(StoreItems storeItems)
		{
			// Iterating the items collection
			foreach (var storeItem in storeItems.items)
			{
				// Skipping items without prices in virtual currency
				if (storeItem.virtual_prices.Length == 0)
					continue;

				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
				var widget = widgetGo.GetComponent<VirtualItemWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = storeItem.name;
				widget.DescriptionText.text = storeItem.description;

				// Assigning the price and currency values for UI elements
				// The first price is used for the sake of simplicity
				var price = storeItem.virtual_prices.First(x => x.is_default);
				widget.PriceText.text = $"{price.name}: {price.amount}";

				// Loading the item image and assigning it to the UI element
				ImageLoader.LoadSprite(storeItem.image_url, sprite => widget.IconImage.sprite = sprite);

				// Assigning the click listener for the buy button
				widget.BuyButton.onClick.AddListener(() =>
				{
					// Starting the purchase process
					// Pass the item SKU, the price virtual currency SKU and callback functions for success and error cases
					XsollaCatalog.PurchaseForVirtualCurrency(storeItem.sku, price.sku, OnPurchaseSuccess, OnError);
				});
			}
		}

		private void OnPurchaseSuccess(OrderStatus status)
		{
			Debug.Log("Purchase successful");
			// Add actions taken in case of success
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.DisplayVirtualCurrencyBalance
{
	public class VirtualCurrencyWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text AmountText;
		public Image IconImage;
	}
}

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

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

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

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

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

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

  1. Присвойте переменным значения в панели Inspector.
  2. Добавьте логику для авторизации и получения списка виртуальных валют, как указано в примере скрипта.
Примечание
В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).
Пример скрипта контроллера страницы:
Copy
Full screen
Small screen
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Core;
using Xsolla.Inventory;

namespace Xsolla.Samples.DisplayVirtualCurrencyBalance
{
	public class VirtualCurrenciesPage : MonoBehaviour
	{
		// Declaration of variables for widget's container and prefab
		public Transform WidgetsContainer;
		public GameObject WidgetPrefab;

		private void Start()
		{
			// Starting the authentication process
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// Starting the virtual currencies request from the store after successful authentication
			// Pass the callback functions for success and error cases
			XsollaInventory.GetVirtualCurrencyBalance(OnBalanceRequestSuccess, OnError);
		}

		private void OnBalanceRequestSuccess(VirtualCurrencyBalances balance)
		{
			// Iterating the virtual currency balances collection
			foreach (var balanceItem in balance.items)
			{
				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
				var widget = widgetGo.GetComponent<VirtualCurrencyWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = balanceItem.name;
				widget.AmountText.text = balanceItem.amount.ToString();

				ImageLoader.LoadSprite(balanceItem.image_url, sprite => widget.IconImage.sprite = sprite);
			}
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

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

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

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

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

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

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

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

Copy
Full screen
Small screen
using UnityEngine;
using UnityEngine.UI;

namespace Xsolla.Samples.DisplayItemsInInventory
{
	public class InventoryItemWidget : MonoBehaviour
	{
		// Declaration of variables for UI elements
		public Text NameText;
		public Text DescriptionText;
		public Text QuantityText;
		public Image IconImage;
	}
}

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

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

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

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

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

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

  1. Присвойте переменным значения в панели Inspector.
  2. Добавьте логику для авторизации и получения предметов инвентаря, как указано в примере скрипта.
Примечание
В примере скрипта для авторизации используются данные демонстрационной учетной записи (имя пользователя: xsolla, пароль: xsolla).
Пример скрипта контроллера страницы:
Copy
Full screen
Small screen
using UnityEngine;
using Xsolla.Auth;
using Xsolla.Core;
using Xsolla.Inventory;

namespace Xsolla.Samples.DisplayItemsInInventory
{
	public class InventoryItemsPage : MonoBehaviour
	{
		// Declaration of variables for widget's container and prefab
		public Transform WidgetsContainer;
		public GameObject WidgetPrefab;

		private void Start()
		{
			// Starting the authentication process
			// Pass the credentials and callback functions for success and error cases
			// The credentials (username and password) are hard-coded for simplicity
			XsollaAuth.SignIn("xsolla", "xsolla", OnAuthenticationSuccess, OnError);
		}

		private void OnAuthenticationSuccess()
		{
			// Starting the items request from the store after successful authentication
			// Pass the callback functions for success and error cases
			XsollaInventory.GetInventoryItems(OnItemsRequestSuccess, OnError);
		}

		private void OnItemsRequestSuccess(InventoryItems inventoryItems)
		{
			// Iterating the items collection
			foreach (var inventoryItem in inventoryItems.items)
			{
				// Skipping virtual currency items
				if (inventoryItem.VirtualItemType == VirtualItemType.VirtualCurrency)
					continue;

				// Instantiating the widget prefab as child of the container
				var widgetGo = Instantiate(WidgetPrefab, WidgetsContainer, false);
				var widget = widgetGo.GetComponent<InventoryItemWidget>();

				// Assigning the values for UI elements
				widget.NameText.text = inventoryItem.name;
				widget.DescriptionText.text = inventoryItem.description;
				widget.QuantityText.text = inventoryItem.quantity.ToString();

				// Loading the item image and assigning it to the UI element
				ImageLoader.LoadSprite(inventoryItem.image_url, sprite => widget.IconImage.sprite = sprite);
			}
		}

		private void OnError(Error error)
		{
			Debug.LogError($"Error: {error.errorMessage}");
			// Add actions taken in case of error
		}
	}
}

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

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

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

Последнее обновление: 10 октября 2023

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

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