Xamarin アプリから Minecraft にコマンドを投げよう

以前、マイクラ自動化でC#からRCON経由でマイクラのコマンドを投げられることを確認しました。同じC#ならばプラットフォームが異なってもできるのでは?というノリでXamarinアプリを作ってみたら意外といけました。

www.youtube.com

youtube では Androidエミュレータ で動かしていますが、この記事ではいろんな環境で試したいと思います。

1. 全体図

ざっと全体図です。

f:id:takunology:20201004002720p:plain

イクラサーバをPC上に立てて、実機と同じネットワークアドレスに所属させます。ホスト部をPCに指定してコマンドを送信すれば、スマホ (Xamarin) からコマンドを送信できるので遠隔操作ができるようになります。エミュレータの場合はPC上で動いているので直接ホストのIPを指定して接続する形になります。

2. プロジェクトの作成

Visual Studio にて Xamarin.Forms を選択します。

f:id:takunology:20201003035841p:plain

テンプレートは空白で大丈夫です。開発対象は自分のやりたい環境を選択してください。

f:id:takunology:20201003040146p:plain

起動までに少し時間がかかります。

3. 画面デザイン(XAML)

適当にデザインを書いていきます。初めてやる人はファイルが結構あって混乱すると思いますが、プロジェクト名直下にある MainPage.xaml (画像の青い部分) を選択します。

f:id:takunology:20201003040439p:plain

必要なパラメータは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 パッケージの管理 を開きます。

f:id:takunology:20201003040932j:plain

参照 タブをクリックして、検索欄に CoreRCON と入力すると先頭に出てくると思います。

f:id:takunology:20201003041401j:plain

これを選択し、バージョンを 5.0.0 にして インストール をクリック してください。(3.0.0 でやってみましたが上手くいきませんでした。)

ソリューションエクスプローラ―の 依存関係 / パッケージ の中に CoreRCON 5.0.0 が入っていれば導入完了です。

f:id:takunology:20201003041620p:plain

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 接続許可をしたマイクラサーバの設定が必要なので忘れずに行ってください。 参考までに。

blog.takunology.jp

6.1 Pixel 2 (Android 9.0)

f:id:takunology:20201004002311p:plain

6.2 iPhone11 (iOS14.0)

f:id:takunology:20201004001701p:plain

6.3 UWP (Windows 10)

f:id:takunology:20201003062506p:plain

7. おわりに

Xamarinを使って様々なデバイスからコマンドを送信できました。実機でもやってみましたが、それほど遅延は感じませんでした。

これをきっかけにマイクラも1つの学習ツールとして普及できればと思います。