using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace BNG { /// /// Static Utilities to help with development, such as logging to World Space /// public class VRUtils : MonoBehaviour { public static VRUtils Instance { get { if (_instance == null) { _instance = FindObjectOfType(); if (_instance == null) { _instance = new GameObject("VRUtils").AddComponent(); } } return _instance; } } private static VRUtils _instance; // Where to put our text messages // public Color DebugTextColor = Color.white; public Color LogTextColor = Color.cyan; public Color WarnTextColor = Color.yellow; public Color ErrTextColor = Color.red; public Transform DebugTextHolder; /// /// Maximum number of Text lines before we start removing them /// float MaxTextEntries = 10; // Store so we can compare against future entries public string LastDebugMsg; int lastDebugMsgCount; void Awake() { if (_instance != null && _instance != this) { Destroy(this); return; } _instance = this; } public void Log(string msg) { Debug.Log(msg, gameObject); VRDebugLog(msg, LogTextColor); } public void Warn(string msg) { Debug.LogWarning(msg, gameObject); VRDebugLog(msg, WarnTextColor); } public void Error(string msg) { Debug.LogError(msg, gameObject); VRDebugLog(msg, ErrTextColor); } public void VRDebugLog(string msg, Color logColor) { // Add to Holder if available if (DebugTextHolder != null) { if (msg == LastDebugMsg) { GameObject lastChild = DebugTextHolder.GetChild(DebugTextHolder.childCount - 1).gameObject; Text lastChildLine = lastChild.GetComponent(); lastDebugMsgCount++; lastChildLine.text = $"({lastDebugMsgCount}) {msg}"; } else { GameObject go = new GameObject(); go.transform.parent = DebugTextHolder; go.transform.localPosition = Vector3.zero; go.transform.localScale = Vector3.one; go.transform.name = "Debug Text"; Text textLine = go.AddComponent(); textLine.text = msg; textLine.horizontalOverflow = HorizontalWrapMode.Wrap; textLine.verticalOverflow = VerticalWrapMode.Overflow; textLine.color = logColor; textLine.fontSize = 32; textLine.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font; textLine.raycastTarget = false; RectTransform rect = go.GetComponent(); rect.localScale = Vector3.one; rect.localRotation = Quaternion.identity; lastDebugMsgCount = 1; } CullDebugPanel(); LastDebugMsg = msg; } } public void CullDebugPanel() { for (int i = DebugTextHolder.childCount; i > MaxTextEntries; i--) { Destroy(DebugTextHolder.GetChild(0).gameObject); } } public AudioSource PlaySpatialClipAt(AudioClip clip, Vector3 pos, float volume, float spatialBlend = 1f, float randomizePitch = 0) { if(clip == null) { return null; } GameObject go = new GameObject("SpatialAudio - Temp"); go.transform.position = pos; AudioSource source = go.AddComponent(); source.clip = clip; // Currently only Oculus Integration supports spatial audio #if OCULUS_INTEGRATION source.spatialize = true; #endif source.pitch = getRandomizedPitch(randomizePitch); source.spatialBlend = spatialBlend; source.volume = volume; source.Play(); Destroy(go, clip.length); return source; } float getRandomizedPitch(float randomAmount) { if(randomAmount != 0) { float randomPitch = Random.Range(-randomAmount, randomAmount); return Time.timeScale + randomPitch; } return Time.timeScale; } } }