using System; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace CharacterPreview { public class ControlModelMove : MonoBehaviour, IDragHandler,IPointerDownHandler,IPointerEnterHandler,IPointerExitHandler { private RectTransform rectTransform; private Transform canvasRectTransform; //由滑动器自己创建的 private Vector2 lastMousePosition; private Image image; private TMP_Text text; private Button editButton; private TMP_Text editButtonText; public bool firstClick=true; public float Speed => ModBehaviour.config.data.editSpeed; //防止鼠标在范围外捕获消息 private bool canEdit = false; private void Awake() { } private void Start() { SetRectTransform(); SetText(); SetColor(); if(ModBehaviour.config.data.showSetEditButton) SetEditButton(); firstClick = ModBehaviour.config.data.tip; if (!firstClick) { HideTip(); } } private void OnDestroy() { if (canvasRectTransform) { Destroy(canvasRectTransform.gameObject); } } void Update() { if (!canEdit) return; var scroll = Input.GetAxis("Mouse ScrollWheel"); if (scroll != 0) { if (Input.GetMouseButton(1)) { ModBehaviour.modelMove.RotateAroundCameraZ(Speed * scroll * 8); } else if(Input.GetKey(KeyCode.LeftShift)) { ModBehaviour.modelMove.Scale(Speed*scroll/4f); } else { ModBehaviour.modelMove.Move(new Vector3(0, 0, Speed * scroll * 2)); } } if (Input.GetMouseButtonDown(2)) { if (Input.GetKey(KeyCode.LeftControl)) { ModBehaviour.modelMove.RefreshPosition(); } else { ModBehaviour.modelMove.LookAtCamera(); } } } public void SetColor() { var color = new Color(0.9f, 0.8f, 0.3f, 0.1f); image = gameObject.GetComponent(); if (!image) { image = gameObject.AddComponent(); } image.color = color; } public void SetText() { text=gameObject.GetComponentInChildren(); if (!text) { var textChilde = new GameObject("Text"); textChilde.transform.SetParent(gameObject.transform); var rect = textChilde.AddComponent(); text= textChilde.AddComponent(); rect.anchorMax = Vector2.one; rect.anchorMin = Vector2.zero; rect.offsetMin = Vector2.zero; rect.offsetMax = Vector2.zero; } text.fontSize = 24; text.alignment=TextAlignmentOptions.Center; text.text = "在此区域可以编辑模型状态(点击区域关闭提示)\n" + "通过鼠标左键拖动修改角色的上下左右位置\n" + "通过鼠标滚轮修改角色的z轴位置\n" + "通过鼠标右键控制角色旋转\n" + "按住右键的情况下滚动滚轮可让角色转圈\n" + "按住shift滚动滚轮可缩放角色\n" + "点按鼠标中键可让角色朝向摄像头\n" + "按住ctrl并点击中键则恢复默认位置"; } public void SetRectTransform() { if (!rectTransform) { rectTransform = GetComponent(); } if (!rectTransform) { rectTransform = gameObject.AddComponent(); } if (!rectTransform.parent) { var defaultCanvas = new GameObject("ControlModelMoveCanvas"); defaultCanvas.layer = LayerMask.NameToLayer("UI"); var canvas = defaultCanvas.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = -100; var canvasScaler = defaultCanvas.AddComponent(); canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; canvasScaler.referenceResolution = new Vector2(1600, 900); canvasScaler.matchWidthOrHeight = 1f; defaultCanvas.AddComponent(); canvasRectTransform = defaultCanvas.GetComponent(); canvasRectTransform.SetParent(null, false); canvasRectTransform.SetAsFirstSibling(); rectTransform.SetParent(defaultCanvas.transform); } rectTransform.SetAsFirstSibling(); rectTransform.anchorMax = Vector2.one; rectTransform.anchorMin = new Vector2(0.5f, 0); rectTransform.offsetMax = Vector2.zero; rectTransform.offsetMin = Vector2.zero; } public void SetEditButton() { if (!editButton) { var buttonObj = new GameObject("EditButton"); buttonObj.transform.SetParent(transform, false); var buttonRect= buttonObj.AddComponent(); buttonRect.anchorMax=Vector2.right; buttonRect.anchorMin=Vector2.right; buttonRect.pivot = Vector2.right; buttonRect.sizeDelta=new Vector2(80f,30f); buttonRect.anchoredPosition = new Vector2(-80, 5); var button = buttonObj.AddComponent