Unity App 与编辑器进行通信

目的

实现与 Unity Profiler 一样可以连接手机进行通信,来接收 App 发送的信息或发送消息给 App,而 Unity 有开放 EditorConnection 和 PlayerConnection 接口,可以使用它们来实现。

测试

Unity 2018 发布 App,记得选中 Development Build 以及 Autoconnect Profiler 选项。

自动连接成功,此时可以点击按钮进行发送消息。

手机上收到消息,显示在界面上。点击按钮可以发消息给编辑器。

编辑器也收到消息打印在控制台。

问题

目前发现的问题:

  • 不能反注册连接和断开连接的事件
  • App 上的连接和断开连接事件不一定会响应
  • 如果断开后再连接的话,App 可以发送数据到编辑器,接收不到编辑器发送的数据

源码

测试工程地址:https://github.com/akof1314/Unity-EditorConnectionExample

using System;
using System.Text;
using UnityEditor;
using UnityEditor.Networking.PlayerConnection;
using UnityEngine;
using UnityEngine.Experimental.Networking.PlayerConnection;
using UnityEngine.Networking.PlayerConnection;

public class EditorConnectionExample : EditorWindow
{
    public static readonly Guid kMsgSendEditorToPlayer = new Guid("34d9b47f923142ff847c0d1f8b0554d9");
    public static readonly Guid kMsgSendPlayerToEditor = new Guid("12871ffeaf0c489189579946d8e0840f");
    private IConnectionState m_AttachToPlayerState;

    [MenuItem("Test/EditorConnectionExample")]
    static void Init()
    {
        EditorConnectionExample window = (EditorConnectionExample)EditorWindow.GetWindow(typeof(EditorConnectionExample));
        window.Show();
        window.titleContent = new GUIContent("EditorConnectionExample");
    }

    private void Awake()
    {
        EditorConnection.instance.Initialize();
        EditorConnection.instance.RegisterConnection(OnConnectionEvent);
        EditorConnection.instance.RegisterDisconnection(OnDisconnectionEvent);
    }

    void OnEnable()
    {
        if (m_AttachToPlayerState == null)
            m_AttachToPlayerState = UnityEditor.Experimental.Networking.PlayerConnection.EditorGUIUtility.GetAttachToPlayerState(this);

        EditorConnection.instance.Register(kMsgSendPlayerToEditor, OnMessageEvent);
    }

    void OnDisable()
    {
        EditorConnection.instance.Unregister(kMsgSendPlayerToEditor, OnMessageEvent);
        //EditorConnection.instance.DisconnectAll();

        m_AttachToPlayerState?.Dispose();
        m_AttachToPlayerState = null;
    }

    private void OnConnectionEvent(int playerId)
    {
        Debug.Log("Connection " + playerId);
    }

    private void OnDisconnectionEvent(int playerId)
    {
        Debug.Log("Disconnection " + playerId);
    }

    private void OnMessageEvent(MessageEventArgs args)
    {
        var text = Encoding.ASCII.GetString(args.data);
        Debug.Log("Message from player: " + text);
    }

    void OnGUI()
    {
        GUILayout.BeginHorizontal(EditorStyles.toolbar);
        UnityEditor.Experimental.Networking.PlayerConnection.EditorGUILayout.AttachToPlayerDropdown(m_AttachToPlayerState, EditorStyles.toolbarDropDown);
        GUILayout.EndHorizontal();

        var playerCount = EditorConnection.instance.ConnectedPlayers.Count;
        StringBuilder builder = new StringBuilder();
        builder.AppendLine(string.Format("{0} players connected.", playerCount));
        int i = 0;
        foreach (var p in EditorConnection.instance.ConnectedPlayers)
        {
            builder.AppendLine(string.Format("[{0}] - {1} {2}", i++, p.name, p.playerId));
        }
        EditorGUILayout.HelpBox(builder.ToString(), MessageType.Info);

        if (GUILayout.Button("Send message to player"))
        {
            EditorConnection.instance.Send(kMsgSendEditorToPlayer, Encoding.ASCII.GetBytes("Hello from Editor"));
        }
        if (GUILayout.Button("DisconnectAll"))
        {
            EditorConnection.instance.DisconnectAll();
        }
    }
}
using System;
using System.Text;
using UnityEngine;
using UnityEngine.Networking.PlayerConnection;
using UnityEngine.UI;

public class PlayerConnectionExample : MonoBehaviour
{
    public Button sendBtn;
    public Text logText;

    public static readonly Guid kMsgSendEditorToPlayer = new Guid("34d9b47f923142ff847c0d1f8b0554d9");
    public static readonly Guid kMsgSendPlayerToEditor = new Guid("12871ffeaf0c489189579946d8e0840f");

    private void OnEnable()
    {
        PlayerConnection.instance.RegisterConnection(OnConnectionEvent);
        PlayerConnection.instance.RegisterDisconnection(OnDisconnectionEvent);
        PlayerConnection.instance.Register(kMsgSendEditorToPlayer, OnMessageEvent);
        sendBtn.onClick.AddListener(OnSendToEditor);
        Application.logMessageReceived += ApplicationOnLogMessageReceived;
    }

    private void OnDisable()
    {
        PlayerConnection.instance.Unregister(kMsgSendEditorToPlayer, OnMessageEvent);
    }

    private void OnConnectionEvent(int playerId)
    {
        OnLog("Connection " + playerId);
    }

    private void OnDisconnectionEvent(int playerId)
    {
        OnLog("Disconnection " + playerId);
    }

    private void OnMessageEvent(MessageEventArgs args)
    {
        var text = Encoding.ASCII.GetString(args.data);
        OnLog("Message from editor: " + text);
    }

    private void OnSendToEditor()
    {
        PlayerConnection.instance.Send(kMsgSendPlayerToEditor, Encoding.ASCII.GetBytes("Hello from Player"));
    }

    private void OnLog(string log)
    {
        logText.text += DateTime.Now + "\t" + log + "\n";
    }

    private void ApplicationOnLogMessageReceived(string condition, string stacktrace, LogType type)
    {
        OnLog(condition);
        OnLog(stacktrace);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值