141 lines
4.1 KiB
C#
141 lines
4.1 KiB
C#
|
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;
|
|||
|
}
|
|||
|
}
|