1创建UnityHelper.cs
using UnityEngine. Events ;
using UnityEngine. EventSystems ; public class UnityHelper
{ public static void EventTriggerAddEvent ( EventTrigger _eventTrigger, EventTriggerType _eventType, UnityAction< BaseEventData> _unityAction) { if ( _eventTrigger == null ) { return ; } UnityAction< BaseEventData> action = new UnityAction< BaseEventData> ( _unityAction) ; if ( _eventTrigger. triggers. Count != 0 ) { for ( int i = 0 ; i < _eventTrigger. triggers. Count; i++ ) { if ( _eventTrigger. triggers[ i] . eventID == _eventType) { _eventTrigger. triggers[ i] . callback. AddListener ( _unityAction) ; return ; } } } EventTrigger. Entry entry = new EventTrigger. Entry ( ) ; entry. eventID = _eventType; entry. callback. AddListener ( action) ; _eventTrigger. triggers. Add ( entry) ; }
}
2.新建下列代码后组件绑定与配置
using System ;
using UnityEngine ;
using UnityEngine. EventSystems ;
public class ComponentBoxPoint : MonoBehaviour , IDragHandler
{ public enum BoxPoint { UpperLeft, UpperCenter, UpperRight, MiddleLeft, MiddleRight, LowerLeft, LowerCenter, LowerRight, } public BoxPoint boxPoint; public Texture2D cursorTexture; private RectTransform componentRectTransform; private Vector2 lastPosition; private EventTrigger eventTrigger; private bool isDragging = false ; private CJCE_Component cjce_component; public Action< ComponentBoxPoint> draggingEvent; public Action< ComponentBoxPoint> onPointerDownEvent; public Action< ComponentBoxPoint> onPointerUpEvent; public Vector2 dragOffset; private Camera panelCamera; private float scalex; private float scaley; private float posX; private float posY; private float width; private float height; private void Start ( ) { Init ( ) ; InitUIEvent ( ) ; } private void Init ( ) { componentRectTransform = this . transform. parent. GetComponent < RectTransform> ( ) ; lastPosition = componentRectTransform. position; eventTrigger = this . GetComponent < EventTrigger> ( ) ; cjce_component = this . GetComponentInParent < CJCE_Component> ( ) ; GameObject cameraObj = GameObject. FindGameObjectWithTag ( "tagname" ) ; if ( cameraObj != null ) { panelCamera = cameraObj. GetComponent < Camera> ( ) ; } GameObject canvasObj = GameObject. FindGameObjectWithTag ( "tagname" ) ; Transform transformComponent = canvasObj. GetComponent < Transform> ( ) ; Vector3 scale = transformComponent. localScale; scalex = scale. x; scaley = scale. y; } private void InitUIEvent ( ) { UnityHelper. EventTriggerAddEvent ( eventTrigger, EventTriggerType. PointerEnter, OnPointerEnter) ; UnityHelper. EventTriggerAddEvent ( eventTrigger, EventTriggerType. PointerDown, OnPointerDown) ; UnityHelper. EventTriggerAddEvent ( eventTrigger, EventTriggerType. PointerUp, OnPointerUp) ; UnityHelper. EventTriggerAddEvent ( eventTrigger, EventTriggerType. PointerExit, OnPointerExit) ; } public void OnPointerEnter ( BaseEventData eventData) { Cursor. SetCursor ( cursorTexture, new Vector2 ( cursorTexture. width / 2F , cursorTexture. height / 2f ) , CursorMode. Auto) ; } public void OnPointerDown ( BaseEventData eventData) { Cursor. SetCursor ( cursorTexture, new Vector2 ( cursorTexture. width / 2F , cursorTexture. height / 2f ) , CursorMode. Auto) ; isDragging = true ; if ( cjce_component) { cjce_component. boxPointIsDraggin = isDragging; } if ( onPointerDownEvent != null ) { onPointerDownEvent ( this ) ; } lastPosition = componentRectTransform. position; posX = lastPosition. x; posY = lastPosition. y; width = componentRectTransform. rect. width; height = componentRectTransform. rect. height; } public void OnDrag ( PointerEventData eventData) { Vector3 mousePosition = Input. mousePosition; mousePosition. z = panelCamera. nearClipPlane; Vector3 worldMousePosition = panelCamera. ScreenToWorldPoint ( mousePosition) ; float mouseX = worldMousePosition. x; float mouseY = worldMousePosition. y; switch ( boxPoint) { case BoxPoint. UpperLeft: componentRectTransform. position = new Vector3 ( mouseX, mouseY, 0 ) ; componentRectTransform. sizeDelta = new Vector2 ( ( - mouseX + posX) / scalex + width, ( mouseY - posY) / scaley + height) ; break ; case BoxPoint. UpperCenter: componentRectTransform. position = new Vector3 ( posX, mouseY, 0 ) ; componentRectTransform. sizeDelta = new Vector2 ( width, ( mouseY - posY) / scaley + height) ; break ; case BoxPoint. UpperRight: componentRectTransform. position = new Vector3 ( posX, posY + ( mouseY - posY) , 0 ) ; componentRectTransform. sizeDelta = new Vector2 ( ( mouseX - posX) / scalex, ( mouseY - posY) / scaley + height) ; break ; case BoxPoint. MiddleLeft: componentRectTransform. position = new Vector3 ( mouseX, posY, 0 ) ; componentRectTransform. sizeDelta = new Vector2 ( ( - mouseX + posX) / scalex + width, height) ; break ; case BoxPoint. MiddleRight: componentRectTransform. sizeDelta = new Vector2 ( ( mouseX - posX) / scalex, height) ; break ; case BoxPoint. LowerLeft: componentRectTransform. position = new Vector3 ( mouseX, posY, 0 ) ; componentRectTransform. sizeDelta = new Vector2 ( ( - mouseX + posX) / scalex + width, ( - mouseY + posY) / scaley) ; break ; case BoxPoint. LowerCenter: componentRectTransform. sizeDelta = new Vector2 ( width, ( - mouseY + posY) / scaley) ; break ; case BoxPoint. LowerRight: componentRectTransform. sizeDelta = new Vector2 ( ( mouseX - posX) / scalex, ( - mouseY + posY) / scaley) ; break ; default : break ; } if ( draggingEvent != null ) { draggingEvent ( this ) ; } } public void OnPointerUp ( BaseEventData eventData) { Cursor. SetCursor ( null , Vector2. zero, CursorMode. Auto) ; isDragging = false ; if ( cjce_component) { cjce_component. boxPointIsDraggin = isDragging; } if ( onPointerUpEvent != null ) { onPointerUpEvent ( this ) ; } lastPosition = componentRectTransform. position; posX = lastPosition. x; posY = lastPosition. y; width = componentRectTransform. rect. width; height = componentRectTransform. rect. height; } public void OnPointerExit ( BaseEventData eventData) { if ( isDragging) { return ; } Cursor. SetCursor ( null , Vector2. zero, CursorMode. Auto) ; } }