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; } } } }