com.alicizax.unity.ui.exten.../Runtime/UI3DWidget/UI3DDisplay.cs
2025-04-11 19:57:34 +08:00

109 lines
3.2 KiB
C#

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<RawImage>();
m_UI3DDisplayTouch = GetComponentInChildren<UI3DDisplayTouch>();
}
#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<RectTransform>();
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<RawImage>().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);
}
}
}
}