Card/Assets/Scripts/Card.cs

141 lines
4.1 KiB
C#
Raw Permalink Normal View History

2025-01-07 20:54:54 +08:00
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System.Collections;
public class Card : MonoBehaviour
{
private Vector3 offset; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBFA8>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
private Camera mainCamera; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private Vector3 originalPosition; // <20><><EFBFBD>Ƶij<C6B5>ʼλ<CABC><CEBB>
private bool isRaised = false; // <20><><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD>̧<EFBFBD><CCA7>
private float raiseHeight = 0.5f; // ̧<><CCA7><EFBFBD>߶<EFBFBD>
private bool isDragging = false; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ק
private Plane dragPlane; // <20><>קƽ<D7A7><C6BD>
void Start()
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mainCamera = Camera.main;
if (mainCamera == null)
{
Debug.LogError("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>Ϊ MainCamera Tag<61><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飡");
return;
}
// <20><>¼<EFBFBD><C2BC><EFBFBD>Ƴ<EFBFBD>ʼλ<CABC><CEBB>
originalPosition = transform.position;
}
void OnMouseDown()
{
if (mainCamera == null) return;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><>
if (IsPointerOverUIObject())
{
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD>϶<EFBFBD>");
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>קƽ<D7A7>ƽ<E6A3BA><EFBFBD><E6B7A8><EFBFBD><EFBFBD>Ϊ Vector3.up<75><70><EFBFBD><EFBFBD> Y <20><>ƽ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>߶<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>Ƶĵ<C6B5>ǰ Y ֵ
dragPlane = new Plane(Vector3.up, transform.position);
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ƫ<EFBFBD><C6AB>
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (dragPlane.Raycast(ray, out float enter))
{
Vector3 hitPoint = ray.GetPoint(enter); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
offset = transform.position - hitPoint; // <20><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD>" + offset);
}
else
{
Debug.LogError("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>קƽ<D7A7><C6BD><EFBFBD>ཻ");
return;
}
// ̧<><CCA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!isRaised)
{
isRaised = true;
StopAllCoroutines(); // ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
StartCoroutine(MoveToPosition(transform.position + new Vector3(0, raiseHeight, 0), 0.2f)); // ƽ<><C6BD>̧<EFBFBD><CCA7>
}
isDragging = true; // <20><>ʼ<EFBFBD><CABC>ק
}
void OnMouseDrag()
{
if (!isDragging || mainCamera == null) return;
// ʹ<><CAB9><EFBFBD><EFBFBD>קƽ<D7A7><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (dragPlane.Raycast(ray, out float enter))
{
Vector3 hitPoint = ray.GetPoint(enter); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
transform.position = new Vector3(hitPoint.x + offset.x, originalPosition.y, hitPoint.z + offset.z); // <20>̶<EFBFBD> Y ֵ
Debug.Log("<22><>ק<EFBFBD>п<EFBFBD><D0BF><EFBFBD>λ<EFBFBD>ã<EFBFBD>" + transform.position);
}
else
{
Debug.LogError("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>קƽ<D7A7><C6BD><EFBFBD>ཻ");
}
}
void OnMouseUp()
{
if (!isDragging) return;
isDragging = false;
// <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD>
if (isRaised)
{
isRaised = false;
StopAllCoroutines();
StartCoroutine(MoveToPosition(new Vector3(transform.position.x, originalPosition.y, transform.position.z), 0.2f)); // ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD>" + transform.position);
}
// ƽ<><C6BD><EFBFBD>ƶ<EFBFBD>Э<EFBFBD><D0AD>
private IEnumerator MoveToPosition(Vector3 targetPosition, float duration)
{
Vector3 startPosition = transform.position;
float time = 0f;
while (time < duration)
{
time += Time.deltaTime;
transform.position = Vector3.Lerp(startPosition, targetPosition, time / duration);
yield return null;
}
transform.position = targetPosition; // ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><>
private bool IsPointerOverUIObject()
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> EventSystem
if (EventSystem.current == null)
{
Debug.LogWarning("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><C8B1> EventSystem<65><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> EventSystem<65><6D>");
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><>
PointerEventData eventData = new PointerEventData(EventSystem.current)
{
position = Input.mousePosition
};
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventData, results);
return results.Count > 0;
}
}