2025-02-13 17:21:18 +08:00
|
|
|
|
using DG.Tweening;
|
|
|
|
|
|
using QFramework;
|
2025-02-14 13:20:54 +08:00
|
|
|
|
using System;
|
2025-02-12 17:36:00 +08:00
|
|
|
|
using UnityEngine;
|
2025-02-14 13:20:54 +08:00
|
|
|
|
using UnityEngine.Events;
|
2025-02-12 17:36:00 +08:00
|
|
|
|
|
2025-03-26 14:11:26 +08:00
|
|
|
|
public class ObjDrag : MonoBehaviour, IObjDrag
|
2025-02-12 17:36:00 +08:00
|
|
|
|
{
|
|
|
|
|
|
private Vector3 offset;
|
2025-03-26 14:11:26 +08:00
|
|
|
|
bool isOn = false;
|
2025-02-12 17:36:00 +08:00
|
|
|
|
|
2025-02-13 17:21:18 +08:00
|
|
|
|
Vector3 startPosition;
|
|
|
|
|
|
|
2025-03-26 14:11:26 +08:00
|
|
|
|
UnityEvent<GameObject> OnDragEnd = new UnityEvent<GameObject>();
|
|
|
|
|
|
|
|
|
|
|
|
bool IObjDrag.isOn { get => isOn; set => isOn = value; }
|
|
|
|
|
|
UnityEvent<GameObject> IObjDrag.OnDragEnd
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (OnDragEnd == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
OnDragEnd = new UnityEvent<GameObject>();
|
|
|
|
|
|
}
|
|
|
|
|
|
return OnDragEnd;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-12 17:36:00 +08:00
|
|
|
|
void Start()
|
|
|
|
|
|
{
|
2025-02-13 17:21:18 +08:00
|
|
|
|
startPosition = gameObject.transform.position;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnMouseUp()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isOn)
|
|
|
|
|
|
{
|
|
|
|
|
|
Show3DCamera.instance.lockMove = false;
|
2025-02-14 13:20:54 +08:00
|
|
|
|
OnDragEnd?.Invoke(gameObject);
|
2025-02-13 17:21:18 +08:00
|
|
|
|
}
|
2025-02-12 17:36:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnMouseDown()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isOn)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Vector3 mouseWorldPos = GetMouseWorldPositionOnPlane();
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
|
|
|
|
|
offset = transform.position - mouseWorldPos;
|
2025-02-13 17:21:18 +08:00
|
|
|
|
Show3DCamera.instance.lockMove = true;
|
2025-02-12 17:36:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnMouseDrag()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isOn)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Vector3 mouseWorldPos = GetMouseWorldPositionOnPlane();
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
transform.position = mouseWorldPos + offset;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Vector3 GetMouseWorldPositionOnPlane()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵ<EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
Vector3 mouseScreenPos = Input.mousePosition;
|
2025-02-13 17:21:18 +08:00
|
|
|
|
mouseScreenPos.z = Camera.main.WorldToScreenPoint(transform.position).z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
2025-02-12 17:36:00 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-02-13 17:21:18 +08:00
|
|
|
|
Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(mouseScreenPos);
|
2025-02-12 17:36:00 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ķ<EFBFBD><C4B7>߷<EFBFBD><DFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
2025-02-13 17:21:18 +08:00
|
|
|
|
Vector3 cameraForward = Camera.main.transform.forward;
|
2025-02-12 17:36:00 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ƽ<EFBFBD>棬<EFBFBD><E6A3AC><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰλ<C7B0><CEBB>
|
|
|
|
|
|
Plane plane = new Plane(cameraForward, transform.position);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-02-13 17:21:18 +08:00
|
|
|
|
Ray ray = Camera.main.ScreenPointToRay(mouseScreenPos);
|
2025-02-12 17:36:00 +08:00
|
|
|
|
|
|
|
|
|
|
float distance;
|
|
|
|
|
|
if (plane.Raycast(ray, out distance))
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
|
|
|
|
|
return ray.GetPoint(distance);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ཻ<EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰλ<C7B0><CEBB>
|
|
|
|
|
|
return transform.position;
|
|
|
|
|
|
}
|
2025-02-13 17:21:18 +08:00
|
|
|
|
|
|
|
|
|
|
// ˫<><CBAB><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-02-14 13:20:54 +08:00
|
|
|
|
public void OnDoubleClick()
|
2025-02-13 17:21:18 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫִ<D2AA>е<EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>磬<EFBFBD><E7A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ʼλ<CABC><CEBB>
|
|
|
|
|
|
//transform.position = startPosition;
|
2025-02-19 13:07:05 +08:00
|
|
|
|
transform.DOMove(startPosition, 0.1f);
|
2025-02-13 17:21:18 +08:00
|
|
|
|
}
|
2025-02-12 17:36:00 +08:00
|
|
|
|
}
|