using System.Collections; using BlueWaterProject; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class DraggableCard : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler { [Title("Card")] private Vector3 originalPosition; private Vector3 originalScale; private CanvasGroup canvasGroup; private GameObject border; public Card card; [Title("Child Object")] private Image typeImage; [InfoBox("카드가 작아지는 속도 입니다. 높을수록 천천히 작아집니다.")] [Range(0f, 1000f)] public float maxDistance = 500f; private Coroutine scaleDown; private void Awake() { border = transform.Find("Border").gameObject; typeImage = transform.Find("Type").GetComponent(); } private void Start() { canvasGroup = GetComponent(); } public void CardInit() { var cardInfo = DataManager.Inst.GetPirateUnitStatDictionaryFromKey(card.UnitIdx); var captainStat = DataManager.Inst.GetPirateStatDictionaryFromKey(cardInfo.CaptainStatIdx); typeImage.sprite = DataManager.Inst.cardType[(int)captainStat.UnitType]; } public void OnPointerDown(PointerEventData eventData) { var transform1 = transform; originalPosition = transform1.position; originalScale = transform1.localScale; canvasGroup.alpha = 0.5f; //transform1.localScale = new Vector3(0.3f, 0.3f, 1f); if (scaleDown != null) StopCoroutine(scaleDown); scaleDown = StartCoroutine(ScaleDown()); } public void OnDrag(PointerEventData eventData) { transform.position = Input.mousePosition; var ray = GameManager.Inst.CameraController.MainCam.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit) && hit.collider.CompareTag("Ground")) { // 마우스가 Ground 위에 있을 때 border.SetActive(true); } else { // 마우스가 Ground 위에 없을 때 border.SetActive(false); } } public void OnPointerUp(PointerEventData eventData) { // 지형에 올바르게 드롭되지 않으면 if (IsDroppedOnTarget()) return; if (scaleDown != null) { StopCoroutine(scaleDown); scaleDown = null; } var transform1 = transform; transform1.position = originalPosition; transform1.localScale = originalScale; canvasGroup.alpha = 1; } private bool IsDroppedOnTarget() { var ray = GameManager.Inst.CameraController.MainCam.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (!Physics.Raycast(ray, out hit)) return false; if (!hit.collider.CompareTag("Ground")) return false; Destroy(gameObject); var obj = Instantiate(DataManager.Inst.boat, GameManager.Inst.ShipPlayer.transform.position, Quaternion.identity); var boat = obj.GetComponent(); boat.TypeCardSprite.sprite = typeImage.sprite; boat.Target = hit.point; boat.CardIndex = card.Idx; boat.OnLanded += UnitManager.Inst.PirateUnitCreateAndAssign; return true; } private IEnumerator ScaleDown() { var originalScale = transform.localScale; var targetScale = new Vector3(0.3f, 0.3f, 1f); while (true) { // 현재 위치와 원래 위치 사이의 거리를 계산 var distance = Vector3.Distance(originalPosition, transform.position); // 비율을 계산 (0 = 같은 위치, 1 = maxDistance만큼나 이상 떨어져 있음) var ratio = Mathf.Min(distance / maxDistance, 1f); // SmoothStep 사용하면, 천천히 시작해서 점차 빠르게 변화 // float의 경우만 사용할 수 있으므로, Vector3의 모든 요소에 일일이 적용 var newScale = new Vector3( Mathf.SmoothStep(originalScale.x, targetScale.x, ratio), Mathf.SmoothStep(originalScale.y, targetScale.y, ratio), Mathf.SmoothStep(originalScale.z, targetScale.z, ratio) ); // 조정한 스케일을 적용 transform.localScale = newScale; yield return null; } } } }