using System; using System.Drawing; using DG.Tweening; using Unity.VisualScripting; using UnityEngine; using Image = UnityEngine.UI.Image; public class CardVisual : MonoBehaviour { [Header("Card")] [SerializeField] private Card parentCard; [SerializeField] private Vector3 movementDelta; [SerializeField] private Vector3 rotationDelta; [SerializeField] private Image cardFace; [SerializeField] private GameObject shadow; [SerializeField] private int shadowSortOrderUp = 1; [Header("Follow Parameters")] [SerializeField] private float followSpeed = 30; [Header("Rotation Parameters")] [SerializeField] private float rotationAmount = 20; [SerializeField] private float rotationSpeed = 20; [Header("Scale Parameters")] [SerializeField] private bool scaleAnimations = true; [SerializeField] private float scaleOnHover = 1.15f; [SerializeField] private float scaleTransition = .15f; [SerializeField] private Ease scaleEase = Ease.OutBack; private Canvas _canvas; private Canvas _shadowCanvas; private int _shadowSortOrderDown; private void OnDisable() { if (parentCard != null) { parentCard.PointerEnter -= HandlePointerEnter; parentCard.PointerExit -= HandlePointerExit; } } public void Initialize(Card card, Sprite face) { parentCard = card; cardFace.sprite = face; _canvas = GetComponent(); _shadowCanvas = shadow.GetComponent(); _shadowSortOrderDown = _shadowCanvas.sortingOrder; parentCard.PointerEnter += HandlePointerEnter; parentCard.PointerExit += HandlePointerExit; } private void Update() { if (parentCard == null) return; SmoothFollow(); RotateWhenFollowing(); } private void SmoothFollow() { transform.position = Vector3.Lerp(transform.position, parentCard.transform.position, followSpeed * Time.deltaTime); } private void RotateWhenFollowing() { Vector3 movement = transform.position - parentCard.transform.position; movementDelta = Vector3.Lerp(movementDelta, movement, 25 * Time.deltaTime); Vector3 movementRotation = (parentCard.IsDragging ? movementDelta : movement) * rotationAmount; rotationDelta = Vector3.Lerp(rotationDelta, movementRotation, rotationSpeed * Time.deltaTime); transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, Mathf.Clamp(rotationDelta.x, -60, 60)); } private void HandlePointerEnter() { _canvas.overrideSorting = true; _shadowCanvas.sortingOrder = shadowSortOrderUp; if (scaleAnimations) transform.DOScale(scaleOnHover, scaleTransition).SetEase(scaleEase); } private void HandlePointerExit() { _canvas.overrideSorting = false; _shadowCanvas.sortingOrder = _shadowSortOrderDown; transform.DOScale(1, scaleTransition).SetEase(scaleEase); } }