OldBlueWater/BlueWater/Assets/02.Scripts/AssaultMode/DraggableCard.cs
NTG 2da1b44a53 Closes #70 #79 #87
+ Layer Boids, Boid로 분리
+ Fish의 로직을 Boids(군집) 알고리즘으로 변경
+ 군집에 이펙트를 통해 낚시 가시성 추가
+ 테스트용 군집 애니메이션 추가
+ Epic Toon EX 에셋의 스크립트 수정 버전
  ㄴ ParticleWeapon(Layer 선택, UnityEvent Hit 델리게이트 기능 추가) 사용
+ Cannon의 x축 회전 고정
+ Cannon이 공격한 Layer에 따른 기능 변경
+ DataManager에 PlayerInventory 추가
  ㄴ 초창기에 사용한 코딩 삭제
+ 초창기에 사용했던 스크립트들 일부 정리
2024-01-03 06:39:53 +09:00

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 = CameraManager.Inst.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 = CameraManager.Inst.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;
}
}
}
}