Pag-port ng isang programa sa Unity
Kapag nakapagsulat ka na ng solana program ay baka gusto mo na itong gamitin sa Unity Game engine. Sa kabutihang palad mayroong isang code generator na nagbibigay-daan sa iyo na mag-port ng isang anchor idl (isang representasyon ng json ng isang solana program) sa C#
Pagbuo ng Kliyente
Kapag gumagamit ng Anchor makakabuo ka ng isang IDL file na isang representasyon ng JSON ng iyong programa. Gamit ang IDL na ito maaari kang makabuo ng iba't ibang mga kliyente. Halimbawa JS o C# sa Unity.
IDL to C# Converter
Ang dalawang linyang ito ay bubuo ng isang C# client para sa laro.
dotnet tool install Solana.Unity.Anchor.Tool
dotnet anchorgen -i idl/file.json -o src/ProgramCode.cs
Ito ay bubuo sa iyo ng isang C# na representasyon ng iyong programa, na nagbibigay-daan sa iyong deserialize ang data at madaling gumawa ng mga instruction sa programa.
Pagbuo ng Transaksyon sa Unity C#
Sa loob ng Unity game engine, magagamit natin ang Solana Unity SDK upang makipag-ugnayan sa programa.
Una nating mahanap ang nasa chain address ng game data account na may TryFindProgramAddress. Kailangan nating ipasa ang account na ito sa transaksyon para malaman ng Solana runtime na gusto nating baguhin ang account na ito.
Susunod na ginagamit namin ang nabuong kliyente upang lumikha ng MoveRight na pagtuturo.
Pagkatapos ay humiling kami ng block hash mula sa isang RPC node. Ito ay kinakailangan upang malaman ni Solana kung gaano katagal ang magiging bisa ng transaksyon.
Susunod na itinakda namin ang nagbabayad ng bayad upang maging wallet ng mga manlalaro.
Pagkatapos ay idinagdag namin ang paglipat ng tamang pagtuturo sa Transaksyon. Maaari din kaming magdagdag ng maraming instruction sa isang solong transaksyon kung kinakailangan.
Pagkatapos ang transaksyon ay mapirmahan at pagkatapos ay ipadala sa RPC node para sa pagproseso. May iba't ibang antas ng Commitment ang Solana. Kung itatakda namin ang antas ng pangako sa Nakumpirma, makukuha na namin ang bagong estado sa loob ng susunod na 500ms.
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);
}