E_ElecCompetition/Electrical_inspectionCompet.../Assets/Script/event/MouseDragable.cs

92 lines
2.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using static MyFrameworkPure.CollectionsExtension;
using UnityEngine;
using UnityEngine.EventSystems;
using MyFrameworkPure;
using CommonScript;
public class MouseDragable : MonoBehaviour
{
[SerializeField] private MouseButton mouseButton = MouseButton.Left;
[SerializeField] private Collider[] attachColliders;//约束区域碰撞体
[SerializeField] private bool limitToCollider;//是否将拖拽物体限制到碰撞体表面
private float depth;
private Vector3 lastRayCastPos;
public bool only_z=false;
// Start is called before the first frame update
void Start()
{
EventTriggerListener.Get(gameObject).onBeginDrag_Data += OnBeginDrag;
EventTriggerListener.Get(gameObject).onDrag_Data += OnDrag;
}
void OnBeginDrag(GameObject go,PointerEventData e)
{
if(!enabled)
return;
if(e.button != (PointerEventData.InputButton)mouseButton)
return;
if(!e.enterEventCamera)
return;
depth = e.enterEventCamera.WorldToScreenPoint(transform.position).z;
}
void OnDrag(GameObject go, PointerEventData e)
{
if(!enabled)
return;
if (e.button != (PointerEventData.InputButton)mouseButton)
return;
Vector3 mousePos = new Vector3(e.position.x,e.position.y,depth);
//transform.position = e.pressEventCamera.ScreenToWorldPoint(mousePos);
if (only_z == true)
{
transform.position = new Vector3(transform.position.x, e.pressEventCamera.ScreenToWorldPoint(mousePos).y, e.pressEventCamera.ScreenToWorldPoint(mousePos).z);
}
else {
transform.position = e.pressEventCamera.ScreenToWorldPoint(mousePos);
}
if (!attachColliders.IsNullOrEmpty())
{
Ray ray = e.pressEventCamera.ScreenPointToRay(e.position);
RaycastHit[] hits = Physics.RaycastAll(ray);
RaycastHit hit = hits.FirstOrDefault(x => attachColliders.Contains(x.collider));
if (hit.collider != null)
{
// transform.position = hit.point;
//lastRayCastPos = hit.point;
if (only_z == true)
{
lastRayCastPos = new Vector3(transform.position.x, transform.position.y, transform.position.z);
}
else {
transform.position = hit.point;
lastRayCastPos = hit.point;
}
}
else if (limitToCollider)
{
transform.position = lastRayCastPos;
}
}
}
}