🤖

 thirdwebを使って、Unity上でNFTを取得してみよう

2023/01/02に公開

こんにちは、CryptoGamesのユウキです。

本日は、UnityでNFTを取得する方法を書いていきます。

当記事は、下の記事の続きになります。
https://zenn.dev/yuki2020/articles/2093d6573202ea

なお、使用したコードはページの最後に貼っています。

0. はじめに

まずは、thirdwebで下のような「NFT Drop」を作成します。

やり方が不明の場合は、こちらのハンズオンをご参照ください。

https://www.youtube.com/watch?v=951rbH51kLM

1. パーツを作成する

下のように、テキストとボタンを追加しました。

なお、やり方がご不明な場合は、こちらの第5章をご参照ください。
https://zenn.dev/yuki2020/articles/2093d6573202ea

2. スクリプトを作成する

では、下のスクリプトをダブルクリックして、スクリプトを作っていきましょう。

1) 変数を作成する

まずは、共通で扱う、ウォレットアドレスとコントラクトアドレスの変数を作成します。

それに伴い、「ConnectWallet」関数内の「address」も下のように変更しました。

2) NFTをカウントする関数を作成する

保持しているNFTの個数を表示する関数を作成します。

下のように、「BalanceOf」関数を使っています。

なお、どのような関数を使えば良いかは、ThirdwebのHPを確認するのが良いと思います。

下のように、「Unity」で確認しましょう。


https://portal.thirdweb.com/sdk/interacting-with-contracts/erc721#view-nft-balance

そして、下のように、第1章で作成した「Count」に代入します。

3) NFTをカウントする関数を自動更新にさせる

上で作成した、関数を、下のように、「Update」関数に入れます。

これにより、自動更新ができるようになりました。

4) NFTを取得する関数を作成する

続いて、NFTを取得する関数を次のように書きます。

こちらも、どうすれば取得できるのかは、公式で書き方を確認できます。


https://portal.thirdweb.com/sdk/interacting-with-contracts/erc721claimable

関数が設定できたので、下のように、ボタンを押したときに、この関数が呼ばれるように設定を行います。

この部分についてやり方が不明な場合は、こちらの第8章をご確認ください。
https://zenn.dev/yuki2020/articles/2093d6573202ea

3. 実行して、確認する

では、スクリプトができたので確認していきましょう。

この部分についてやり方が不明な場合は、こちらの第9・10章をご確認ください。
https://zenn.dev/yuki2020/articles/2093d6573202ea

このように画面が表示されました。

「Connect Wallet」ボタンを押して、ウォレット接続を行うと、このように、ウォレットアドレスとNFTの所持数が表示されました。

さらに、「GetNFT」ボタンを押して、メタマスクなどの処理を進めると、このように、NFTの所持数が増えました。

今回は以上です。

ぜひやってみてください。

以下、使用したコードです。

using UnityEngine;
using Thirdweb;
using TMPro;
using System.Collections.Generic;
using System.Threading.Tasks;

public class StartMenuManager : MonoBehaviour
{
    public GameObject ConnectedState;
    public GameObject DisconnectedState;

    private ThirdwebSDK sdk;
    private string address;
    private string contractAddress = "0xbfC9A3e0E79A6A28344Af7afFAeD704D6EeC8df4";

    void Start()
    {
        sdk = new ThirdwebSDK("goerli");
    }

    void Update(){
        CountNFT();
    }

    public async void ConnectWallet()
    {
        // Connect to the wallet
        address = await sdk.wallet.Connect();
                
        // Disable disconnected state
        DisconnectedState.SetActive(false);

        // Enable connected state
        ConnectedState.SetActive(true);

        // Set the ConnectedStates "Address" GameObjects text to the wallet address
        ConnectedState
            .transform
            .Find("Address")
            .GetComponent<TMPro.TextMeshProUGUI>()
            .text = address;
    }

    public async void CountNFT() {
        var contract = sdk.GetContract(contractAddress);

        var balance = await contract.ERC721.BalanceOf(address);

        var text = "NFT balance: " + balance;

        ConnectedState
            .transform
            .Find("Count")
            .GetComponent<TMPro.TextMeshProUGUI>()
            .text = text;
    }

    public async void GetNFT() {

        var contract = sdk.GetContract(contractAddress);

        var quantity = 1; // how many unique NFTs you want to claim

        var tx = await contract.ERC721.ClaimTo(address, quantity);
    }

}

Discussion