This commit is contained in:
2026-05-12 23:04:08 +08:00
parent bde7494997
commit 4b383cf33c
10 changed files with 321 additions and 18 deletions

View File

@@ -1,26 +1,117 @@
// Assets/Script/MessageChannel.cs
using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
namespace Unity.RenderStreaming
{
public class MessageChannel : DataChannelBase
{
public event Action<string, string> OnMessageReceived; // connectionId, message
public event Action<string, UserInfo> OnMessageReceived;
public event Action<string, MediaStateChange> OnMediaStateChangeReceived;
protected override void OnMessage(byte[] bytes)
[Header("消息记录")] [SerializeField, TextArea(1, 3)]
private string lastReceivedMessage;
[SerializeField] private int receivedMessageCount;
[SerializeField] private List<MessageRecord> messageHistory = new List<MessageRecord>();
private const int MAX_HISTORY = 100;
public IReadOnlyList<MessageRecord> MessageHistory => messageHistory;
public int ReceivedMessageCount => receivedMessageCount;
private void Start()
{
label = "on-message";
}
public override void OnMessage(string message)
{
try
{
string json = Encoding.UTF8.GetString(bytes);
Debug.Log($"[MessageChannel] Received: {json}");
OnMessageReceived?.Invoke(ConnectionId, json);
Debug.Log($"[MessageChannel] Received: {message}");
var record = JsonConvert.DeserializeObject<MessageRecord>(message);
if (record == null)
{
record = new MessageRecord { type = "raw", data = message };
}
JObject json = null;
switch (record.type)
{
case MessageTypes.Chat:
var chat = record.data as ChatData;
break;
case MessageTypes.UserInfo:
json = record.data as JObject;
var info = json.ToObject<UserInfo>();
OnMessageReceived?.Invoke(ConnectionId, info);
break;
case MessageTypes.MediaStateChange:
json = record.data as JObject;
var mediaState = json.ToObject<MediaStateChange>();
OnMediaStateChangeReceived?.Invoke(ConnectionId, mediaState);
break;
}
messageHistory.Add(record);
if (messageHistory.Count > MAX_HISTORY)
messageHistory.RemoveAt(0);
lastReceivedMessage = message;
receivedMessageCount++;
}
catch (Exception e)
{
Debug.LogError($"[MessageChannel] Parse error: {e.Message}");
}
}
public void SendMessage<T>(string type, T data)
{
var record = new MessageRecord
{
type = type,
data = JsonConvert.SerializeObject(data)
};
string json = JsonConvert.SerializeObject(record);
Send(json);
record.isSent = true;
messageHistory.Add(record);
if (messageHistory.Count > MAX_HISTORY)
messageHistory.RemoveAt(0);
}
public void SendMessage(string message)
{
Send(message);
var record = new MessageRecord { type = "raw", data = message, isSent = true };
messageHistory.Add(record);
if (messageHistory.Count > MAX_HISTORY)
messageHistory.RemoveAt(0);
}
public void ClearHistory()
{
messageHistory.Clear();
receivedMessageCount = 0;
lastReceivedMessage = "";
}
[Serializable]
public class MessageRecord
{
public string type;
public object data;
public bool isSent;
public string timestamp = DateTime.Now.ToString();
}
}
}

View File

@@ -0,0 +1,52 @@
// Assets/Script/WebRtc/MessageTypes.cs
using System;
using Newtonsoft.Json;
using UnityEngine;
namespace Unity.RenderStreaming
{
public static class MessageTypes
{
public const string Chat = "chat";
public const string UserInfo = "user-info";
public const string MediaStateChange = "media-state-changed";
public const string Image = "image";
}
[Serializable]
public class ChatData
{
public string senderId;
public string senderName;
public string content;
public long timestamp;
}
[Serializable]
public class UserInfo
{
public string id;
public string name;
public string avatar;
}
[Serializable]
public class MediaStateChange
{
public string userId;
public bool audio;
public bool video;
public bool screenShare;
public bool recording;
public bool isSpeaking;
}
[Serializable]
public class ImageData
{
public string senderId;
public string imageUrl;
public int width;
public int height;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: fb7316441d2d42a1ba12b3b9d02a4e2b
timeCreated: 1778596506