Ana içeriğe geç

Unity'ye Anchor Taşıma

Eğer bir Solana programı yazdıysanız, bunu bir Anchor IDL'yi (Solana programının JSON temsili) C#'a dönüştüren bir kod jeneratörü kullanarak Unity oyun motorunda kullanabilirsiniz.

İstemci Oluşturma

Anchor kullanırken programınızın JSON temsilini oluşturan bir IDL dosyası oluşturabileceksiniz. Bu IDL ile farklı istemciler oluşturabilirsiniz. Örneğin, JavaScript veya Unity için C#.

ipucu

IDL'den C#'a dönüşüm için kullanabileceğiniz en iyi araçlardan biridir.

IDL'den C#'a Dönüştürücü

Bu iki satır, oyun için bir C# istemcisi oluşturacaktır.

dotnet tool install Solana.Unity.Anchor.Tool
dotnet anchorgen -i idl/file.json -o src/ProgramCode.cs

Bu, programınızın C# temsiline sahip olmanızı sağlayacak; veriyi serileştirmek ve programa kolayca talimatlar oluşturmak için kullanabileceksiniz.

Unity C#'da İşlemi Oluşturma

Unity oyun motorunda, programa etkileşimde bulunmak için Solana Unity SDK'yı kullanabiliriz.

  1. Öncelikle, oyunun veri hesabının onchain adresini TryFindProgramAddress ile buluyoruz. Bu hesabı işleme geçmemiz gerekiyor, böylece Solana çalışma zamanı bu hesabı değiştirmek istediğimizi bilir.
  2. Sonra, oluşturulan istemciyi kullanarak bir MoveRight talimatı oluşturuyoruz.
  3. Daha sonra, bir RPC düğümünden bir blok hash isteğinde bulunuyoruz. Bu, Solana'nın işlemin ne kadar süre geçerli olacağını bilmesi için gereklidir.
  4. Ardından, ücret ödeyen kişiyi oyuncunun cüzdanı olacak şekilde ayarlıyoruz.
  5. Daha sonra, işlemi MoveRight talimatını ekliyoruz. Gerekirse tek bir işleme birden fazla talimat da ekleyebiliriz.
  6. Daha sonra işlem imzalanır ve işlenmesi için RPC düğümüne gönderilir. Solana'nın farklı Taahhüt seviyeleri vardır. Taahhüt seviyesini Onaylı olarak ayarlarsak, bir sonraki 500 ms içinde yeni durumu alabiliriz.
bilgi

Bir Anchor programı ile etkileşimde bulunan bir Unity oyununun tam örneğini Solana Oyun Preseti'nde bulabilirsiniz.

  1. Unity İstemcisi
public async void MoveRight()
{
PublicKey.TryFindProgramAddress(new[]
{
Encoding.UTF8.GetBytes("level1")
},
ProgramId, out gameDataAccount, out var bump);

MoveRightAccounts account = new MoveRightAccounts();
account.GameDataAccount = gameDataAccount;
TransactionInstruction moveRightInstruction = TinyAdventureProgram.MoveRight(account, ProgramId);

var walletHolderService = ServiceFactory.Resolve<WalletHolderService>();
var result = await walletHolderService.BaseWallet.ActiveRpcClient.GetRecentBlockHashAsync(Commitment.Confirmed);

Transaction transaction = new Transaction();
transaction.FeePayer = walletHolderService.BaseWallet.Account.PublicKey;
transaction.RecentBlockHash = result.Result.Value.Blockhash;
transaction.Signatures = new List<SignaturePubKeyPair>();
transaction.Instructions = new List<TransactionInstruction>();
transaction.Instructions.Add(moveRightInstruction);

Transaction signedTransaction = await walletHolderService.BaseWallet.SignTransaction(transaction);

RequestResult<string> signature = await walletHolderService.BaseWallet.ActiveRpcClient.SendTransactionAsync(
Convert.ToBase64String(signedTransaction.Serialize()),
true, Commitment.Confirmed);
}

Bir Anchor programı ile etkileşimde bulunan bir Unity oyununun tam örneğini Solana Oyun Preseti'nde bulabilirsiniz, bu gönderi burada bulunmaktadır.