// ----------------------------------------------------------------------------
//
// Photon Voice for Unity - Copyright (C) 2018 Exit Games GmbH
//
//
// Logger for voice components.
//
// developer@photonengine.com
// ----------------------------------------------------------------------------
namespace Photon.Voice.Unity
{
using UnityEngine;
[AddComponentMenu("Photon Voice/Voice Logger")]
[DisallowMultipleComponent]
public class VoiceLogger : MonoBehaviour
{
public LogLevel LogLevel = LogLevel.Warning;
public static VoiceLogger instance;
// required for the MonoBehaviour to have the 'enabled' checkbox
private void Awake()
{
if(VoiceLogger.instance)
Destroy(VoiceLogger.instance.gameObject);
instance = this;
}
static public VoiceLogger FindLogger(GameObject gameObject)
{
// serach through the hierarchy
for (var go = gameObject; go != null; go = go.transform.parent == null ? null : go.transform.parent.gameObject)
{
var vl = go.GetComponent();
if (vl != null && vl.enabled)
{
return vl;
}
}
// look for VoiceLogger at the root
VoiceLogger vlRoot = null;
foreach (var vl in Object.FindObjectsOfType())
{
if (vl.transform.parent == null && vl.enabled)
{
if (vlRoot != null)
{
UnityLogger.Log(LogLevel.Info, vl, "LOGGER", vlRoot.name, "Disabling VoiceLogger duplicates at the scene root.");
vl.enabled = false;
}
else
{
vlRoot = vl;
}
}
}
return vlRoot;
}
static public VoiceLogger CreateRootLogger()
{
var logObject = new GameObject("VoiceLogger");
return logObject.AddComponent();
}
#if UNITY_EDITOR
static public void EditorVoiceLoggerOnInspectorGUI(GameObject gameObject)
{
var vl = FindLogger(gameObject);
if (vl == null)
{
vl = CreateRootLogger();
// vl.gameObject.hideFlags = HideFlags.HideInHierarchy; //NotEditable HideInInspector HideInHierarchy
// Let the Editor know that the scene has been updated
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(vl.gameObject.scene);
}
vl.LogLevel = (LogLevel)UnityEditor.EditorGUILayout.EnumPopup("Log Level", vl.LogLevel);
}
#endif
}
public static class UnityLogger
{
public static void Log(LogLevel level, Object obj, string tag, string objName, string fmt, params object[] args)
{
// obj.name is available only on the main thread, so we pass objName here
fmt = GetFormatString(level, tag, objName, fmt);
if (obj == null)
{
switch (level)
{
case LogLevel.Error: Debug.LogErrorFormat(fmt, args); break;
case LogLevel.Warning: Debug.LogWarningFormat(fmt, args); break;
default: Debug.LogFormat(fmt, args); break;
}
}
else
{
switch (level)
{
case LogLevel.Error: Debug.LogErrorFormat(obj, fmt, args); break;
case LogLevel.Warning: Debug.LogWarningFormat(obj, fmt, args); break;
default: Debug.LogFormat(obj, fmt, args); break;
}
}
}
private static string GetFormatString(LogLevel level, string tag, string objName, string fmt)
{
return string.Format("[{0}] [{1}] [{2}] [{3}] {4}", GetTimestamp(), level, tag, objName, fmt);
}
private static string GetTimestamp()
{
return System.DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss", new System.Globalization.CultureInfo("en-US"));
}
}
}