Ada içi alışveriş işlemleri sana Verse’ü kullanarak adanda eşyalar, teklifler ve paket teklifler pazarlama olanağı tanır.
Bu kılavuzda, kendi eşyalarını, tekliflerini ve paket tekliflerini nasıl ayarlayacağını öğreneceksin. Verse API’sindeki Marketplace modülünü kullanarak oyun içi eşyaların satışını yönetebilirsin.
Eşyalar
Verse’te eşyalar, ürünler olarak tanımlanır ve iki kategoriye ayrılır: kullanım sonrasında oyuncu çantasından kaldırılan tüketilebilir eşyalar ve oyuncunun, çantasından kaldırılmadan kullanmaya devam edebileceği dayanıklı eşyalar.
Her Verse ürünü aşağıdaki özelliklere sahiptir:
Ad: En fazla 50 karakterden oluşan ürün adı.
Açıklama: Ürünle birlikte görüntülenen, en fazla 500 karakterden oluşan uzun açıklama.
ShortDescription: Ürünün, en fazla 100 karakterlik daha küçük bir iletişim kutusundaki özeti olan kısa açıklama.
Simge: Ürünün görseli.
Ürünün bir ücretli rastgele eşya ise açıklamada oyuncunun alabileceği şeylerin doğru sayısal olasılığını belirtmen gerekir. Daha fazla bilgi için Ücretli Rastgele Eşyalar kısmına bakabilirsin.
Bir Verse ürünü aşağıdaki isteğe bağlı özelliklere de sahip olabilir:
MaxCount: Bir ürünün, oyuncunun bir defada sahip olabileceği maksimum sayısı.
Tüketilebilir: True olarak ayarlanırsa ürün tüketilebilir ve bu da toplam kullanım sayısını azaltır. False olarak ayarlanırsa ürün kalıcı bir eşya olur ve kullanılarak tüketilmez.
PaidArea: True olarak ayarlanırsa ürün, ödeme duvarının arkasındaki bir alana erişim sağlar.
PaidRandomItem: True olarak ayarlanırsa bu ürünler rastgele bir ödül elde etmek için satın alınır veya içerik karşılığında alınır.
ConsequentialToGameplay: Bu true olarak ayarlandıysa; eşya, adanda oyunculara anlamlı bir avantaj sağlıyordur. Daha ayrıntılı bilgi için Oynanış Üzerinde Etkili kısmına bakabilirsin.
Kullanımda olmayan aktif hakların varsa ve IARC anketinde uygulama içi satın alma işlemlerini onaylamadıysan adan denetlemeden geçemez.
Bunu aşmak için canlı bir oyunda kullanmaya hazır olana kadar eşyalarını Verse’te dışarıda bırakabilirsin. Haklar dışarıda bırakıldığında, IARC anketinde uygulama içi satın alma talep etmen gerekmez.
Verse’te Tüketilebilir/Tek Kullanımlık Hak Oluşturma
Ürünler Verse’te, ürün temel sınıfından türetilerek tanımlanır. Aşağıdaki kod parçacığı, tüketilebilir bir eşyanın oluşturulmasını gösterir. Bu örnekte, tüketilebilir eşya olarak mısır tohumları oluşturacaksın. Aşağıda, kullanman için bir tohum simgesi yer alıyor.
# The base entitlement you should define for ALL of your entitlements in your experience.
my_island_entitlement := class<abstract><castable>(entitlement){}
CornSeedPacket<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "A pack of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Contains 10 corn seeds for planting."
cornseedpacket<public> := class<concrete>(my_island_entitlement):
var Name<override>:message = CornSeedPacket.Name
Bir ürün oluştururken, Verse kodunun başarıyla derlenmesi için geçerli bir simge dokusu yolu eklemen gerekir. Bu kılavuzda yer alan mısır tohumu paketi ile diğer simgeleri ücretsiz olarak al!
Vitrininde en iyi kalitede görseller elde etmek için ürün simgelerinde ikinin kuvveti boyutlarda dokular kullandığından emin ol. Simge olarak kullanmak üzere UEFN’e doku aktarma hakkında bilgi almak için Öğeleri İçe Aktarma sayfasına bakabilirsin. Verse’te dokular gibi öğeleri kullanıma açma (expose) konusunda bilgi almak için Öğeleri Kullanıma Açma sayfasına bakabilirsin.
Verse’te Dayanıklı Ürünler Oluşturma
Verse’te dayanıklı ürünler, tüketilebilir ürünlerle aynı formatı izler ancak aralarında önemli bir fark vardır: Tüketilebilir, true yerine false olarak ayarlanır. Dayanıklı ürünler oyuncular tarafından yalnızca bir kez satın alınabilir ve oyuncular belirli bir dayanıklı ürünün yalnızca bir adedine sahip olabilir.
Bu örnekte, dayanıklı bir ürün olarak bir kürek oluşturacaksın. Aşağıdaki kod parçacığının ardından kürek dokusu için bir simge verilmiştir.
Shovel<public> := module:
Name<public><localizes>: message = "Shovel"
Description<public><localizes>: message = "An unbreakable shovel used to dig holes for planting."
ShortDescription<public><localizes>: message = "Digs holes."
shovel<public> := class<concrete>(my_island_entitlement):
var Name<override>:message = Shovel.Name
var Description<override>:message = Shovel.Description
var ShortDescription<override>:message = Shovel.ShortDescription
var Icon<override>:texture = # path to your texture here
Eşyalar varsayılan olarak Tüketilebilir değildir ve MaxCount değerleri 1’dir. Eşya; ücretli bir alansa, bir ücretli rastgele eşyaysa veya oynanış üzerinde etkili ve anlamlı bir avantaj sağlıyorsa ilgili alanları kodunda tanımlaman gerekir.
Ürün Doğrulama Kuralları
Verse’te geçerli bir ürün aşağıdaki kurallara uymalıdır. Bu kurallara uymayan bir ürünün satın alınma işlemi başarısız olacaktır.
Geçerli bir ürünü tanımlayan kurallar şunlardır:
Adın karakter sınırı 50’dir.
Açıklamanın karakter sınırı 500’dür.
Kısa açıklamanın karakter sınırı 100’dür.
MaxCount, Consumable=false olduğunda 1 olmalıdır.
MaxCount’un maksimum değeri 10.000.000’dur.
MaxCount < 1 ayarı yürütülmez ancak bir oyuncuya tek bir eşyadan daha azını veremeyeceğin için başarısız olacaktır.
Eşya Kataloğu
Oyunculara sunduğun tüm ürünleri görüntülemek için Eşya Kataloğu’nu kullanabilirsin.
UEFN’de ürünlerini listeleyen bir raporu Araçlar > Ürün Kataloğu’na tıklayarak veya doğrudan adanın İçerik Üreticisi Portalı’ndaki katalogdan görüntüleyebilirsin.
Teklifler
Bir teklif; bir eşya veya öğe için V-Papel cinsinden bir fiyat belirtir. Her teklifin, ürün özelliklerinden ayrı olarak kendi adı, açıklaması ve simgesi vardır. Teklifler Verse’te tanımlanır.
Her teklif aşağıdaki özelliklere sahiptir:
Ad: Teklifin adı.
Açıklama: Teklifin yanında gösterilen uzun açıklama.
Kısa Açıklama: Teklifi daha küçük iletişim kutularında özetlemek için kullanabileceğin kısa açıklama.
Simge: Teklifin görseli.
EntitlementType: Teklife dahil edilen hakkın beyanı.
Fiyat: V-Papel cinsinden fiyat. Fiyat, 50 V-Papel’den az ve 5.000 V-Papel’den fazla olmamalıdır. 50’nin katları olarak belirlenmelidir.
Basit Bir Teklif Oluştur
Bu kod parçacığı, basit bir teklif için Mısır Tohumu Paketi temel teklifini tanımlar. Bu teklifin simgesi olarak ürün örneğindeki mısır tohumu simgesini tekrar kullanabilirsin.
CornSeedPacket<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "A pack of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Contains 10 corn seeds for planting."
corn_seed_pack<public> := class(entitlement_offer):
var Name<override> : message = CornSeedPacket.Name
var Description<override> : message = CornSeedPacket.Description
var ShortDescription<override> : message = CornSeedPacket.ShortDescription
V-Papel cinsinden fiyat 50’nin katları olmalı ve 50 ila 5.000 V-Papel arasında olmalıdır.
Oyuncuların, her ücretli rastgele eşyanın elde edilebilme olasılığını, eşyayı satın almadan önce sayısal olarak doğru bir şekilde görebilmesini sağlamalısın. Bunu yapmaman durumunda Fortnite Geliştirici Kuralları’nı ihlal etmiş sayılırsın ve hem sen hem de adan uygun yaptırımlara tabi tutulur.
Daha fazla bilgi için Ada İçi Alışveriş İşlemleri Kısıtlamaları sayfasına göz at.
Sabit ve Alternatif Teklifler Oluşturma ve Düzenleme
Aynı ürün için alternatif teklifler oluşturarak tatil zamanlarında özel fiyatlar veya tanıtım bonusları sunabilir ve fiyatları bölgelere göre değiştirebilirsin. Alternatif teklifleri ürün testi için de kullanabilir ve aynı teklifi farklı bir simgeyle oluşturarak oyunculara simgelerden hangisinin daha cazip geldiğini görebilirsin. Örnek olarak bu simgeyi kullanalım.
CornSeedPacketAlternate<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "Special price! Only today!"
ShortDescription<public><localizes> : message = "Special offer half price!"
corn_seed_pack_alternate<public> := class(entitlement_offer):
var Name<override> : message = CornSeedPacketAlternate.Name
var Description<override> : message = CornSeedPacketAlternate.Description
var ShortDescription<override> : message = CornSeedPacketAlternate.ShortDescription
var Icon<override> : texture = # Your texture here
Paket Teklifler
Paketler Verse’te tanımlanır ve farklı tekliflerin bir bileşimini, aynı teklifin yığınlarını veya bu ikisinin karışımını içerebilir. Basit teklifler gibi, paket teklifler de kendi fiyatlarını, adlarını ve açıklamalarını belirtir ve ürünlerle tekliflerden farklı bir simgeye sahiptir. Teklifleri, bir paket teklif içine paketler ekleyerek iç içe de yerleştirebilirsin. Buna örnek olarak, bir kürek ve mısır tohumu paketlerinden oluşan bir paket içeren sınırlı süreli bir paket verilebilir. Bu sayede, daha büyük, birleştirilmiş paketlerin yapı taşları olarak daha küçük paketler kullanabilirsin.
Standart paket türleri şunlardır:
Yığınlı paket: Genellikle indirimli bir fiyat karşılığında aynı ürüne yönelik birden fazla teklif içeren bir paket.
Çoklu teklif paketi: Birden fazla ürüne dair teklifleri bir araya getiren paket. Yığınlı tekliflerle normal tekliflerin bir karışımını da içerebilir.
İç içe geçmiş tekliflerin derinliği 5’i geçemez, aksi takdirde işlem başarısız olur. İç içe geçmiş teklifleri mümkün olduğunca sınırlamaya çalış.
Yığınlı Paket Oluşturma
Bu kod parçacığı, mısır tohumlarından oluşan bir yığınlı paket tanımlar. Bir paket, tanımlanmış teklifi ve teklif sayısını belirten int (tamsayı) değerini içeren bir teklif dizisi demeti içerir. Bu durumda, bu pakette iki corn_seed_pack teklifi olacaktır. Bu örnek için bir simge sağlanmıştır.
CornSeedPacketBundle<public> := module:
Name<public><localizes> : message = "Corn seed pack bundle"
Description<public><localizes> : message = "Two packs of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Two packs of corn seeds containing 10 corn seeds for planting."
corn_seed_pack_bundle<public> := class(bundle_offer):
var Name<override> : message = CornSeedPacketBundle.Name
var Description<override> : message = CornSeedPacketBundle.Description
var ShortDescription<override> : message = CornSeedPacketBundle.ShortDescription
var Icon<override> : texture = # your texture here
Çoklu Teklif Paketleri Oluşturma
Oyuncular birden fazla işlem yapmak istemeyebilir, bunun için farklı ürünler içeren birden fazla teklifin bulunduğu bir paket oluşturabilirsin. Bu kod parçacığı, oyuncuya maksimum sayıda mısır paketi ve bir kürek sağlayan bir çoklu teklif paketi oluşturur.
StarterBundle<public> := module:
Name<public><localizes> : message = "Starter bundle"
Description<public><localizes> : message = "Everything a new player needs. Get fully stocked to start quickly! A shovel that digs holes, and ten packs of corn seeds each containing 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "A shovel that digs holes, and ten packs of corn seeds each containing 10 corn seeds for planting."
starter_bundle<public> := class(bundle_offer):
var Name<override> : message = StarterBundle.Name
var Description<override> : message = StarterBundle.Description
var ShortDescription<override> : message = StarterBundle.ShortDescription
var Icon<override> : texture = # your texture here
Verse’te paketler doğrudan ürünleri içermez. Bunun yerine, kendileri ürün tanımlarına sahip olan teklifler içerir.
Dinamik Olarak Oluşturulan Teklifler
Dinamik olarak oluşturulan teklif, Verse’te çalışma zamanında oluşturulan bir teklif veya paket tekliftir. Dinamik teklifler için yaygın kullanım senaryoları şunlar olabilir:
Bir oyuncunun bir üretim oyununda tutabileceği maksimum odun miktarına yönelik bir teklif.
Bir zindanda ilerleme oyunu için zindan girişinde can ve mana iksirlerini maksimuma çıkarmaya yarayan bir paket.
Basitlik açısından, teklifi bir düğme veya işaret gibi basit bir şeye bağla. Verse kodunda bu, şu akışı izler: Etkileşimde > BuyOffer’ı çağır.
Bu kod parçacığı bir oyuncuya, onun sahip olabileceği maksimum miktara kadar mısır tohumu paketlerinden oluşan bir paket satmanın bir yolunu gösterir. Satın alma işlemi başarısız olursa bir hata mesajı görüntülenir.
TryBuyOffer(Player : player)<suspends>:void =
Purchases := GetPurchasedEntitlements(Player, Entitlements.corn_seed_pack)
var NumPlayerCornSeedPacks : int = 0
if (Purchase := Purchases[0]):
set NumPlayerCornSeedPacks = Purchase(1)
# Limit to at least 1 packet.
# If the player has the maximum amount, the offer displays with a disabled purchase button.
NumCornSeedPacks := Max(1, Entitlements.corn_seed_pack{}.MaxCount - NumPlayerCornSeedPacks)
Teklif Doğrulama Kuralları
Geçerli bir teklif veya paket aşağıdaki kurallara uymalıdır. Bu kurallara uymayan satın alımlar denetlemeden geçemeyecektir. Geçerli bir teklifi tanımlayan kurallar şunlardır:
İç içe geçmiş tekliflerin derinliği 5’i geçemez.
Teklif başına toplam ürün tanımlayıcı sayısı 100’ü geçemez. Bu, bir seferde satılan farklı ürünlerin toplam miktarının en fazla 100 olabileceği anlamına gelir.
Teklifin fiyatı 50 ila 5.000 V-Papel arasında olmalıdır ve yalnızca 50’nin katları şeklinde olabilir.
Teklif
adıvarsayılan metni 50 karakteri geçemez.Teklif
açıklamasıvarsayılan metni 500 karakteri geçemez.Teklif
kısa açıklamasıvarsayılan metni 100 karakteri geçemez.Bir teklif en az 1 ürün içermelidir.
Bir teklif, bir ürünün
MaxCountadedinden daha fazla miktarda ürün içermez.Bir teklif,
MaxCountadedi 1’den büyük olan bir dayanıklı ürün içermez.
Tekliflerinin nerede gösterileceği ve onları kimlerin görüntüleyebileceği konusunda kısıtlamalar uygulamayı tercih edebilirsin. Daha fazla bilgi için Ada İçi Alışveriş İşlemleri Kısıtlamaları kısmına göz at.
Bir Vitrin Oluştur
Artık ürünlerini, tekliflerini ve paketlerini hazırladığına göre bunları satabileceğin bir yere ihtiyacın var!
Varsayılan Kullanıcı Arayüzü
Varsayılan vitrin kullanıcı arayüzü, eklediğin tüm ürünlerin ve tekliflerin bir listesiyle açılır. Listedeki ilk ürün vurgulanır ve listenin yanındaki pencerede ürüne ait genel bilgiler yer alır.
Vitrinlerin birden fazla sayfası olabilir.
Beşten fazla eşya içeren listeler kaydırılabilir.
Bir oyuncu, satın alma akışını BuyOffer metodunu çağırarak veya ShowOffersDialog metoduyla varsayılan vitrini kullanarak tetikler. Aşağıda, vitrin satın alma akışını oyun tasarımına entegre etmek için kullanabileceğin bazı cihazlara ilişkin örnekler verilmiştir:
Bölge cihazı
Scene Graph Süreölçer cihazı
NPC’ler
Konuşma cihazı
Bir vitrin tasarlarken, satın alma akışını başlatmak için oyuncunun seçim yapmasını zorunlu tutmak örnek bir uygulamadır. Bu seçimin atlanması ve oyuncular için satın alma akışının açılmasının zorlanması oyuncuların iradesini ortadan kaldırır ve onların mutsuz olması riskini doğurur.
Tüm tekliflerde, bir eşyayı satın almaya veya bir teklifin içeriğini incelemeye yönelik Marketplace pencerelerini açan Satın Al ve İncele düğmeleri bulunur. Paketi İncele düğmesi yalnızca paketlerde vardır.
Kapat düğmesine basıldığında Marketplace kapanır.
Vitrin deneyimi tamamen geliştirici tarafından kontrol edilir:
Oyuncularına hangi eşyaları veya oynanış özelliklerini sunmak istediğine sen karar verirsin.
Her teklifin veya paket teklifin fiyatını sen belirlersin.
Kendi vitrinini sunabilir veya önceden hazırlanmış Fortnite vitrin kullanıcı arayüzünü kullanabilirsin.
Vitrin Kullanıcı Arayüzü
Bu kod parçacığı, önceden hazırlanmış Fortnite vitrin kullanıcı arayüzünü açan genel bir olay geri çağırmayı (callback) tanımlamaktadır. Geri çağırma, bir abonelikten, bir düğmeye basılmasından, bir konuşma olayından vb. tetiklenebilir.
OnEvent(Agent:agent):void=
if(Player:= player[Agent]):
spawn{ShowOffersDialog(Player, array{
ExampleOffers.shovel{},
ExampleOffers.cornseedpacket{}
})}
Satın Alımları Yönetme
Bu kod parçacığı genel bir teklif satın alımını içerir. Satın alma işlemi başarısız olursa bir hata mesajı görüntülenir.
TryBuyOffer(Player:player, Offer : offer)<suspends>:void =
Result := BuyOffer(Player, Offer)
if (not Result?):
Print("Failed to buy the {offer.name} offer.")Başarısız satın alımlarda hata ayıklamayı kolaylaştırmak üzere, hata mesajında hangi satın almanın başarısız olduğunu tanımlamak için bir yol sağla. Örneğin yukarıdaki hata mesajına teklifin adını ekleyebilirsin.
Ek Fonksiyonlar
Ücretli Rastgele Eşyalar
Adanda ücretli rastgele eşyalar sunmanın iki yolu vardır:
Bunları doğrudan V-Papel ile satın alınacak şekilde sunabilirsin.
Oyunculara V-Papel ile satın alıp rastgele bir ödül almak veya rastgele bir ödülün olasılığını etkilemek için kullanabilecek haklar alma imkanı vererek bunları dolaylı olarak sunabilirsin.
Rastgele ödül veren bir eşya oluştururken PaidRandomItem’ı true olarak ayarlaman gerekir.
Rastgele bir ödül almak için kullanılabilecek içerikler sunuyorsan erişimi olmayan oyuncuların rastgele ödülü almasını önlemek için RestrictPaidRandomItems fonksiyonunu kullanman gerekir.
OnEvent(Agent:agent):void=
if (Player := player[Agent]):
if (RestrictPaidRandomItems[Player]):
Print("Player is not allowed to purchase PaidRandomItems.")
else:
Print("Player is allowed to purchase PaidRandomItems.")
Satın Alma İçin Doğrudan İstemler
Adanda doğrudan satın alma istemleri varsa bir oyuncunun bu istemi almaya uygun olup olmadığını belirlemek için RestrictDirectPromptsToPurchase fonksiyonunu kullanman gerekir.
OnEvent(Agent:agent):void=
if (Player:= player[Agent]):
if (RestrictDirectPromptsToPurchase[Player]):
Print("Player is not allowed to receive direct purchase prompts.")
else:
Print("Player is allowed to receive direct purchase prompts.")
Oynanış Üzerinde Etkili
Sattığın eşya, adanda oyunculara anlamlı bir avantaj sağlıyorsa ConsequentialToGameplay seçeneğini true olarak ayarlamalısın.
Oynanış üzerinde etkili eşyalar, satın alındıklarında oyunculara anlamlı bir avantaj sağlar. Bu doğrudan (oyuncunun ilerleme oranını, gücünü veya diğer becerilerini artıran) veya dolaylı (oyuncunun oyunda ilerleme hızını veya kazanma ihtimalini anlamlı bir şekilde etkileyen eşyalara erişim sağlayan) olabilir.
Sattığın ürünle aynı avantajları sağlayan ve teklif sunulduğu sırada tüm oyuncuların ücretsiz olarak erişebileceği bir alternatif de varsa ConsequentialToGameplay seçeneğini true olarak ayarlamak zorunda değilsin. Oyundaki bir eşyanın tesadüfi fakat oynanışa etki etmeyen bir etkisi olduğunda bu eşya oynanış üzerinde etkili kabul edilmez. Örneğin, farklı kıyafet renklerinin farklı ortamlarda görünürlüğü bir miktar etkilemesi veya farklı ifadelerin farklı vücut hareketleri yapması gibi durumlar oynanışa etki etmez.
# The base entitlement you should define for ALL of your entitlements in your experience.
my_island_entitlement := class<abstract><castable>(entitlement){}
CornSeedPacket<public> := module:
Name<public><localizes> : message = "Corn seed pack"
Description<public><localizes> : message = "A pack of corn seeds. Opening a pack yields 10 corn seeds for planting."
ShortDescription<public><localizes> : message = "Contains 10 corn seeds for planting."
cornseedpacket<public> := class<concrete>(my_island_entitlement):
var Name<override>:message = CornSeedPacket.Name