namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
|
|
public class VRTK_Logger : MonoBehaviour
|
|
{
|
|
public enum LogLevels
|
|
{
|
|
Trace,
|
|
Debug,
|
|
Info,
|
|
Warn,
|
|
Error,
|
|
Fatal,
|
|
None
|
|
}
|
|
|
|
public enum CommonMessageKeys
|
|
{
|
|
NOT_DEFINED,
|
|
REQUIRED_COMPONENT_MISSING_FROM_SCENE,
|
|
REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT,
|
|
REQUIRED_COMPONENT_MISSING_FROM_PARAMETER,
|
|
REQUIRED_COMPONENT_MISSING_NOT_INJECTED,
|
|
COULD_NOT_FIND_OBJECT_FOR_ACTION,
|
|
SDK_OBJECT_NOT_FOUND,
|
|
SDK_NOT_FOUND,
|
|
SDK_MANAGER_ERRORS,
|
|
SCRIPTING_DEFINE_SYMBOLS_ADDED,
|
|
SCRIPTING_DEFINE_SYMBOLS_REMOVED,
|
|
SCRIPTING_DEFINE_SYMBOLS_NOT_FOUND
|
|
}
|
|
|
|
public static VRTK_Logger instance = null;
|
|
|
|
public static Dictionary<CommonMessageKeys, string> commonMessages = new Dictionary<CommonMessageKeys, string>()
|
|
{
|
|
{ CommonMessageKeys.NOT_DEFINED, "`{0}` not defined{1}." },
|
|
{ CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_SCENE, "`{0}` requires the `{1}` component to be available in the scene{2}." },
|
|
{ CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT, "`{0}` requires the `{1}` component to be attached to {2} GameObject{3}." },
|
|
{ CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_PARAMETER, "`{0}` requires a `{1}` component to be specified as the `{2}` parameter{3}." },
|
|
{ CommonMessageKeys.REQUIRED_COMPONENT_MISSING_NOT_INJECTED, "`{0}` requires the `{1}` component. Either the `{2}` parameter is not set or no `{1}` component is attached to {3} GameObject{4}." },
|
|
{ CommonMessageKeys.COULD_NOT_FIND_OBJECT_FOR_ACTION, "The `{0}` could not automatically find {1} to {2}." },
|
|
{ CommonMessageKeys.SDK_OBJECT_NOT_FOUND, "No {0} could be found. Have you selected a valid {1} in the SDK Manager? If you are unsure, then click the GameObject with the `VRTK_SDKManager` script attached to it in Edit Mode and select a {1} from the dropdown." },
|
|
{ CommonMessageKeys.SDK_NOT_FOUND, "The SDK '{0}' doesn't exist anymore. The fallback SDK '{1}' will be used instead." },
|
|
{ CommonMessageKeys.SDK_MANAGER_ERRORS, "The current SDK Manager setup is causing the following errors:\n\n{0}" },
|
|
{ CommonMessageKeys.SCRIPTING_DEFINE_SYMBOLS_ADDED, "Scripting Define Symbols added to [Project Settings->Player] for {0}: {1}" },
|
|
{ CommonMessageKeys.SCRIPTING_DEFINE_SYMBOLS_REMOVED, "Scripting Define Symbols removed from [Project Settings->Player] for {0}: {1}" }
|
|
};
|
|
|
|
public static Dictionary<CommonMessageKeys, int> commonMessageParts = new Dictionary<CommonMessageKeys, int>();
|
|
|
|
public LogLevels minLevel = LogLevels.Trace;
|
|
public bool throwExceptions = true;
|
|
|
|
#if UNITY_EDITOR
|
|
[InitializeOnLoadMethod]
|
|
#endif
|
|
public static void CreateIfNotExists()
|
|
{
|
|
if (instance == null)
|
|
{
|
|
GameObject loggerObject = new GameObject(VRTK_SharedMethods.GenerateVRTKObjectName(true, "Logger"))
|
|
{
|
|
hideFlags = HideFlags.DontSaveInEditor | HideFlags.HideInHierarchy
|
|
};
|
|
instance = loggerObject.AddComponent<VRTK_Logger>();
|
|
}
|
|
|
|
if (commonMessageParts.Count != commonMessages.Count)
|
|
{
|
|
commonMessageParts.Clear();
|
|
foreach (KeyValuePair<CommonMessageKeys, string> commonMessage in commonMessages)
|
|
{
|
|
int bitCount = Regex.Matches(commonMessage.Value, @"(?<!\{)\{([0-9]+).*?\}(?!})")
|
|
.Cast<Match>().DefaultIfEmpty()
|
|
.Max(m => m == null ? -1 : int.Parse(m.Groups[1].Value)) + 1;
|
|
commonMessageParts.Add(commonMessage.Key, bitCount);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static string GetCommonMessage(CommonMessageKeys messageKey, params object[] parameters)
|
|
{
|
|
CreateIfNotExists();
|
|
|
|
string returnMessage = "";
|
|
string outputMessage = VRTK_SharedMethods.GetDictionaryValue(commonMessages, messageKey);
|
|
if (outputMessage != null)
|
|
{
|
|
int outputMessageParts = VRTK_SharedMethods.GetDictionaryValue(commonMessageParts, messageKey);
|
|
if (parameters.Length != outputMessageParts)
|
|
{
|
|
Array.Resize(ref parameters, outputMessageParts);
|
|
}
|
|
returnMessage = string.Format(outputMessage, parameters);
|
|
}
|
|
return returnMessage;
|
|
}
|
|
|
|
public static void Trace(string message)
|
|
{
|
|
Log(LogLevels.Trace, message);
|
|
}
|
|
|
|
public static void Debug(string message)
|
|
{
|
|
Log(LogLevels.Debug, message);
|
|
}
|
|
|
|
public static void Info(string message)
|
|
{
|
|
Log(LogLevels.Info, message);
|
|
}
|
|
|
|
public static void Warn(string message)
|
|
{
|
|
Log(LogLevels.Warn, message);
|
|
}
|
|
|
|
public static void Error(string message, bool forcePause = false)
|
|
{
|
|
Log(LogLevels.Error, message, forcePause);
|
|
}
|
|
|
|
public static void Fatal(string message, bool forcePause = false)
|
|
{
|
|
Log(LogLevels.Fatal, message, forcePause);
|
|
}
|
|
|
|
public static void Fatal(Exception exception, bool forcePause = false)
|
|
{
|
|
Log(LogLevels.Fatal, exception.Message, forcePause);
|
|
}
|
|
|
|
public static void Log(LogLevels level, string message, bool forcePause = false)
|
|
{
|
|
#if VRTK_NO_LOGGING
|
|
return;
|
|
#endif
|
|
CreateIfNotExists();
|
|
|
|
if (instance.minLevel > level)
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch (level)
|
|
{
|
|
case LogLevels.Trace:
|
|
case LogLevels.Debug:
|
|
case LogLevels.Info:
|
|
UnityEngine.Debug.Log(message);
|
|
break;
|
|
case LogLevels.Warn:
|
|
UnityEngine.Debug.LogWarning(message);
|
|
break;
|
|
case LogLevels.Error:
|
|
case LogLevels.Fatal:
|
|
if (forcePause)
|
|
{
|
|
UnityEngine.Debug.Break();
|
|
}
|
|
|
|
if (instance.throwExceptions)
|
|
{
|
|
throw new Exception(message);
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Debug.LogError(message);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
instance = this;
|
|
DontDestroyOnLoad(gameObject);
|
|
}
|
|
}
|
|
}
|