using System; using UnityEngine; using UnityEngine.UI; namespace SceneView { public class CanvasControl : MonoBehaviour { public const string ViewCanvasName = "_SceneViewCanvas"; public const string ShowAim = ""; public static Vector2 panelSize = new Vector2(500, 800); private static GameObject _focusObject; public SceneViewPanel? sceneViewPanel; public ParametersPanel? parametersPanel; public static GameObject FocusGameObject { get => _focusObject; set { if (value != _focusObject) { if (_focusObject) { var outline=_focusObject.GetComponent(); if (outline) Destroy(outline); } _focusObject = value; var outlineNew= _focusObject.AddComponent(); outlineNew.effectColor = Color.blue; outlineNew.effectDistance = new Vector2(1, -1); outlineNew.useGraphicAlpha = true; OnChangeFocusObject?.Invoke(value); } } } private void Start() { InitCanvas(); } public void Update() { if (Input.GetKeyDown(KeyCode.F3)) { // Debug.Log("切换"); parametersPanel.gameObject.SetActive(!parametersPanel.gameObject.activeSelf); sceneViewPanel.gameObject.SetActive(!sceneViewPanel.gameObject.activeSelf); } // if (sceneViewPanel.gameObject.activeSelf) // { // sceneViewPanel.Refresh(); // } } private void OnDestroy() { if (sceneViewPanel) Destroy(sceneViewPanel.gameObject); if (parametersPanel) Destroy(parametersPanel.gameObject); } public static event Action OnChangeFocusObject; private void InitCanvas() { var canvasObj = new GameObject(ViewCanvasName); var canvas = canvasObj.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 1000; canvasObj.AddComponent(); canvasObj.AddComponent(); DontDestroyOnLoad(canvasObj); sceneViewPanel = CreateSceneViewPanel(canvasObj.transform); parametersPanel = CreateParametersPanel(canvasObj.transform); } public static SceneViewPanel CreateSceneViewPanel(Transform parent) { var panelObj = new GameObject(ViewCanvasName); panelObj.transform.SetParent(parent, false); var sceneViewPanel = panelObj.AddComponent(); var panelImage = panelObj.AddComponent(); panelImage.color = new Color(0.5f, 0.5f, 0.5f, 0.3f); var rectTransform = panelObj.GetComponent(); rectTransform.sizeDelta = panelSize; return sceneViewPanel; } public ParametersPanel CreateParametersPanel(Transform parent) { var panelObj = new GameObject(ViewCanvasName); panelObj.transform.SetParent(parent, false); var parametersViewPanel = panelObj.AddComponent(); var panelImage = panelObj.AddComponent(); panelImage.color = new Color(0.5f, 0.5f, 0.5f, 0.3f); return parametersViewPanel; } } }