using System; using System.Collections.Generic; using RenderStreaming; using Script.Util; using Stary.Evo; using Unity.RenderStreaming; using UnityEngine; using UnityEngine.UI; namespace Script { public class MeetingChat : IController { public GameObject PanelGo; private MainPanel _mainPanel; private Transform _content; private GameObjectPool _objectRightPool; private GameObjectPool _objectLeftPool; private Text _connectionTimeText; private Text _userCountText; public Action OnUserCountChangedEvent; private List _chatDatas = new(); public void Initialize(GameObject panelGo, MainPanel mainPanel) { PanelGo = panelGo; _mainPanel = mainPanel; _content = panelGo.transform.Find("MeetingGrid/Viewport/Content"); _objectRightPool = panelGo.transform.Find("MeetingGrid/LeftPool").GetComponent(); _objectLeftPool = panelGo.transform.Find("MeetingGrid/RightPool").GetComponent(); _connectionTimeText = panelGo.transform.Find("MeetingNum/Time").GetComponent(); _connectionTimeText.text = this.GetSystem().GetConnectionStartTime(); _userCountText = panelGo.transform.Find("MeetingNum/Num").GetComponent(); _userCountText.text = this.GetSystem().GetUserCount().ToString(); } public async void OnEnter() { OnUserCountChangedEvent += OnUserCountChanged; GameObject.FindObjectOfType().OnChatMessageReceived += OnChatMessageReceivedEvent; } public async void OnExit() { OnUserCountChangedEvent -= OnUserCountChanged; GameObject.FindObjectOfType().OnChatMessageReceived -= OnChatMessageReceivedEvent; } private void OnChatMessageReceivedEvent(string connectionId, ChatData data) { if (connectionId != this.GetSystem().GetConnectionId()) return; _chatDatas.Add(data); if (bool.Parse(data.isSelf) == false) { var entry = _objectLeftPool.Get(); SetMessageEntry(data, entry); } } private void SetMessageEntry(ChatData data, GameObject entry) { var head = entry.transform.Find("head"); var name = entry.transform.Find("name"); var message = entry.transform.Find("message"); var sprite = entry.transform.Find("sprite"); if (string.IsNullOrEmpty(data.senderAvatar)) { var randomColor = WebRTCUtil.GetRandomColor(); head.GetComponent().color = randomColor; head.transform.Find("Name").GetComponent().text = data.senderName.Substring(0, 1); } else { WebRTCUtil.DownloadAndSetAvatar(data.senderAvatar, head.GetComponent()); } name.GetComponent().text = data.senderName; if (data.type == "text") { message.GetComponent().text = data.content; sprite.gameObject.SetActive(false); } else if (data.type == "image") { message.gameObject.SetActive(false); sprite.gameObject.SetActive(true); //TODO 图片传输功能 } } private void OnUserCountChanged(int obj) { _userCountText.text = obj.ToString(); } public IArchitecture GetArchitecture() { return MainArchitecture.Interface; } } }