using System; using System.CodeDom; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; using EZXR.Glass.Inputs; using UnityEditor; using EZXR.Glass.Core; namespace EZXR.Glass.UI { /// /// 有厚度的按钮,hover的时候会有半透明浮层在指尖位置,随着指尖按下浮层会有被按下去的效果 /// public class SpatialButton_Thick : SpatialButton { public Transform _iconMesh; public MeshRenderer _iconRenderer; [SerializeField] private Texture2D icon; /// /// 按钮的图标 /// public Texture2D Icon { get { return icon; } set { icon = value; SetIconMaterial(); } } public Vector3 iconSize = new Vector3(0.1f, 0.1f, 0.1f); protected MaterialPropertyBlock icon_MaterialPropertyBlock; /// /// 浮层式Button的浮层,当用指尖进入触发区的时候显示此浮层 /// public GameObject buttonHover; protected MeshRenderer buttonHoverRenderer; protected MaterialPropertyBlock buttonHover_MaterialPropertyBlock; /// /// 浮层顶部圆环的粗细 /// public float circleHoverThick = 0.01f; // Start is called before the first frame update protected override void Start() { base.Start(); if (Application.isPlaying) { //buttonHover.SetActive(false); SetIconMaterial(); SetButtonHoverMaterial(); } else { #if UNITY_EDITOR icon_MaterialPropertyBlock = new MaterialPropertyBlock(); _iconRenderer?.GetPropertyBlock(icon_MaterialPropertyBlock); buttonHoverRenderer = buttonHover?.GetComponent(); buttonHover_MaterialPropertyBlock = new MaterialPropertyBlock(); buttonHoverRenderer?.GetPropertyBlock(buttonHover_MaterialPropertyBlock); #endif } } protected override void Update() { base.Update(); if (!Application.isPlaying) { #if UNITY_EDITOR _iconRenderer.sortingOrder = sortingOrder + 1; SetIconMaterial(); SetButtonHoverMaterial(); //设置UI尺寸 _iconMesh.localScale = new Vector3(iconSize.x / size.x, iconSize.y / size.y, 0.0001f); #endif } } void SetIconMaterial() { //确保icon_MaterialPropertyBlock不为空 if (icon_MaterialPropertyBlock == null) { icon_MaterialPropertyBlock = new MaterialPropertyBlock(); _iconRenderer.GetPropertyBlock(icon_MaterialPropertyBlock); } //icon有更改的话同步修改到Material if (icon != null) { _iconRenderer.gameObject.SetActive(true); icon_MaterialPropertyBlock.SetTexture("_MainTex", icon); } else { _iconRenderer.gameObject.SetActive(false); //重置materialPropertyBlock,因为无法直接SetTexture为null icon_MaterialPropertyBlock.Clear(); } _iconRenderer.SetPropertyBlock(icon_MaterialPropertyBlock); } void SetButtonHoverMaterial() { //确保buttonHover_MaterialPropertyBlock不为空 if (buttonHover_MaterialPropertyBlock == null) { buttonHoverRenderer = buttonHover?.GetComponent(); buttonHover_MaterialPropertyBlock = new MaterialPropertyBlock(); buttonHoverRenderer?.GetPropertyBlock(buttonHover_MaterialPropertyBlock); } buttonHover_MaterialPropertyBlock.SetFloat("_Thickness", circleHoverThick); buttonHover_MaterialPropertyBlock.SetFloat("_Radius", 0.25f - circleHoverThick); buttonHoverRenderer.SetPropertyBlock(buttonHover_MaterialPropertyBlock); } /// public override void OnPointerHoverEnter(Spatial.InteractiveMode interactiveMode = Spatial.InteractiveMode.None) { Debug.Log("OnPointerHoverEnter: " + gameObject.name); //显示浮层 buttonHover.SetActive(true); _iconMesh.localPosition = new Vector3(0, 0, _mesh.localScale.z / 2.0f / size.z); } /// public override void OnPointerHoverExit() { Debug.Log("OnPointerHoverExit: " + gameObject.name); ////隐藏浮层 //buttonHover.SetActive(false); _iconMesh.localPosition = new Vector3(0, 0, _mesh.localScale.z / 2.0f / size.z); //_iconMesh.localPosition = new Vector3(0, 0, 0.00001f); } /// public override void OnPointerPressing() { Debug.Log("OnPointerPressing: " + gameObject.name); //将算出的距离直接赋给按键的scale(因为此处按键本身就是按照实际尺寸进行的缩放,所以计算出的length就是scale.z) _mesh.localScale = new Vector3(_mesh.localScale.x, _mesh.localScale.y, clampLength); _iconMesh.localPosition = new Vector3(0, 0, _mesh.localScale.z / 2.0f / size.z); } /// public override void OnPointerDown() { Debug.Log("OnPointerDown: " + gameObject.name); //将按键按到底 _mesh.localScale = new Vector3(_mesh.localScale.x, _mesh.localScale.y, heightMin); _iconMesh.localPosition = new Vector3(0, 0, _mesh.localScale.z / 2.0f / size.z); } /// public override void OnPointerUp() { Debug.Log("OnPointerUp: " + gameObject.name); _mesh.localScale = new Vector3(_mesh.localScale.x, _mesh.localScale.y, heightMax); _iconMesh.localPosition = new Vector3(0, 0, _mesh.localScale.z / 2.0f / size.z); } } }