Files
DuckovMods/SceneView/CanvasControl.cs
2025-11-18 18:45:14 +08:00

107 lines
3.6 KiB
C#

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<Outline>();
if (outline)
Destroy(outline);
}
_focusObject = value;
var outlineNew= _focusObject.AddComponent<Outline>();
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<GameObject> OnChangeFocusObject;
private void InitCanvas()
{
var canvasObj = new GameObject(ViewCanvasName);
var canvas = canvasObj.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.sortingOrder = 1000;
canvasObj.AddComponent<CanvasScaler>();
canvasObj.AddComponent<GraphicRaycaster>();
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<SceneViewPanel>();
var panelImage = panelObj.AddComponent<Image>();
panelImage.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
var rectTransform = panelObj.GetComponent<RectTransform>();
rectTransform.sizeDelta = panelSize;
return sceneViewPanel;
}
public ParametersPanel CreateParametersPanel(Transform parent)
{
var panelObj = new GameObject(ViewCanvasName);
panelObj.transform.SetParent(parent, false);
var parametersViewPanel = panelObj.AddComponent<ParametersPanel>();
var panelImage = panelObj.AddComponent<Image>();
panelImage.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
return parametersViewPanel;
}
}
}