Unity Editorから同じネットワーク上にいるデバイスのプレイヤーにデータを送る


UnityEditor.Networking.PlayerConnection.EditorConnection とかいうトゲアリトゲナシトゲトゲみたいな名前のAPIを使うとConsole Windowで接続できるリモートデバイスに対してデータを送受信することができます。

これを使えば、文字を打つのが面倒なiOS/Android上に簡単にデバッグコマンドを送ったりできそうですね。
Development Buildでだけ動作します。

docs.unity3d.comja/2022.3/ScriptReference/Networking.PlayerConnection.EditorConnection.html

以下、Editor側のコードとPlayer側のコード。

ReceiveMessage.cs
using UnityEngine;
using UnityEngine.Networking.PlayerConnection;
using UnityEngine.UI;

public class ReceiveMessage : MonoBehaviour
{
    [SerializeField] private Text text;

    private void Start()
    {
        var connection = PlayerConnection.instance;
        connection.Register(MyCustomMessageIds.TextMessage, OnReceiveTextMessage);
    }

    private void OnDestroy()
    {
        var connection = PlayerConnection.instance;
        connection.Unregister(MyCustomMessageIds.TextMessage, OnReceiveTextMessage);
    }

    private void OnReceiveTextMessage(MessageEventArgs args)
    {
        var message = System.Text.Encoding.UTF8.GetString(args.data);
        text.text = $"{message}\n{text.text}";
    }
}

public static class MyCustomMessageIds
{
    public static readonly System.Guid TextMessage = System.Guid.Parse("dee5cc30-8107-4c58-a627-33a5943043c1");
}
SendMessageToPlayer.cs
using UnityEditor;
using UnityEditor.Networking.PlayerConnection;
using UnityEngine;

public class SendMessageToPlayer : EditorWindow
{
    [MenuItem("Tools/Send Message to Player")]
    private static void ShowWindow()
    {
        var window = GetWindow<SendMessageToPlayer>();
        window.titleContent = new GUIContent("Send Message To Player");
        window.Show();
    }

    private string _messageToSend = "Hello!";

    private void OnEnable()
    {
        EditorConnection.instance.Initialize();
    }

    private void OnDisable()
    {
        EditorConnection.instance.DisconnectAll();
    }

    private void OnGUI()
    {
        _messageToSend = EditorGUILayout.TextField("Message:", _messageToSend);

        foreach (var connection in EditorConnection.instance.ConnectedPlayers)
        {
            if (GUILayout.Button($"Send to {connection.name}"))
            {
                SendTextMessageToPlayer(_messageToSend, connection.playerId);
            }
        }
    }

    private void SendTextMessageToPlayer(string message, int playerId)
    {
        var connection = EditorConnection.instance;
        var bytes = System.Text.Encoding.UTF8.GetBytes(message);
        connection.Send(MyCustomMessageIds.TextMessage, bytes, playerId);
    }
}

追記

すぐに試せるようにパッケージも作ってみました。

github.comkyubuns/DebugCommandExecutor