Xamarin アプリから Minecraft にコマンドを投げよう
以前、マイクラ自動化でC#からRCON経由でマイクラのコマンドを投げられることを確認しました。同じC#ならばプラットフォームが異なってもできるのでは?というノリでXamarinアプリを作ってみたら意外といけました。
youtube では Androidエミュレータ で動かしていますが、この記事ではいろんな環境で試したいと思います。
1. 全体図
ざっと全体図です。
マイクラサーバをPC上に立てて、実機と同じネットワークアドレスに所属させます。ホスト部をPCに指定してコマンドを送信すれば、スマホ (Xamarin) からコマンドを送信できるので遠隔操作ができるようになります。エミュレータの場合はPC上で動いているので直接ホストのIPを指定して接続する形になります。
2. プロジェクトの作成
Visual Studio にて Xamarin.Forms
を選択します。
テンプレートは空白で大丈夫です。開発対象は自分のやりたい環境を選択してください。
起動までに少し時間がかかります。
3. 画面デザイン(XAML)
適当にデザインを書いていきます。初めてやる人はファイルが結構あって混乱すると思いますが、プロジェクト名直下にある MainPage.xaml
(画像の青い部分) を選択します。
必要なパラメータはIPアドレスとコマンドなので、この2つは Entry コントロールとして配置します。あとはログを受け取るためのラベルなどを貼っていきます。
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="XamarinMC.MainPage"> <StackLayout> <Frame BackgroundColor="#2196F3" Padding="24" CornerRadius="0"> <Label Text="Minecraft with Xamarin" HorizontalTextAlignment="Center" TextColor="White" FontSize="20"/> </Frame> <Label Margin="20, 0" Text="Your IP address" FontSize="18"/> <Entry Margin="20, 0" x:Name="your_ip" FontSize="16"/> <Label Margin="20, 0" Text="Command here" FontSize="18"/> <Entry Margin="20, 0" x:Name="command" FontSize="16"/> <Button Margin="20, 0" Text="send" Clicked="Button_Clicked"/> <Label Margin="20, 10" Text="Server log here." FontSize="12" x:Name="Loglabel"/> </StackLayout> </ContentPage>
4. CoreRCON の導入
タブから プロジェクト
の中にある Nuget パッケージの管理
を開きます。
参照
タブをクリックして、検索欄に CoreRCON
と入力すると先頭に出てくると思います。
これを選択し、バージョンを 5.0.0 にして インストール
をクリック してください。(3.0.0 でやってみましたが上手くいきませんでした。)
ソリューションエクスプローラ―の 依存関係 / パッケージ
の中に CoreRCON 5.0.0
が入っていれば導入完了です。
5. コードビハインド (C#)
Mainpage.xaml
の三角ボタンをクリックすると、MainPage.xaml.cs
という C# のソースコードが入っているので開きます。
クラスは分けますが同一ファイル内にまとめて書いてしまいます。クラス名やメソッド名はお任せします。
using CoreRCON; using System; using System.Net; using System.Threading.Tasks; using Xamarin.Forms; namespace XamarinForMinecraft { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } private async void Button_Clicked (object sender, EventArgs e) { MinecraftCommand mc = new MinecraftCommand(); await mc.Execute(your_ip.Text, command.Text); Loglabel.Text = $"{System.DateTime.Now} \n {mc.logMessage}"; } } public partial class MinecraftCommand { public string logMessage; public async Task Execute(string ipAddress, string mcCommand) { await CommandSend(ipAddress, mcCommand); } private async Task CommandSend(string ipAddress, string mcCommand) { try { var serveraddress = IPAddress.Parse(ipAddress); //IPアドレスとして扱うための変換 var serverpass = "minecraft"; //RCONでログインするためのパスワード ushort port = 25575; //サーバのポート番号 var rcon = new RCON(serveraddress, port, serverpass); await rcon.ConnectAsync(); //接続 var result = await rcon.SendCommandAsync(mcCommand); logMessage = result; } catch (Exception ex) { logMessage = ex.Message; } } } }
6. 様々なデバイスで試してみよう
マイクラにコマンドを送信するには RCON 接続許可をしたマイクラサーバの設定が必要なので忘れずに行ってください。 参考までに。
6.1 Pixel 2 (Android 9.0)
6.2 iPhone11 (iOS14.0)
6.3 UWP (Windows 10)
7. おわりに
Xamarinを使って様々なデバイスからコマンドを送信できました。実機でもやってみましたが、それほど遅延は感じませんでした。
これをきっかけにマイクラも1つの学習ツールとして普及できればと思います。