139 lines
4.9 KiB
C#
139 lines
4.9 KiB
C#
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<Image>();
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
canvasGroup = GetComponent<CanvasGroup>();
|
|
}
|
|
|
|
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>();
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
} |