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");
//}
}