using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; namespace Michsky.UI.Heat { public class UISway : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler { public enum InputType { Mouse = 0, Touchscreen = 1 } [Header("Resources")] [SerializeField] private Canvas mainCanvas; [SerializeField] private Camera mainCamera; [SerializeField] private RectTransform swayObject; [Header("Settings")] [SerializeField] [Range(1f, 20f)] private float smoothness = 10f; [SerializeField] private InputType inputType; private bool allowSway; private Vector3 cursorPos; private Vector2 defaultPos; private void Start() { defaultPos = swayObject.anchoredPosition; if (mainCamera == null) { mainCamera = Camera.main; } if (mainCanvas == null) { mainCanvas = GetComponentInParent(); } if (swayObject == null) { swayObject = GetComponent(); } } private void Update() { if (allowSway && inputType == InputType.Mouse) { cursorPos = Mouse.current.position.ReadValue(); } else if (allowSway && inputType == InputType.Touchscreen) { cursorPos = Touchscreen.current.position.ReadValue(); } if (mainCanvas.renderMode == RenderMode.ScreenSpaceOverlay) { ProcessOverlay(); } else if (mainCanvas.renderMode == RenderMode.ScreenSpaceCamera) { ProcessSSC(); } } private void ProcessOverlay() { if (allowSway) { swayObject.position = Vector2.Lerp(swayObject.position, cursorPos, Time.unscaledDeltaTime * smoothness); } else { swayObject.localPosition = Vector2.Lerp(swayObject.localPosition, defaultPos, Time.unscaledDeltaTime * smoothness); } } private void ProcessSSC() { if (allowSway) { swayObject.position = Vector2.Lerp(swayObject.position, mainCamera.ScreenToWorldPoint(cursorPos), Time.unscaledDeltaTime * smoothness); } else { swayObject.localPosition = Vector2.Lerp(swayObject.localPosition, defaultPos, Time.unscaledDeltaTime * smoothness); } } public void OnPointerEnter(PointerEventData data) { allowSway = true; } public void OnPointerExit(PointerEventData data) { allowSway = false; } } }