using UnityEngine; using System; public class TextureOffsetDragger : MonoBehaviour { [SerializeField] private float dragThreshold = 10f; [SerializeField] private float dragSensitivity = 0.01f; [SerializeField] private bool invertXAxis = false; [SerializeField] private bool invertYAxis = false; private Material material; private Vector2 initialMousePosition; private Vector2 textureOffset = Vector2.zero; private bool isDragging = false; private bool isDisabled = true; private Camera mainCamera; void Start() { Renderer renderer = GetComponent(); material = renderer.sharedMaterial; mainCamera = Camera.main; textureOffset = material.GetVector("_Offset"); } public void SetDragingDisabled(int value) { isDisabled = Convert.ToBoolean(value); } void OnMouseDown() { if (isDisabled) return; isDragging = false; initialMousePosition = Input.mousePosition; } void OnMouseDrag() { if (isDisabled) return; Vector2 currentMousePosition = Input.mousePosition; float dragDistance = Vector2.Distance(initialMousePosition, currentMousePosition); if (!isDragging) { if (dragDistance > dragThreshold) { isDragging = true; } else { return; } } if (isDragging) { Vector2 delta = (Vector2)currentMousePosition - initialMousePosition; UpdateTextureOffset(delta); initialMousePosition = currentMousePosition; } } void OnMouseUp() { if (isDisabled) return; isDragging = false; } private void UpdateTextureOffset(Vector2 screenDelta) { // 获取物体的法线方向(假设是平面) Vector3 objectNormal = transform.forward; // 获取相机的上方向和右方向 Vector3 cameraUp = mainCamera.transform.up; Vector3 cameraRight = mainCamera.transform.right; // 将屏幕delta转换为世界空间移动 Vector3 worldDelta = (cameraRight * screenDelta.x + cameraUp * screenDelta.y) / Screen.width; // 计算相对于物体的本地移动 Vector3 localDelta = transform.InverseTransformDirection(worldDelta); // 应用灵敏度和反转设置 float xMove = localDelta.x * dragSensitivity; float yMove = localDelta.y * dragSensitivity; xMove *= invertXAxis ? -1 : 1; yMove *= invertYAxis ? -1 : 1; textureOffset += new Vector2(xMove, yMove); material.SetVector("_Offset", textureOffset); } }