demo_ar_unity/Assets/FlutterUnityIntegration/UnityMessageManager.cs
2025-03-18 09:34:42 +07:00

162 lines
4.2 KiB
C#
Executable File

using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace FlutterUnityIntegration
{
public class MessageHandler
{
public int id;
public string seq;
public String name;
private readonly JToken data;
public static MessageHandler Deserialize(string message)
{
var m = JObject.Parse(message);
var handler = new MessageHandler(
m.GetValue("id").Value<int>(),
m.GetValue("seq").Value<string>(),
m.GetValue("name").Value<string>(),
m.GetValue("data")
);
return handler;
}
public T getData<T>()
{
return data.Value<T>();
}
public MessageHandler(int id, string seq, string name, JToken data)
{
this.id = id;
this.seq = seq;
this.name = name;
this.data = data;
}
public void send(object data)
{
var o = JObject.FromObject(new
{
id = id,
seq = "end",
name = name,
data = data
});
UnityMessageManager.Instance.SendMessageToFlutter(UnityMessageManager.MessagePrefix + o.ToString());
}
}
public class UnityMessage
{
public String name;
public JObject data;
public Action<object> callBack;
}
public class UnityMessageManager : SingletonMonoBehaviour<UnityMessageManager>
{
public const string MessagePrefix = "@UnityMessage@";
private static int ID = 0;
private static int generateId()
{
ID = ID + 1;
return ID;
}
public delegate void MessageDelegate(string message);
public event MessageDelegate OnMessage;
public delegate void MessageHandlerDelegate(MessageHandler handler);
public event MessageHandlerDelegate OnFlutterMessage;
private readonly Dictionary<int, UnityMessage> waitCallbackMessageMap = new Dictionary<int, UnityMessage>();
private void Start()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
NativeAPI.OnSceneLoaded(scene, mode);
}
public void ShowHostMainWindow()
{
NativeAPI.ShowHostMainWindow();
}
public void UnloadMainWindow()
{
NativeAPI.UnloadMainWindow();
}
public void QuitUnityWindow()
{
NativeAPI.QuitUnityWindow();
}
public void SendMessageToFlutter(string message)
{
NativeAPI.SendMessageToFlutter(message);
}
public void SendMessageToFlutter(UnityMessage message)
{
var id = generateId();
if (message.callBack != null)
{
waitCallbackMessageMap.Add(id, message);
}
var o = JObject.FromObject(new
{
id = id,
seq = message.callBack != null ? "start" : "",
name = message.name,
data = message.data
});
UnityMessageManager.Instance.SendMessageToFlutter(MessagePrefix + o.ToString());
}
void onMessage(string message)
{
OnMessage?.Invoke(message);
}
void onFlutterMessage(string message)
{
if (message.StartsWith(MessagePrefix))
{
message = message.Replace(MessagePrefix, "");
}
else
{
return;
}
var handler = MessageHandler.Deserialize(message);
if ("end".Equals(handler.seq))
{
// handle callback message
if (!waitCallbackMessageMap.TryGetValue(handler.id, out var m)) return;
waitCallbackMessageMap.Remove(handler.id);
m.callBack?.Invoke(handler.getData<object>()); // todo
return;
}
OnFlutterMessage?.Invoke(handler);
}
}
}