Skip to content

Commit 715735d

Browse files
authored
Merge a8c0808 into 211c9d8
2 parents 211c9d8 + a8c0808 commit 715735d

File tree

122 files changed

+2306
-621
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+2306
-621
lines changed

docs.json

Lines changed: 85 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -444,60 +444,52 @@
444444
"group": "Unity",
445445
"pages": [
446446
"sdk/unity/overview",
447-
"sdk/unity/quickstart",
448447
"sdk/unity/installation",
449-
"sdk/unity/setup",
450-
"sdk/unity/bootstrap_game",
448+
"sdk/unity/bootstrap",
451449
{
452-
"group": "Ecosystem Wallet",
453-
"pages": [
454-
"sdk/unity/ecosystem-wallet/setup",
455-
"sdk/unity/ecosystem-wallet/authentication",
456-
"sdk/unity/ecosystem-wallet/manage-sessions",
457-
"sdk/unity/ecosystem-wallet/permissions",
458-
"sdk/unity/ecosystem-wallet/blockchain"
459-
]
460-
},
461-
{
462-
"group": "Onboard",
450+
"group": "Wallets",
463451
"pages": [
464452
{
465-
"group": "Authentication",
453+
"group": "Ecosystem Wallet",
466454
"pages": [
467-
"sdk/unity/onboard/authentication/intro",
468-
"sdk/unity/onboard/authentication/email",
469-
"sdk/unity/onboard/authentication/oidc",
470-
"sdk/unity/onboard/authentication/playfab",
471-
"sdk/unity/onboard/authentication/guest",
472-
"sdk/unity/onboard/authentication/federated-accounts"
455+
"sdk/unity/wallets/ecosystem-wallet/setup",
456+
"sdk/unity/wallets/ecosystem-wallet/authentication",
457+
"sdk/unity/wallets/ecosystem-wallet/manage-sessions",
458+
"sdk/unity/wallets/ecosystem-wallet/permissions",
459+
"sdk/unity/wallets/ecosystem-wallet/blockchain-interactions"
473460
]
474461
},
475-
"sdk/unity/onboard/recovering-sessions",
476-
"sdk/unity/onboard/session-management",
477-
"sdk/unity/onboard/connecting-external-wallets"
478-
]
479-
},
480-
{
481-
"group": "Power",
482-
"pages": [
483-
"sdk/unity/power/read-from-blockchain",
484-
"sdk/unity/power/write-to-blockchain",
485-
"sdk/unity/power/sign-messages",
486-
"sdk/unity/power/deploy-contracts",
487-
"sdk/unity/power/contract-events",
488462
{
489-
"group": "Advanced Blockchain Interactions",
463+
"group": "Embedded Wallet",
490464
"pages": [
491-
"sdk/unity/power/advanced/introduction",
492-
"sdk/unity/power/advanced/wallets",
493-
"sdk/unity/power/advanced/clients",
494-
"sdk/unity/power/advanced/transfers",
495-
"sdk/unity/power/advanced/contracts",
496-
"sdk/unity/power/advanced/tokens"
465+
"sdk/unity/wallets/embedded-wallet/setup",
466+
{
467+
"group": "Authentication",
468+
"pages": [
469+
"sdk/unity/wallets/embedded-wallet/onboard/authentication/intro",
470+
"sdk/unity/wallets/embedded-wallet/onboard/authentication/email",
471+
"sdk/unity/wallets/embedded-wallet/onboard/authentication/oidc",
472+
"sdk/unity/wallets/embedded-wallet/onboard/authentication/playfab",
473+
"sdk/unity/wallets/embedded-wallet/onboard/authentication/guest",
474+
"sdk/unity/wallets/embedded-wallet/onboard/authentication/federated-accounts"
475+
]
476+
},
477+
"sdk/unity/wallets/embedded-wallet/session-management",
478+
"sdk/unity/wallets/embedded-wallet/recovering-sessions",
479+
"sdk/unity/wallets/embedded-wallet/connecting-external-wallets",
480+
"sdk/unity/wallets/embedded-wallet/blockchain-interactions",
481+
"sdk/unity/wallets/embedded-wallet/sign-messages"
497482
]
498483
}
499484
]
500485
},
486+
{
487+
"group": "Indexer",
488+
"pages": [
489+
"sdk/unity/indexer/read-from-blockchain",
490+
"sdk/unity/indexer/contract-events"
491+
]
492+
},
501493
{
502494
"group": "Monetization",
503495
"pages": [
@@ -532,51 +524,70 @@
532524
"sdk/unity/monetization/onboard-user-funds"
533525
]
534526
},
535-
"sdk/unity/sidekick",
536-
"sdk/unity/v2-to-v3-upgrade-guide"
527+
{
528+
"group": "Advanced",
529+
"pages": [
530+
"sdk/unity/advanced/recovering-sessions",
531+
"sdk/unity/advanced/deploy-contracts",
532+
"sdk/unity/advanced/introduction",
533+
"sdk/unity/advanced/wallets",
534+
"sdk/unity/advanced/clients",
535+
"sdk/unity/advanced/transfers",
536+
"sdk/unity/advanced/contracts",
537+
"sdk/unity/advanced/tokens"
538+
]
539+
}
537540
]
538541
},
539542
{
540543
"group": "Unreal",
541544
"pages": [
542545
"sdk/unreal/overview",
543546
"sdk/unreal/installation",
544-
"sdk/unreal/getting_started",
545-
"sdk/unreal/bootstrap_game",
546-
"sdk/unreal/migration",
547+
"sdk/unreal/bootstrap",
547548
{
548-
"group": "Guides",
549+
"group": "Wallets",
549550
"pages": [
550-
"sdk/unreal/guides/social-signin-guide",
551-
"sdk/unreal/guides/epic-auth-guide",
552-
"sdk/unreal/guides/marketplace-guide",
553-
"sdk/unreal/guides/swaps-guide"
554-
]
555-
},
556-
{
557-
"group": "Ecosystem Wallet",
558-
"pages": [
559-
"sdk/unreal/ecosystem-wallet/setup",
560-
"sdk/unreal/ecosystem-wallet/authentication",
561-
"sdk/unreal/ecosystem-wallet/permissions",
562-
"sdk/unreal/ecosystem-wallet/manage-sessions",
563-
"sdk/unreal/ecosystem-wallet/blockchain"
564-
]
565-
},
566-
{
567-
"group": "Onboarding",
568-
"pages": [
569-
"sdk/unreal/onboarding/authentication",
570-
"sdk/unreal/onboarding/manage_sessions",
571-
"sdk/unreal/onboarding/wallet_linking"
551+
{
552+
"group": "Ecosystem Wallet",
553+
"pages": [
554+
"sdk/unreal/wallets/ecosystem-wallet/setup",
555+
"sdk/unreal/wallets/ecosystem-wallet/authentication",
556+
"sdk/unreal/wallets/ecosystem-wallet/permissions",
557+
"sdk/unreal/wallets/ecosystem-wallet/manage-sessions",
558+
"sdk/unreal/wallets/ecosystem-wallet/blockchain-interactions"
559+
]
560+
},
561+
{
562+
"group": "Embedded Wallet",
563+
"pages": [
564+
"sdk/unreal/wallets/embedded-wallet/setup",
565+
"sdk/unreal/wallets/embedded-wallet/blockchain-interactions",
566+
{
567+
"group": "Guides",
568+
"pages": [
569+
"sdk/unreal/wallets/embedded-wallet/guides/social-signin-guide",
570+
"sdk/unreal/wallets/embedded-wallet/guides/epic-auth-guide",
571+
"sdk/unreal/wallets/embedded-wallet/guides/marketplace-guide",
572+
"sdk/unreal/wallets/embedded-wallet/guides/swaps-guide"
573+
]
574+
},
575+
{
576+
"group": "Onboarding",
577+
"pages": [
578+
"sdk/unreal/wallets/embedded-wallet/onboarding/authentication",
579+
"sdk/unreal/wallets/embedded-wallet/onboarding/manage_sessions",
580+
"sdk/unreal/wallets/embedded-wallet/onboarding/wallet_linking"
581+
]
582+
}
583+
]
584+
}
572585
]
573586
},
574587
{
575-
"group": "Power",
588+
"group": "Indexer",
576589
"pages": [
577-
"sdk/unreal/power/write-to-blockchain",
578-
"sdk/unreal/power/read-from-blockchain",
579-
"sdk/unreal/power/smart-contracts"
590+
"sdk/unreal/indexer/read-from-blockchain"
580591
]
581592
},
582593
{
@@ -591,6 +602,7 @@
591602
{
592603
"group": "Advanced",
593604
"pages": [
605+
"sdk/unreal/advanced/smart-contracts",
594606
"sdk/unreal/advanced/utilities",
595607
"sdk/unreal/advanced/advanced",
596608
"sdk/unreal/advanced/platforms"
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
---
2+
title: Creando juegos con muchas transacciones en Unity
3+
description: Algunos juegos guardan el estado del juego con frecuencia. Cuando se trabaja con blockchain, esto puede ser costoso y generar mucha latencia. Esta guía aborda cómo superar estas limitaciones sin afectar la experiencia del usuario final ni incrementar innecesariamente sus gastos operativos.
4+
sidebarTitle: Creando juegos con muchas transacciones en Unity
5+
---
6+
7+
## Introducción
8+
A diferencia de otras bases de datos, cada escritura en una blockchain (transacción) tiene un costo en forma de [comisiones de gas](https://ethereum.org/en/developers/docs/gas/). Al crear juegos blockchain/web3, es importante considerar estas comisiones. Aunque [el patrocinio de gas de Sequence](/solutions/builder/gas-sponsorship) simplifica gran parte de la complejidad para sus usuarios finales, como desarrollador de juegos aún debe tener en cuenta algunos aspectos relacionados con las comisiones de gas.
9+
10+
<Tip>
11+
Al crear su juego, debe considerar la **_frecuencia_** con la que envía transacciones a la blockchain para mantener los costos de ejecución al mínimo.
12+
</Tip>
13+
14+
Una complejidad adicional de trabajar con blockchain, que no existe en todos los sistemas de almacenamiento de datos, es que escribir en la base de datos blockchain (es decir, hacer una transacción) es una operación asíncrona y no instantánea que requiere conexión de red.
15+
16+
<Warning>
17+
Las transacciones pueden fallar por varias razones: sin internet, fondos insuficientes, etc.
18+
</Warning>
19+
20+
Primero, debe considerar qué propiedades tokenizables (por ejemplo, objetos, potenciadores, desbloqueos, etc.) deberían tokenizarse en la blockchain.
21+
22+
Luego, piense en los "tipos" de transacciones que su juego realizará. Probablemente pueda agrupar las transacciones en diferentes categorías. Por ejemplo, algunas de estas categorías pueden incluir: recogidas (como recolectar monedas), creación, intercambio, venta, compra, etc.
23+
24+
Una vez que haya categorizado cada una de sus transacciones, considere las expectativas de sus usuarios finales sobre esas transacciones, así como sus propias expectativas como desarrollador. ¿Cuánta demora es aceptable desde la perspectiva del usuario para que una transacción se procese? ¿Puede asumir que una transacción tendrá éxito para dar retroalimentación instantánea al usuario y, si es así, puede recuperarse en caso de que una transacción falle sin afectar negativamente al jugador o a su negocio?
25+
26+
El autor de esta guía suele clasificar las transacciones como de alto valor o bajo valor.
27+
28+
**Las transacciones de alto valor** normalmente requieren confirmación antes de brindar retroalimentación al usuario final. Las transacciones pueden fallar por varias razones (sin internet, gas insuficiente, supuestos inválidos, etc.). Si asumimos que una transacción de alto valor será exitosa y damos retroalimentación inmediata al usuario, pero luego la transacción falla, no podremos recuperarnos sin afectar negativamente al usuario o a nuestro negocio. Considere, por ejemplo, una tienda dentro del juego. Si la transacción de "comprar espada" de un usuario falla, tendríamos que revocar la espada de su cuenta (afectando la experiencia del jugador) o perder el ingreso de la venta (afectando el resultado financiero). Por suerte, la mayoría de las transacciones de alto valor coinciden con actividades donde los usuarios ya están acostumbrados a esperar un poco en juegos tradicionales (no blockchain), como tiendas, creación de objetos, mejoras, etc.
29+
30+
**Las transacciones de bajo valor** pueden, y a menudo deberían, brindar retroalimentación inmediata al usuario. No es necesario esperar la confirmación de la transacción antes de mostrar la retroalimentación en el juego. Si la transacción falla, normalmente podemos recuperarnos fácilmente sin afectar la experiencia del jugador ni el negocio. Los jugadores suelen estar acostumbrados a recibir retroalimentación instantánea para estas acciones en juegos tradicionales. Por ejemplo: cuando un usuario recoge una moneda en un juego de plataformas (o similar), espera ver reflejada la moneda recolectada en la interfaz de inmediato. Es poco probable que el jugador recuerde el total exacto de monedas en la siguiente sesión y/o es poco probable que esto afecte al desarrollador si almacena localmente las monedas recolectadas y reenvía la transacción cuando se resuelvan los problemas de red (o similar).
31+
32+
Por último, debe considerar con qué frecuencia su juego realiza transacciones. En algunos juegos, el usuario realiza muchas acciones que afectan el estado del juego en poco tiempo. Imagine enviar una transacción a la blockchain cada vez que Mario recoge una moneda... Los costos se volverían rápidamente prohibitivos, ¡agrupa esas transacciones de bajo valor!
33+
34+
## ¿Cómo implementar esto con Unity?
35+
Primero, querrá construir un caché local de lo que el usuario tiene en la blockchain. Esto es bastante sencillo: simplemente [lea desde la blockchain](/sdk/unity/indexer/read-from-blockchain) y almacene localmente los balances de tokens del usuario en el formato que le resulte más conveniente. Si está adaptando un juego o prototipo existente que usaba un sistema de almacenamiento local (como PlayerPrefs) o un sistema de almacenamiento remoto (como un [RDBMS](https://en.wikipedia.org/wiki/List_of_relational_database_management_systems)), probablemente ya tenga implementado un caché local y solo necesite crear un adaptador.
36+
37+
Luego, probablemente querrá aprovechar el `TransactionQueuer` y sus herederos que ofrece el Unity SDK. Los `TransactionQueuer` son altamente configurables y están diseñados para facilitar el desarrollo de juegos donde los jugadores realizan muchas acciones que modifican el estado. Por ejemplo, si su juego implica recolectar muchas monedas (o similares) como transacciones de bajo valor, probablemente le convenga usar el `PermissionedMinterTransactionQueuer` (asumiendo que su función de `mint` tiene permisos, que es lo predeterminado, y está minteando desde un servidor) o el `SequenceWalletTransactionQueuer` (si cualquiera puede mintear). Con estos, puede simplemente poner en cola varias transacciones; estas transacciones se combinarán automáticamente si es posible (por ejemplo, en vez de tener 'mint(amount: 5, tokenId: 11)' y 'mint(amount: 3, tokenId: 11)', se combinarían en 'mint(amount: 8, tokenId: 11)'). Luego, puede hacer que sus transacciones se envíen cada x segundos o cuando se realice una llamada a función, pero no antes de cada y segundos (esto se puede modificar para transacciones de alto valor), etc. Para obtener más información sobre cómo trabajar con el `TransactionQueuer`, consulte [este documento](/sdk/unity/wallets/embedded-wallet/blockchain-interactions#transaction-queuers).
38+
39+
Por último, debe verificar si sus transacciones fallan y manejar los errores de manera adecuada.
40+
41+
```csharp
42+
if (transactionReturn is FailedTransactionReturn) {
43+
// Handle the failed transaction
44+
}
45+
```
46+
47+
## Ejemplo
48+
Para ver un ejemplo de estos conceptos en acción en nuestro Unity SDK, consulte nuestra [Guía de Jelly Forest](/guides/jelly-forest-unity-guide#5-mint-in-game-tokens-to-the-players-inventory) y [código de ejemplo](https://github.com/0xsequence/sequence-unity-demo/tree/master/Scripts).

0 commit comments

Comments
 (0)