unity-sdk
unity-sdk copied to clipboard
Best in class web3 SDK for Unity games
Documentation
See full documentation on the thirdweb portal.
Technical Demo
Try out our multichain game that leverages Embedded and Smart Wallets to create seamless experiences, built in 3 weeks - Web3 Warriors.
Supported Platforms & Wallets
Build games for WebGL, Desktop and Mobile using 1000+ supported chains, with various login options!
| Wallet Provider | WebGL | Desktop | Mobile |
|---|---|---|---|
| In-App Wallet (Email, Social, Phone) | ✔️ | ✔️ | ✔️ |
| Local Wallet (Guest Mode) | ✔️ | ✔️ | ✔️ |
| Wallet Connect | ✔️ | ✔️ | ✔️ |
| MetaMask | ✔️ | ✔️ | ✔️ |
| Rabby | ✔️ | — | — |
| Coinbase | ✔️ | ❌ | ❌ |
| Smart Wallet (ERC4337) | ✔️ | ✔️ | ✔️ |
| Injected | ✔️ | — | — |
| HyperPlay | — | ✔️ | — |
✔️ Supported ❌ Not Supported — Not Applicable
Getting Started
Head over to the releases page and download the latest .unitypackage file.
Follow our Getting Started Guide.
All you need is a ThirdwebManager prefab in your scene to interact with the SDK from anywhere!
Various blockchain interaction examples are available in our Scene_Prefabs scene.
Payment related interaction examples are available in our Scene_Pay scene.
Notes:
- The SDK has been tested on Web, Desktop and Mobile platforms using Unity 2021 and 2022 LTS. We highly recommend using 2022 LTS.
- The example scenes are built using Unity 2022 LTS, it may look off in previous versions of Unity.
- The Newtonsoft DLL is included as part of the Unity Package, feel free to deselect it if you already have it installed as a dependency to avoid conflicts.
- If using .NET Framework and encountering an error related to HttpUtility, create a file
csc.rspthat includes-r:System.Web.dlland save it underAssets. - If you have conflicting DLLs from other SDKs, in most cases our SDK will be compatible with previous versions, use version control and test removing duplicates.
Usage
In order to access the SDK, you only need to have a ThirdwebManager in your scene.
// Configure the connection
var connection = new WalletConnection(
provider: WalletProvider.EmbeddedWallet, // The wallet provider you want to connect to (Required)
chainId: 5, // The chain you want to connect to (Required)
email: "[email protected]" // The email you want to authenticate with (Required for this provider)
);
// Connect the wallet
string address = await ThirdwebManager.Instance.SDK.Wallet.Connect(connection);
// Interact with the wallet
CurrencyValue balance = await ThirdwebManager.Instance.SDK.Wallet.GetBalance();
var signature = await ThirdwebManager.Instance.SDK.Wallet.Sign("message to sign");
// Get an instance of a deployed contract (no ABI required!)
var contract = ThirdwebManager.Instance.SDK.GetContract("0x...");
// Fetch data from any ERC20/721/1155 or Marketplace contract
CurrencyValue currencyValue = await contract.ERC20.TotalSupply();
NFT erc721NFT = await contract.ERC721.Get(tokenId);
List<NFT> erc1155NFTs = await contract.ERC1155.GetAll();
List<Listing> listings = await contract.Marketplace.DirectListings.GetAllListings();
// Execute transactions from the connected wallet
await contract.ERC20.Mint("1.2");
await contract.ERC721.Signature.Mint(signedPayload);
await contract.ERC1155.Claim(tokenId, quantity);
await contract.Marketplace.DirectListings.BuyListing(listingId, quantity);
// Custom interactions
var res = await contract.Read<string>("myReadFunction", arg1, arg2, ...);
var txRes = await contract.Write("myWriteFunction", arg1, arg2, ...);
Build Instructions
General
- Use
Smaller (faster) Buildsin the Build Settings (IL2CPP Code Generation in Unity 2022). - Use IL2CPP over Mono when possible in the Player Settings.
- Using the SDK in the editor (pressing Play) is an accurate reflection of what you can expect to see on native platforms.
- In most cases, setting
Managed Stripping Levelto minimal when using IL2CPP is also helpful - you can find it underPlayer Settings>Other Settings>Optimization
WebGL
- In order to communicate with the SDK on WebGL, you need to
Build and runyour project so it runs in a browser context. - Open your
Build settings, selectWebGLas the target platform. - Open
Player settings>Resolution and Presentationand underWebGLTemplatechooseThirdweb. - Save and click
Build and Runto test out your game in a browser.
Important: If you're uploading your build, set Compression Format to Disabled in Player Settings > Publishing Settings.
Please note that Embedded Wallets (OAuth version) may not work when testing locally using Unity's default Build and Run feature for WebGL.
You must host the build or run it locally yourself after adding the Cross-Origin-Opener-Policy header and setting it to same-origin-allow-popups.
Here's a simple way to do so, assuming you are in your WebGL build output folder:
const express = require('express');
const app = express();
const port = 8000;
app.use(function(req, res, next) {
res.header('Cross-Origin-Opener-Policy', 'same-origin-allow-popups');
next();
});
app.use(express.static('.'));
app.listen(port, () => console.log(`Server running on http://localhost:${port}`));
Once again, please note that no action is needed for hosted builds.
Mobile
- For Android, it is best to run Force Resolve from the
Assetsmenu >External Dependency Manager>Android Resolver>Force Resolvebefore building your game. - For iOS, if you are missing a MetaMask package, you can double click on
main.unitypackageunderAssets\Thirdweb\Plugins\MetaMask\Installer\Packagesand reimport theiOSfolder (only). - ~~If you are having trouble building in XCode, make sure
ENABLE_BITCODEis disabled and that theEmbedded Frameworksin yourBuild Phasescontain potentially missing frameworks likeMetaMaskorStarscream. You may also need to remove theThirdweb/Core/Plugins/MetaMask/Plugins/iOS/iphoneos/MetaMask_iOS.framework/Frameworksfolder in some cases.~~ Recent versions should no longer require this.
Miscellaneous
If you don't want to use Minimal Stripping, you could instead create a link.xml file under your Assets folder and include assemblies that must be preserved, for instance:
<linker>
<!--Thirdweb-->
<assembly fullname="Amazon.Extensions.CognitoAuthentication" preserve="all" />
<assembly fullname="AWSSDK.CognitoIdentity" preserve="all" />
<assembly fullname="AWSSDK.CognitoIdentityProvider" preserve="all" />
<assembly fullname="AWSSDK.Core" preserve="all" />
<assembly fullname="AWSSDK.Lambda" preserve="all" />
<assembly fullname="AWSSDK.SecurityToken" preserve="all" />
<assembly fullname="embedded-wallet" preserve="all" />
<!--Other-->
<assembly fullname="System.Runtime.Serialization" preserve="all" />
<assembly fullname="Newtonsoft.Json" preserve="all" />
<assembly fullname="System" preserve="all">
<type fullname="System.ComponentModel.TypeConverter" preserve="all" />
<type fullname="System.ComponentModel.ArrayConverter" preserve="all" />
<type fullname="System.ComponentModel.BaseNumberConverter" preserve="all" />
<type fullname="System.ComponentModel.BooleanConverter" preserve="all" />
<type fullname="System.ComponentModel.ByteConverter" preserve="all" />
<type fullname="System.ComponentModel.CharConverter" preserve="all" />
<type fullname="System.ComponentModel.CollectionConverter" preserve="all" />
<type fullname="System.ComponentModel.ComponentConverter" preserve="all" />
<type fullname="System.ComponentModel.CultureInfoConverter" preserve="all" />
<type fullname="System.ComponentModel.DateTimeConverter" preserve="all" />
<type fullname="System.ComponentModel.DecimalConverter" preserve="all" />
<type fullname="System.ComponentModel.DoubleConverter" preserve="all" />
<type fullname="System.ComponentModel.EnumConverter" preserve="all" />
<type fullname="System.ComponentModel.ExpandableObjectConverter" preserve="all" />
<type fullname="System.ComponentModel.Int16Converter" preserve="all" />
<type fullname="System.ComponentModel.Int32Converter" preserve="all" />
<type fullname="System.ComponentModel.Int64Converter" preserve="all" />
<type fullname="System.ComponentModel.NullableConverter" preserve="all" />
<type fullname="System.ComponentModel.SByteConverter" preserve="all" />
<type fullname="System.ComponentModel.SingleConverter" preserve="all" />
<type fullname="System.ComponentModel.StringConverter" preserve="all" />
<type fullname="System.ComponentModel.TimeSpanConverter" preserve="all" />
<type fullname="System.ComponentModel.UInt16Converter" preserve="all" />
<type fullname="System.ComponentModel.UInt32Converter" preserve="all" />
<type fullname="System.ComponentModel.UInt64Converter" preserve="all" />
</assembly>
<assembly fullname="Nethereum.ABI" preserve="all" />
<assembly fullname="Nethereum.Accounts" preserve="all" />
<assembly fullname="Nethereum.BlockchainProcessing" preserve="all" />
<assembly fullname="Nethereum.Contracts" preserve="all" />
<assembly fullname="Nethereum.HdWallet" preserve="all" />
<assembly fullname="Nethereum.Hex" preserve="all" />
<assembly fullname="Nethereum.JsonRpc.Client" preserve="all" />
<assembly fullname="Nethereum.JsonRpc.RpcClient" preserve="all" />
<assembly fullname="Nethereum.Keystore" preserve="all" />
<assembly fullname="Nethereum.Merkle" preserve="all" />
<assembly fullname="Nethereum.Merkle.Patricia" preserve="all" />
<assembly fullname="Nethereum.Model" preserve="all" />
<assembly fullname="Nethereum.RLP" preserve=" all" />
<assembly fullname="Nethereum.RPC" preserve=" all" />
<assembly fullname="Nethereum.Signer" preserve=" all" />
<assembly fullname="Nethereum.Signer.EIP712" preserve=" all" />
<assembly fullname="Nethereum.Siwe" preserve=" all" />
<assembly fullname="Nethereum.Siwe.Core" preserve=" all" />
<assembly fullname="Nethereum.Util" preserve=" all" />
<assembly fullname="Nethereum.Web3" preserve=" all" />
</linker>
Additional Links
- Documentation
- Starter Template: Take Flight!
- Starter Template: Blockventure
- Example Template: Enhancing Unity IAP with Blockchain Interactions
- Example Template: Pioneer
- Separate, Standalone .NET SDK
Prefab Examples
The Examples folder contains a demo scene Scene_Prefabs using our user-friendly prefabs - they include script examples to get inspired and are entirely optional. You do not need to use any of them to recreate their functionality. We recommend creating your own UI once you are familiar with the SDK.
All Prefabs require the ThirdwebManager prefab to get the SDK Instance, drag and drop it into your scene and select the networks you want to support from the Inspector.
Connect Wallet - All-in-one drag & drop wallet supporting multiple wallet providers, network switching, balance displaying and more!
- Drag and drop it into your scene.
- Set up the networks you want to support from the ThirdwebManager prefab.
- You can add listeners from the inspector for various wallet events.
NFT Loader - Standalone drag & drop grid/scroll view of NFTs you ask it to display!
- Go to the prefab's Settings in the Inspector.
- Load specific NFTs with token ID.
- Load a specific range of NFTs.
- Load NFTs owned by a specific wallet.
- Or any combination of the above - they will all be displayed automatically in a grid view with vertical scroll!
- Customize the prefab's ScrollView and Content gameobjects if you want your content to behave differently.
NFT - Displays an NFT by calling LoadNFT through script!
- Instantiate this Prefab through script.
- Get its Prefab_NFT component.
- Call the LoadNFT function and pass it your NFT struct to display your fetched NFT's images automatically.
- Customize the prefab to add text/decorations and customize LoadNFT to use your NFT's metadata if you want to populate that text.
NFT nft = await contract.ERC721.Get(0);
Prefab_NFT nftPrefabScript = Instantiate(nftPrefab);
nftPrefabScript.LoadNFT(nft);
Events - Fetch and manipulate Contract Events with a simple API!
- Get specific events from any contract.
- Get all events from any contract.
- Event listener support with callback actions.
- Optional query filters.
Reading - Reading from a contract!
- Fetch ERC20 Token(s).
- Fetch ERC721 NFT(s).
- Fetch ERC1155 NFT(s).
- Fetch Marketplace Listing(s).
- Fetch Pack contents.
Writing - Writing to a contract!
- Mint ERC20 Token(s).
- Mint ERC721 NFT(s).
- Mint ERC1155 NFT(s).
- Buy Marketplace Listing(s).
- Buy a Pack.
Miscellaneous - More examples!
- Get (Native) Balance.
- Custom Contract Read/Write Calls.
- Authentication.
- Message Signing.
- Adding admins to your smart wallet.
- Removing admins from your smart wallet.
- Creating session keys to grant temporary/restricted access to additional signers.
See full documentation on the thirdweb portal.
Contributing to thirdweb Unity SDK
We warmly welcome contributions to the thirdweb Unity SDK! If you're looking to contribute, here's how you can get started.
How to Contribute
- Fork the Repository: Click the "Fork" button at the top right of this page to create your own copy of the repository.
- Clone Your Fork: Clone your fork to your local machine for development.
- Create a Feature Branch: Make a new branch for your changes. This helps keep contributions organized.
- Make Your Changes: Work on your changes. Make sure they are well-tested and don't break existing functionality.
- Commit Your Changes: Commit your changes with a clear and descriptive commit message.
- Push to Your Fork: Push your changes to your forked repository.
- Submit a Pull Request: From your fork, submit a pull request to our main repository. Provide a clear description of your changes and any relevant issue numbers.
Notes:
- For WebGL-specific contributions, you may contribute to our JS package as well. The bulk of WebGL-specific behavior goes through its Unity bridge.
- For new Wallet Provider contributions, see our guide to Submit your Wallet.
Guidelines
- Keep It Simple: Try to keep your contributions small and simple. This makes them easier to review and merge.
- Supported Platforms: Make sure your changes work on either WebGL only, Native platforms only, or both. A good test is to build
Scene_Prefabsto test your changes there. - Test Your Code: Ensure your code works as expected and doesn't introduce new issues.
- Be Respectful: When discussing changes, always be respectful and constructive.
Need Help?
If you're unsure about something or need help, feel free to reach out to us on Discord.
Thank you for contributing to the thirdweb Unity SDK!