using System; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.UI; namespace AlicizaX.UI.Extension { [RequireComponent(typeof(RawImage))] public class UI3DDisplay : MonoBehaviour { private Camera m_Camera; private GameObject m_ShowObject; private RenderTexture m_ShowTexure; private UI3DDisplayTouch m_UI3DDisplayTouch; private RawImage m_ShowImage; [ReadOnly] [SerializeField] private int m_ResolutionX = 512; [SerializeField] [ReadOnly] private int m_ResolutionY = 512; private readonly int m_RenderTextureDepthBuffer = 16; void Awake() { m_ShowImage = GetComponent(); m_UI3DDisplayTouch = GetComponentInChildren(); } #if UNITY_EDITOR [SerializeField] [Header("分辨率")] [OnValueChanged("OnEditResolutionChanged")] private int EditResolution = 512; private void OnEditResolutionChanged() { if (!getPlayingState) return; m_ResolutionX = EditResolution; m_ResolutionY = EditResolution; var rect = transform.GetComponent(); if (Math.Abs(rect.sizeDelta.x - m_ResolutionX) > 0.01f || Math.Abs(rect.sizeDelta.y - m_ResolutionY) > 0.01f) rect.sizeDelta = new Vector2(m_ResolutionX, m_ResolutionY); } [ShowIf("getPlayingState")] [SerializeField] GameObject previewPrefab; [ShowIf("getPlayingState")] [SerializeField] Camera previewCamera; bool getPlayingState => !Application.isPlaying; [Sirenix.OdinInspector.Button("预览")] private void Preview() { if (m_ShowObject != null) { UnityEngine.Object.DestroyImmediate(m_ShowObject); } m_ShowObject = UnityEngine.Object.Instantiate(previewPrefab); m_Camera = previewCamera; if (m_ShowTexure != null) { RenderTexture.ReleaseTemporary(m_ShowTexure); } m_ShowTexure = RenderTexture.GetTemporary(m_ResolutionX, m_ResolutionY, m_RenderTextureDepthBuffer); // m_ShowObject.SetLayerRecursively(LayerDefine.UI3DObject); m_Camera.targetTexture = m_ShowTexure; GetComponent().texture = m_ShowTexure; } #endif public void SetUp(GameObject obj) { m_ShowObject = obj; // m_Camera = CameraManaer.Instance.UI3DRenderCamera; if (m_ShowTexure != null) { RenderTexture.ReleaseTemporary(m_ShowTexure); } m_ShowTexure = RenderTexture.GetTemporary(m_ResolutionX, m_ResolutionY, m_RenderTextureDepthBuffer); // m_ShowObject.SetLayerRecursively(LayerDefine.UI3DObject); m_Camera.targetTexture = m_ShowTexure; m_ShowImage.texture = m_ShowTexure; m_UI3DDisplayTouch.SetObject(m_ShowObject); } void OnDestroy() { m_UI3DDisplayTouch.Disopose(); if (m_ShowTexure != null) { RenderTexture.ReleaseTemporary(m_ShowTexure); } } } }