103 lines
2.7 KiB
C#
Raw Normal View History

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
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()
{
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-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;
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;
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>
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>
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>
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;
}
// ˫<><CBAB><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-02-14 13:20:54 +08:00
public void OnDoubleClick()
{
// <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-12 17:36:00 +08:00
}