using System.Collections; using System.Collections.Generic; using UnityEngine; using VRTK; public class HandTooltipsManager : MonoBehaviour { public VRTK_ObjectTooltip triggerTooltip; public VRTK_ObjectTooltip gripTooltip; public VRTK_ObjectTooltip touchPadTooltip; public VRTK_ObjectTooltip buttonTwoTooltip; public Transform triggerAttach; public Transform gripAttach; public Transform touchPadAttach; public Transform buttonTwoAttach; [Header("CameraRig下对应")] public Transform handModel; private Dictionary renderers = new Dictionary(); private List flashingRenderers = new List(); private Material handleMaterial; private float startTime; private float tickCount; private int colorID; private void Awake() { colorID = Shader.PropertyToID("_Color"); } public void ShowToolTip(SDK_BaseController.ButtonTypes _handBtnType) { InitRenderer(); switch (_handBtnType) { case SDK_BaseController.ButtonTypes.ButtonOne: break; case SDK_BaseController.ButtonTypes.ButtonTwo: buttonTwoTooltip.gameObject.SetActive(true); buttonTwoAttach.gameObject.SetActive(true); SetFlashRendererState(SDK_BaseController.ButtonTypes.ButtonTwo, true); break; case SDK_BaseController.ButtonTypes.Grip: gripTooltip.gameObject.SetActive(true); gripAttach.gameObject.SetActive(true); SetFlashRendererState(SDK_BaseController.ButtonTypes.Grip, true); break; case SDK_BaseController.ButtonTypes.GripHairline: break; case SDK_BaseController.ButtonTypes.StartMenu: break; case SDK_BaseController.ButtonTypes.Trigger: triggerTooltip.gameObject.SetActive(true); triggerAttach.gameObject.SetActive(true); SetFlashRendererState(SDK_BaseController.ButtonTypes.Trigger, true); break; case SDK_BaseController.ButtonTypes.TriggerHairline: break; case SDK_BaseController.ButtonTypes.Touchpad: touchPadTooltip.gameObject.SetActive(true); touchPadAttach.gameObject.SetActive(true); SetFlashRendererState(SDK_BaseController.ButtonTypes.Touchpad, true); break; default: break; } } public void CloseToolTip(SDK_BaseController.ButtonTypes _handBtnType) { switch (_handBtnType) { case SDK_BaseController.ButtonTypes.ButtonOne: break; case SDK_BaseController.ButtonTypes.ButtonTwo: buttonTwoTooltip.gameObject.SetActive(false); buttonTwoAttach.gameObject.SetActive(false); SetFlashRendererState(SDK_BaseController.ButtonTypes.ButtonTwo, false); break; case SDK_BaseController.ButtonTypes.Grip: gripTooltip.gameObject.SetActive(false); gripAttach.gameObject.SetActive(false); SetFlashRendererState(SDK_BaseController.ButtonTypes.Grip, false); break; case SDK_BaseController.ButtonTypes.GripHairline: break; case SDK_BaseController.ButtonTypes.StartMenu: break; case SDK_BaseController.ButtonTypes.Trigger: triggerTooltip.gameObject.SetActive(false); triggerAttach.gameObject.SetActive(false); SetFlashRendererState(SDK_BaseController.ButtonTypes.Trigger, false); break; case SDK_BaseController.ButtonTypes.TriggerHairline: break; case SDK_BaseController.ButtonTypes.Touchpad: touchPadTooltip.gameObject.SetActive(false); touchPadAttach.gameObject.SetActive(false); SetFlashRendererState(SDK_BaseController.ButtonTypes.Touchpad, false); break; default: break; } } public void SetToolTips(bool state, bool flash) { InitRenderer(); triggerTooltip.gameObject.SetActive(state); triggerAttach.gameObject.SetActive(state); gripTooltip.gameObject.SetActive(state); gripAttach.gameObject.SetActive(state); touchPadTooltip.gameObject.SetActive(state); touchPadAttach.gameObject.SetActive(state); buttonTwoTooltip.gameObject.SetActive(state); buttonTwoAttach.gameObject.SetActive(state); if (!state) { SetFlashRendererState(SDK_BaseController.ButtonTypes.Trigger, state); SetFlashRendererState(SDK_BaseController.ButtonTypes.Grip, state); SetFlashRendererState(SDK_BaseController.ButtonTypes.Touchpad, state); SetFlashRendererState(SDK_BaseController.ButtonTypes.ButtonTwo, state); } else { SetFlashRendererState(SDK_BaseController.ButtonTypes.Trigger, flash); SetFlashRendererState(SDK_BaseController.ButtonTypes.Grip, flash); SetFlashRendererState(SDK_BaseController.ButtonTypes.Touchpad, flash); SetFlashRendererState(SDK_BaseController.ButtonTypes.ButtonTwo, flash); } } public enum HandleInfo { body, button, lgrip, rgrip, sys_button, trackpad, trigger } public Material controllerMaterial; public Color flashColor = new Color(1.0f, 0.557f, 0.0f); public void InitRenderer() { if (renderers.Count > 0) { return; } AddRenderers(SDK_BaseController.ButtonTypes.Grip, HandleInfo.lgrip); AddRenderers(SDK_BaseController.ButtonTypes.Trigger, HandleInfo.trigger); AddRenderers(SDK_BaseController.ButtonTypes.Touchpad, HandleInfo.trackpad); AddRenderers(SDK_BaseController.ButtonTypes.ButtonTwo, HandleInfo.button); } public void AddRenderers(SDK_BaseController.ButtonTypes _buttonType, HandleInfo _handleInf) { if (!renderers.ContainsKey(_buttonType) && handModel.Find(_handleInf.ToString()) != null) { if (handleMaterial == null) { handleMaterial = handModel.Find(_handleInf.ToString()).GetComponent().material; } renderers.Add(_buttonType, handModel.Find(_handleInf.ToString()).GetComponent()); //SetMaterial(renderers[_buttonType], controllerMaterial); } } public void SetMaterial(MeshRenderer _meshRenderer, Material mat) { Texture mainTexture = _meshRenderer.material.mainTexture; _meshRenderer.material = mat; _meshRenderer.material.mainTexture = mainTexture; _meshRenderer.material.renderQueue = mat.shader.renderQueue; //_meshRenderer.material.SetOverrideTag() } public void SetFlashRendererState(SDK_BaseController.ButtonTypes btnType, bool state) { if (state) { if (renderers.Count == 0) return; if (!flashingRenderers.Contains(renderers[btnType])) { renderers[btnType].material = controllerMaterial; flashingRenderers.Add(renderers[btnType]); } } else { if (renderers.Count == 0) return; if (flashingRenderers.Contains(renderers[btnType])) { renderers[btnType].material = handleMaterial; flashingRenderers.Remove(renderers[btnType]); } } } private void Update() { if (flashingRenderers.Count > 0) { Color baseColor = controllerMaterial.GetColor(colorID); float flash = (Time.realtimeSinceStartup - startTime) * Mathf.PI * 2.0f; flash = Mathf.Cos(flash); flash = RemapNumberClamped(flash, -1.0f, 1.0f, 0.0f, 1.0f); float ticks = (Time.realtimeSinceStartup - startTime); if (ticks - tickCount > 1.0f) { tickCount += 1.0f; } for (int i = 0; i < flashingRenderers.Count; i++) { Renderer r = flashingRenderers[i]; r.material.SetColor(colorID, Color.Lerp(baseColor, flashColor, flash)); } } } public float RemapNumber(float num, float low1, float high1, float low2, float high2) { return low2 + (num - low1) * (high2 - low2) / (high1 - low1); } public float RemapNumberClamped(float num, float low1, float high1, float low2, float high2) { return Mathf.Clamp(RemapNumber(num, low1, high1, low2, high2), Mathf.Min(low2, high2), Mathf.Max(low2, high2)); } }