구매 관리
이 튜토리얼은 SDK 메소드를 사용하여 인게임 스토어에서 다음 아이템을 표시하는 방법을 보여줍니다.
- 가상 아이템
- 가상 아이템 그룹
- 번들
- 가상 화폐 패키지
시작하기 전에 게시자 계정의 아이템을 구성해야 합니다.
이 튜토리얼이 설명하는 논리의 구현:
예시의 로직 및 인터페이스는 귀하의 애플리케이션의 것보다 덜 복잡합니다. 가능한 인게임 스토어 아이템 카탈로그 구현 옵션은 데모 프로젝트에 서술되어 있습니다.
카탈로그의 모든 아이템 예시가 표시하는 내용:
- 아이템 이름
- 아이템 설명
- 아이템 가격
- 이미지
이 정보가 인게임 스토어에 정보가 저장되어 있다면 아이템에 관한 다른 정보도 표시할 수 있습니다.
가상 아이템 표시 구현
아이템 위젯 생성
- 비어 있는 게임 개체를 생성합니다. 이 작업을 수행하려면 메인 메뉴로 이동하여
GameObject > Create Empty 를 선택합니다. - 게임 개체를
Hierarchy 패널에서Project 패널로 끌어서 프리패브의 생성한 게임 개체를 변환합니다. - 생성한 프리패브를 선택하고
Inspector 패널에서Open Prefab 를 클릭합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 아이템 배경 이미지
- 아이템 이름
- 아이템 설명
- 아이템 가격
- 아이템 이미지
다음 그림은 위젯 구조의 예시를 보여줍니다.
아이템 위젯 스크립트 생성
- MonoBehaviour 기본 클래스에서 상속된
VirtualItemWidget
스크립트를 생성합니다. - 아이템 위젯 인터페이스 요소에 대한 변수를 선언하고
Inspector 패널에서 그에 대한 값을 설정합니다.
위젯 스크립트 예시t:
- 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 를 선택합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 페이지 배경 이미지
- 아이템 위젯 표시 영역
다음 그림은 페이지 구조의 예시를 보여줍니다.
페이지 컨트롤러 생성
MonoBehaviour
기본 클래스에서 상속된VirtualItemsPage
스크립트를 생성합니다.- 선언할 변수:
WidgetsContainer
— 위젯용 컨테이너WidgetPrefab
— 아이템 위젯 프리패브
- 페이지 게임 개체에 스크립트 첨부:
Hierarchy 패널의 개체를 선택합니다.Inspector 패널에서Add Component 를 클릭하고VirtualItemsPage
스크립트를 선택합니다.
Inspector 패널의 변숫값을 설정합니다.
Start
메소드의XsollaLogin.Instance.SignIn
SDK 메소드를 호출하여 로그인 논리를 추가하고 다음으로 전달합니다.username
매개 변수의 사용자 이름 또는 이메일 주소password
매개 변수의 사용자 암호
xsolla
, 암호: xsolla
).- 계정 기억용
rememberUser
매개 변수의 플래그 - 성공적인 사용자 로그인용
OnAuthenticationSuccess
콜백 - 오류용
OnError
콜백 메소드
- 계정 기억용
- 아이템 목록 가져오기 논리를 추가합니다.
OnAuthenticationSuccess
메소드에서XsollaStore.Instance.GetCatalog
SDK 메소드를 호출하여 전달할 대상: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 를 클릭합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 아이템 배경 이미지
- 아이템 이름
- 아이템 설명
- 아이템 가격
- 아이템 이미지
다음 그림은 위젯 구조의 예시를 보여줍니다.
아이템 위젯 스크립트 생성
- MonoBehaviour 기본 클래스에서 상속된
VirtualItemWidget
스크립트를 생성합니다. - 아이템 위젯 인터페이스 요소에 대한 변수를 선언하고
Inspector 패널에서 그에 대한 값을 설정합니다.
위젯 스크립트 예시t:
- 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 를 클릭합니다. - 프리패브의 자식 개체로 아이템 그룹을 표시할 수 있게 하는 버튼을 추가하고 시각적 정보를 구성합니다.
다음 그림은 위젯 구조의 예시를 보여줍니다.
아이템 그룹을 여는 버튼용 스크립트 생성
MonoBehaviour
기본 클래스에서 상속된VirtualItemGroupButton
스크립트를 생성합니다.- 아이템 그룹을 여는 버튼에 대한 변수를 선언하고
Inspector 패널의 변숫값을 설정합니다. - 프리패브 루트 개체에 스크립트를 추가하는 방법:
Hierarchy 패널의 개체를 선택합니다.Inspector 패널에서Add Component 를 클릭하고VirtualItemGroupButton
스크립트를 선택합니다.
위젯 스크립트 예시t:
- 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 를 선택합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 페이지 배경 이미지
- 아이템 그룹 버튼 표시 영역
- 아이템 위젯 표시 영역
다음 그림은 페이지 구조의 예시를 보여줍니다.
페이지 컨트롤러 생성
MonoBehaviour
기본 클랙스에서 상속된VirtualItemsByGroupsPage
스크립트를 생성합니다.- 변수 선언:
GroupButtonsContainer
— 그룹 버튼용 컨테이너GroupButtonPrefab
— 버튼 프리패브ItemWidgetsContainer
— 아이템 위젯용 컨테이너WidgetPrefab
— 아이템 위젯 프리패브
- 페이지 게임 개체에 스크립트 첨부:
Hierarchy 패널의 개체를 선택합니다.Inspector 패널에서Add Component 를 클릭하고VirtualItemsByGroupsPage
스크립트를 선택합니다.
Inspector 패널의 변숫값을 설정합니다.Start
메소드의XsollaLogin.Instance.SignIn
SDK 메소드를 호출하여 로그인 논리를 추가하고 다음으로 전달합니다.username
매개 변수의 사용자 이름 또는 이메일 주소password
매개 변수의 사용자 암호
xsolla
, 암호: xsolla
).- 계정 기억용
rememberUser
매개 변수의 플래그 - 성공적인 사용자 로그인용
OnAuthenticationSuccess
콜백 - 오류용
OnError
콜백 메소드
- 계정 기억용
- 아이템 목록 가져오기 논리를 추가합니다.
OnAuthenticationSuccess
메소드에서XsollaStore.Instance.GetCatalog
SDK 메소드를 호출하여 전달할 대상:projectId
매개 변수의 프로젝트 ID
- 성공적인 아이템 목록 가져오기 작업
OnItemsRequestSuccess
- 오류용
OnError
콜백 메소드 offset
매개 변수의 목록에 있는 첫 번째 아이템에 기반한 오프셋limit
매개 변수의 로드된 아이템 수
- 성공적인 아이템 목록 가져오기 작업
offset
및 limit
매개 변수는 필요하지 않습니다. 두 매개 변수는 페이지 매김 구현에 사용합니다. 페이지 매김이란 카탈로그에서 아이템 표시를 한 페이지씩 하는 것을 말합니다. 페이지의 최대 아이템 수는 50개입니다. 카탈로그에 50개보다 많은 아이템이 있다면 페이지 매김이 필요합니다.OnItemsRequestSuccess
메소드에서 아이템 그룹 목록 형성 논리 추가 방법:- 받은 아이템 목록에서 고유 그룹 목록을 가져옵니다. 이를 카테고리에 종속되어 있지 않은 모든 아이템을 표시할
All
요소에 추가합니다. - 모든 자식 개체를 삭제하여 버튼 컨테이너를 지웁니다. 이 작업을 수행하려면
DeleteAllChildren
메소드를 호출하여 이에 컨테이너 개체를 전달합니다. - 모든 아이템 그룹:
- 받은 아이템 목록에서 고유 그룹 목록을 가져옵니다. 이를 카테고리에 종속되어 있지 않은 모든 아이템을 표시할
- 아이템 위젯 프리패브를 컨테이너 자식 개체로 인스턴스화합니다.
- 받은
VirtualItemGroupButton
구성 요소를groupButton
변수로 설정합니다. groupName
변숫값을 그룹 이름이 있는 요소에 전달합니다.- 익명 메소드를 버튼 클릭 동작에 추가합니다. 이 메소드에서
OnGroupSelected
메소드를 호출하고 아이템 그룹 이름과 아이템 목록을 매개 변수로써 전달합니다.
- 모든 아이템을 표시하라면
OnGroupSelected
메소드를 호출하고All
을 그룹명으로 전달합니다.
- 모든 아이템을 표시하라면
OnGroupSelected
메소드에서 아이템 초기 표시 논리를 추가하는 방법:itemsForDisplay
변수를 생성하고 모든 받은 아이템을 이에 할당하는데, 이는 아이템 그룹의 이름이All
을 가진 경우입니다. 그렇지 않은 경우에는groupName
변수와 일치하는 그룹 이름을 가진 아이템을itemsForDisplay
변수에 연결합니다.- 모든 자식 개체를 삭제하여 버튼 컨테이너을 지웁니다. 이 작업을 수행하려면
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 를 클릭합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 위젯 배경 이미지
- 번들 이름
- 번들 설명
- 번들 가격
- 번들 콘텐츠 설명(아이템 및 수량)
- 번들 이미지
다음 그림은 위젯 구조의 예시를 보여줍니다.
위젯 스크립트 생성
- MonoBehaviour 기본 클래스에서 상속된
BundleWidget
스크립트를 생성합니다. - 아이템 위젯 인터페이스 요소에 대한 변수를 선언하고
Inspector 패널에서 그에 대한 값을 설정합니다.
위젯 스크립트 예시t:
- 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 를 선택합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 페이지 배경 이미지
- 번들 위젯 표시 영역
다음 그림은 페이지 구조의 예시를 보여줍니다.
페이지 컨트롤러 생성
BundlesPage
스크립트를 생성하는데, 이는MonoBehaviour
기본 클래스에서 상속된 것입니다.- 변수 선언:
WidgetsContainer
— 위젯용 컨테이너WidgetPrefab
— 번들 위젯 프리패브
- 페이지 게임 개체에 스크립트 첨부:
Hierarchy 패널의 개체를 선택합니다.Inspector 패널에서Add Component 를 클릭하고BundlesPage
스크립트를 선택합니다.
Inspector 패널의 변숫값을 설정합니다.Start
메소드의XsollaLogin.Instance.SignIn
SDK 메소드를 호출하여 로그인 논리를 추가하고 다음으로 전달합니다.username
매개 변수의 사용자 이름 또는 이메일 주소password
매개 변수의 사용자 암호
xsolla
, 암호: xsolla
).- 계정 기억용
rememberUser
매개 변수의 플래그 - 성공적인 사용자 로그인용
OnAuthenticationSuccess
콜백 - 오류용
OnError
콜백 메소드
- 계정 기억용
- 번들 목록 가져오기 논리를 추가합니다.
OnAuthenticationSuccess
메소드에서XsollaStore.Instance.GetBundles
SDK 메소드를 호출하여 전달할 대상: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 를 클릭합니다. - 다음 UI 요소를 자식 개체로 추가하고 시각 정보를 구성합니다.
- 위젯 배경 이미지
- 패키지 이름
- 패키지 설명
- 패키지 가격
- 패키지 이미지
다음 그림은 위젯 구조의 예시를 보여줍니다.
위젯 스크립트 생성
- MonoBehaviour 기본 클래스에서 상속된
VirtualCurrencyPackageWidget
스크립트를 생성합니다. - 아이템 위젯 인터페이스 요소에 대한 변수를 선언하고
Inspector 패널에서 그에 대한 값을 설정합니다.
위젯 스크립트 예시t:
- 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 를 선택합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 페이지 배경 이미지
- 가상 화폐 패키지 위젯 표시 영역
다음 그림은 페이지 구조의 예시를 보여줍니다.
페이지 컨트롤러 생성
VirtualCurrencyPackagesPage
스크립트를 생성하는데, 이는MonoBehaviour
기본 클래스에서 상속된 것입니다.- 변수 선언:
WidgetsContainer
— 위젯용 컨테이너WidgetPrefab
— 가상 화폐 패키지 프리패브
- 페이지 게임 개체에 스크립트 첨부:
Hierarchy 패널의 개체를 선택합니다.Inspector 패널에서Add Component 를 클릭하고VirtualCurrencyPackagesPage
스크립트를 선택합니다.
Inspector 패널의 변숫값을 설정합니다.Start
메소드의XsollaLogin.Instance.SignIn
SDK 메소드를 호출하여 로그인 논리를 추가하고 다음으로 전달합니다.
username
매개 변수의 사용자 이름 또는 이메일 주소password
매개 변수의 사용자 암호
xsolla
, 암호: xsolla
).- 계정 기억용
rememberUser
매개 변수의 플래그 - 성공적인 사용자 로그인용
OnAuthenticationSuccess
콜백 - 오류용
OnError
콜백 메소드
- 계정 기억용
- 아이템 목록 가져오기 논리를 추가합니다.
OnAuthenticationSuccess
메소드에서XsollaStore.Instance.GetVirtualCurrencyPackagesList
SDK 메소드를 호출하여 전달할 대상: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
XsollaLogin.Instance.SignIn
SDK 메소드를 통한 사용자 권한 부여 동안 받은 JWT. XsollaLogin.Instance.GetUserAccessToken
SDK 메소드를 통한 사용자 권한 부여 동안 받은 페이 스테이션 액세스 토큰. 자체 권한 부여 시스템을 구현했다면 이 토큰을 사용합니다.
- 가상 아이템 구매 버튼 클릭 처리용 논리 추가:
OnItemsRequestSuccess
메소드에서 버튼 클릭 이벤트를 구독합니다.- 버튼 클릭 후에 호출된 익명 메소드를 추가합니다.
- 이 메소드에서
XsollaStore.Instance.ItemPurchase
SDK 메소드를 호출하여 명령을 형성하고 이에 다음을 전달합니다.
projectId
매개 변수의 프로젝트 IDitemSku
매개 변수의 아이템 식별자- 성공적인 아이템 구매 주문 형성 처리를 위한
OnOrderCreateSuccess
메소드 - 오류용
OnError
콜백 메소드
- 결제 페이지 열기를 구현합니다. 이를 수행하려면
OnOrderCreateSuccess
메소드를 추가하고 이에 다음을 호출합니다.- 결제 페이지 열기용
XsollaStore.Instance.OpenPurchaseUi
SDK 메소드 - 주문 상태 변경 사항 추적용
TrackOrderStatus
코루틴
- 결제 페이지 열기용
TrackOrderStatus
코루틴에서 이를 수행하려면 초당 한 번 주문 상태 정보 가져오기를 구현합니다. 이를 수행하려면XsollaStore.Instance.CheckOrderStatus
SDK 메소드를 사용하고 이에 다음을 전달합니다.projectId
매개 변수의 프로젝트 IDorderId
매개 변수의 결제 상세 정보로부터의 주문 수- 성공적인 주문 상태 정보 받기 처리용 익명 메소드
- 오류 처리용 익명 메소드
- 성공적인 주문 상태 정보 받기 처리용 메소드에서
OnPurchaseSuccess
메소드 콜백을 주문 결제 동안(결제 상태done
또는paid
) 구현합니다. OnPurchaseSuccess
메소드에서 성공적인 가상 아이템 구매 처리를 구현합니다.
- 결제 페이지 열기용 기본 제공 브라우저를 사용한다면 이 브라우저를 닫으세요.
페이지 스크립트 예시:
- 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
XsollaLogin.Instance.SignIn
SDK 메소드를 통한 사용자 권한 부여 동안 받은 JWT. XsollaLogin.Instance.GetUserAccessToken
SDK 메소드를 통한 사용자 권한 부여 동안 받은 페이 스테이션 액세스 토큰. 자체 권한 부여 시스템을 구현했다면 이 토큰을 사용합니다.
- 가상 아이템 구매 버튼 클릭 처리용 논리 추가:
OnItemsRequestSuccess
메소드에서 버튼 클릭 이벤트를 구독합니다.- 버튼 클릭 후에 호출된 익명 메소드를 추가합니다.
- 이 메소드에서
XsollaStore.Instance.ItemPurchase
SDK 메소드를 호출하여 명령을 형성하고 이에 다음을 전달합니다.
projectId
매개 변수의 프로젝트 IDitemSku
매개 변수의 아이템 식별자- 성공적인 아이템 구매 주문 형성 처리를 위한
OnOrderCreateSuccess
메소드 - 오류용
OnError
콜백 메소드
OnOrderCreateSuccess
메소드에서 주문 상태 확인 처리를 구현합니다. 이를 수행하려면XsollaStore.Instance.CheckOrderStatus
SDK 메소드를 사용하고 이에 다음을 전달합니다.projectId
매개 변수의 프로젝트 IDorderId
매개 변수의 결제 상세 정보로부터의 주문 수- 성공적인 주문 상태 정보 받기 처리용 익명 메소드
- 성공적인 주문 상태 정보 받기 처리용 메소드에서
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 를 클릭합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 위젯 배경 이미지
- 인게임 재화 이름
- 인게임 재화 수량
- 인게임 재화 이미지 이미지
다음 그림은 위젯 구조의 예시를 보여줍니다.
잔액 표시 위젯 스크립트 생성
- MonoBehaviour 기본 클래스에서 상속된
VirtualCurrencyWidget
스크립트를 생성합니다. - 아이템 위젯 인터페이스 요소에 대한 변수를 선언하고
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 를 선택합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 페이지 배경 이미지
- 위젯 표시 영역
다음 그림은 페이지 구조의 예시를 보여줍니다.
인게임 재화 목록이 있는 페이지용 컨트롤러 생성
MonoBehaviour
기본 클래스에서 상속된VirtualCurrenciesPage
스크립트를 생성합니다.- 선언할 변수:
WidgetsContainer
— 위젯용 컨테이너WidgetPrefab
— 잔액 표시 위젯 프리패브
- 페이지 게임 개체에 스크립트 첨부:
Hierarchy 패널의 개체를 선택합니다.Inspector 패널에서Add Component 를 클릭하고VirtualCurrenciesPage
스크립트를 선택합니다.
Inspector 패널의 변숫값을 설정합니다.Start
메소드의XsollaLogin.Instance.SignIn
SDK 메소드를 호출하여 로그인 논리를 추가하고 다음으로 전달합니다.username
매개 변수의 사용자 이름 또는 이메일 주소password
매개 변수의 사용자 암호
xsolla
, 암호: xsolla
).- 계정 기억용
rememberUser
매개 변수의 플래그 - 성공적인 사용자 로그인용
OnAuthenticationSuccess
콜백 - 오류용
OnError
콜백 메소드
- 계정 기억용
- 인게임 재화 목록 가져오기 논리를 추가합니다. 이를 수행하려면
OnAuthenticationSuccess
메소드에서:- 권한 부여 토큰을
XsollaStore.Instance.Token
변수로 전달합니다.
- 권한 부여 토큰을
- JWT
XsollaLogin.Instance.SignIn
SDK 메소드를 통한 사용자 권한 부여 동안 받은 JWT. XsollaLogin.Instance.GetUserAccessToken
SDK 메소드를 통한 사용자 권한 부여 동안 받은 페이 스테이션 액세스 토큰. 자체 권한 부여 시스템을 구현했다면 이 토큰을 사용합니다.
XsollaStore.Instance.GetVirtualCurrencyBalance
SDK 메소드를 호출하여 다음으로 전달합니다.projectId
매개 변수의 프로젝트 ID
- 성공적인 아이템 목록 가져오기 작업
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 를 클릭합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 아이템 배경 이미지
- 아이템 이름
- 아이템 설명
- 아이템 수량
- 아이템 이미지
다음 그림은 위젯 구조의 예시를 보여줍니다.
아이템 위젯 스크립트 생성
- MonoBehaviour 기본 클래스에서 상속된
InventoryItemWidget
스크립트를 생성합니다. - 아이템 위젯 인터페이스 요소에 대한 변수를 선언하고
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 를 선택합니다. - 다음 UI 요소를 프리패브 자식 개체로 추가하고 시각 정보를 구성합니다.
- 페이지 배경 이미지
- 아이템 위젯 표시 영역
다음 그림은 페이지 구조의 예시를 보여줍니다.
페이지 컨트롤러 생성
MonoBehaviour
기본 클래스에서 상속된InventoryItemsPage
스크립트를 생성합니다.- 선언할 변수:
WidgetsContainer
— 아이템 위젯용 컨테이너WidgetPrefab
— 아이템 위젯 프리패브
- 페이지 게임 개체에 스크립트 첨부:
Hierarchy 패널의 개체를 선택합니다.Inspector 패널에서Add Component 를 클릭하고InventoryItemsPage
스크립트를 선택합니다.
Inspector 패널의 변숫값을 설정합니다.Start
메소드의XsollaLogin.Instance.SignIn
SDK 메소드를 호출하여 로그인 논리를 추가하고 다음으로 전달합니다.username
매개 변수의 사용자 이름 또는 이메일 주소password
매개 변수의 사용자 암호
xsolla
, 암호: xsolla
).- 계정 기억용
rememberUser
매개 변수의 플래그 - 성공적인 사용자 로그인용
OnAuthenticationSuccess
콜백 - 오류용
OnError
콜백 메소드
- 계정 기억용
- 인벤토리의 아이템 목록 가져오기 논리를 추가합니다. 이를 수행하려면
OnAuthenticationSuccess
메소드에서:- 권한 부여 토큰을
XsollaStore.Instance.Token
변수에 전달합니다.
- 권한 부여 토큰을
- JWT
XsollaLogin.Instance.SignIn
SDK 메소드를 통한 사용자 권한 부여 동안 받은 JWT. XsollaLogin.Instance.GetUserAccessToken
SDK 메소드를 통한 사용자 권한 부여 동안 받은 페이 스테이션 액세스 토큰. 자체 권한 부여 시스템을 구현했다면 이 토큰을 사용합니다.
XsollaStore.Instance.GetInventoryItems
SDK 메소드를 호출하여 다음으로 전달합니다.projectId
매개 변수의 프로젝트 ID
- 성공적인 아이템 목록 가져오기 작업
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}");
}
}
}
다음 그림은 스크립트 작업 결과를 보여줍니다.
오자 또는 기타 텍스트 오류를 찾으셨나요? 텍스트를 선택하고 컨트롤+엔터를 누르세요.