ImaageQ_Unity_App/Assets/Common/Scripts/ScrollingLog.cs
Ignacio Gómez Puga 5847d844a5 Removed TOTU 103
2025-03-04 12:04:52 -06:00

95 lines
2.5 KiB
C#

// Copyright 2022-2024 Niantic.
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
namespace Niantic.ARDKExamples.Helpers
{
// Simple scrolling window that prints to the application screen whatever is printed through
// calls to the UnityEngine.Debug.Log method.
[DefaultExecutionOrder(Int32.MinValue)]
public class ScrollingLog:
MonoBehaviour
{
/// Font size for log text entries. Spacing between log entries is also set to half this value.
[SerializeField]
private int LogEntryFontSize = 32;
/// The maximum number of log entries to keep history of
[SerializeField][Range(1, 100)]
private int MaxLogCount = 100;
/// Layout box containing the log entries
[SerializeField]
private VerticalLayoutGroup LogHistory = null;
/// Log entry prefab used to generate new entries when requested
[SerializeField]
private Text LogEntryPrefab = null;
private readonly List<Text> _logEntries = new List<Text>();
private static ScrollingLog _instance;
private void Awake()
{
_instance = this;
LogHistory.spacing = LogEntryFontSize / 2f;
}
private void OnEnable()
{
// Using logMessageReceived (instead of logMessageReceivedThreaded) to ensure that
// HandleDebugLog is only called from one thread (the main thread).
Application.logMessageReceived += AddLogEntry;
}
private void OnDisable()
{
Application.logMessageReceived -= AddLogEntry;
}
private void OnDestroy()
{
_instance = null;
}
// Creates a new log entry using the provided string.
private void AddLogEntry(string str, string stackTrace, LogType type)
{
var newLogEntry = Instantiate(LogEntryPrefab, Vector3.zero, Quaternion.identity);
newLogEntry.text = str;
newLogEntry.fontSize = LogEntryFontSize;
newLogEntry.color = Color.white;
var transform = newLogEntry.transform;
transform.SetParent(LogHistory.transform);
transform.localScale = Vector3.one;
_logEntries.Add(newLogEntry);
if (_logEntries.Count > MaxLogCount)
{
var textObj = _logEntries.First();
_logEntries.RemoveAt(0);
Destroy(textObj.gameObject);
}
}
public static void Clear()
{
if (_instance == null)
return;
foreach (var entry in _instance._logEntries)
Destroy(entry.gameObject);
_instance._logEntries.Clear();
}
}
}