using System; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; /// /// 控制台面板 /// public class ConsolePanel : PanelBasic, IPool { #region ConsoleItem对象池管理 public event Action OnRecycle; public event Action OnGet; /// /// 预制体 /// public ConsoleItem prefab; /// /// 对象池最大容量 /// public int maximum_size = 100; /// /// 对象池 /// private List> console_item_pool = new List>(); public RectTransform pool_root; public IPoolObject Get() { IPoolObject _pool_object = null; //上限100个 if (console_items.Count >= 100) { _pool_object = console_item_content.transform.GetComponentInChildren(); } else { if (console_item_pool.Count == 0) { if (prefab == null) { prefab = Resources.Load("Prefabs/UIItem/ConsoleItem"); } var content = GameObject.Instantiate(prefab); content.Init(this, content); _pool_object = content; } else { _pool_object = console_item_pool[console_item_pool.Count - 1]; console_item_pool.Remove(_pool_object); _pool_object.Content.gameObject.SetActive(true); } } OnGet?.Invoke(_pool_object.Content); return _pool_object; } public void Recycle(IPoolObject _pool_object) { if ((ConsolePanel)_pool_object.Pool != this) return; OnRecycle?.Invoke(_pool_object.Content); if (console_item_pool.Count > maximum_size) { _pool_object.Dispose(); } else { console_item_pool.Add(_pool_object); _pool_object.Content.transform.SetParent(pool_root.transform); _pool_object.Content.gameObject.SetActive(false); } } public void Dispose(IPoolObject _pool_object) { if ((ConsolePanel)_pool_object.Pool != this) return; GameObject.DestroyImmediate(_pool_object.Content.gameObject); if (console_item_pool.Contains(_pool_object)) console_item_pool.Remove(_pool_object); } #endregion public static ConsolePanel Instance; /// /// 实例化对象容器 /// public RectTransform console_item_content; /// /// 清空控制台按钮 /// public Button clear_console_button; /// /// 实例化对象列表 /// public List console_items = new List(); /// /// 自定义ScrollRect /// public CustomScrollRect custom_scroll_rect; private int _current_console_count; protected override void Awake() { base.Awake(); Instance = this; } private void Start() { clear_console_button.onClick.AddListener(OnClearConsole); } /// /// 清空 /// public void OnClearConsole() { console_items.ForEach(x => x.Recycle()); console_items.Clear(); } private void Update() { if (_current_console_count != console_items.Count) { _current_console_count = console_items.Count; if (custom_scroll_rect.is_Draging || custom_scroll_rect.is_Scrolling) return; if (console_item_content.sizeDelta.y > console_item_content.anchoredPosition.y) console_item_content.anchoredPosition = new Vector2(console_item_content.anchoredPosition.x, console_item_content.sizeDelta.y); } } /// /// 控制台输出 /// /// /// _type = [log,warning,error] public static ConsoleItem ConsoleOutput(string _message, string _type = "log") { //bool auto_move = Mathf.Abs(current_console_content_position_y - Instance.console_item_content.rect.height) < 10 // || Instance.console_item_content.rect.height < current_console_content_position_y; string __msg = string.Format("[{0}] ", DateTime.Now.ToString("HH:mm:ss")); switch (_type) { case "log": _message = string.Format("{0}", _message); break; case "warning": _message = string.Format("{0}", _message); break; case "error": _message = string.Format("{0}", _message); break; default: break; } __msg = string.Format("{0}{1}", __msg, _message); var _console_item = Instance.Get().Content.NewConsole(__msg); _console_item.transform.SetParent(Instance.console_item_content); _console_item.transform.SetAsLastSibling(); if (!Instance.console_items.Contains(_console_item)) { Instance.console_items.Add(_console_item); } Canvas.ForceUpdateCanvases(); Instance.custom_scroll_rect.content.GetComponent().CalculateLayoutInputVertical(); Instance.custom_scroll_rect.content.GetComponent().SetLayoutVertical(); Instance.custom_scroll_rect.verticalNormalizedPosition = 0; return _console_item; //if (auto_move && Instance.console_item_content.rect.height >= current_console_content_position_y) // //update_position_y.Enqueue(Instance.console_item_content.rect.height); // Instance.console_item_content.anchoredPosition = new Vector2(Instance.console_item_content.anchoredPosition.x, Instance.console_item_content.rect.height); } //[ContextMenu("log")] //public void test() //{ // ConsoleOutput("输出测试,log"); //} //[ContextMenu("warning")] //public void test1() //{ // ConsoleOutput("输出测试,warn", "warning"); //} //[ContextMenu("error")] //public void test2() //{ // ConsoleOutput("输出测试,error", "error"); //} }