1创建UnityHelper.cs
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class UnityHelper
{
/// <summary>
/// 简化向EventTrigger组件添加事件的操作。
/// </summary>
/// <param name="_eventTrigger">要添加事件监听的UI元素上的组件。
/// <param name="_eventType">监听事件类型</param>
/// <param name="_unityAction">监听事件触发的函数</param>
public static void EventTriggerAddEvent(EventTrigger _eventTrigger, EventTriggerType _eventType, UnityAction<BaseEventData> _unityAction)
{
if (_eventTrigger == null)
{
return;
}
//创建一个新的UnityAction<BaseEventData>委托实例,指向传入的_unityAction
UnityAction<BaseEventData> action = new UnityAction<BaseEventData>(_unityAction);
//检查_eventTrigger的triggers列表是否已包含事件。如果有,遍历这些事件,寻找匹配_eventType的事件。
//如果找到匹配项,则直接将_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对象,设置其eventID为_eventType,
//并将之前创建的委托添加到其callback中,最后将这个新事件条目添加到_eventTrigger的triggers列表里。
//定义所要绑定的事件类型
EventTrigger.Entry entry = new EventTrigger.Entry();
//设置事件类型
entry.eventID = _eventType;
//设置回掉函数
entry.callback.AddListener(action);
//添加触发事件到EventTrigger组件上
_eventTrigger.triggers.Add(entry);
}
}
2.新建下列代码后组件绑定与配置
using System;
using UnityEngine;
using UnityEngine.EventSystems;
//拖动调整ui大小
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;//父级UI组件的RectTransform,用于调整大小和位置
private Vector2 lastPosition;//父级的x,y坐标
private EventTrigger eventTrigger;
private bool isDragging = false;
private CJCE_Component cjce_component;//父级组件,用于通信是否正在拖动状态。
//public bool limitHorizontalAxis;//限制拖动时的轴向移动。
//public bool limitVerticalAxis;
public Action<ComponentBoxPoint> draggingEvent;//拖动委托事件
public Action<ComponentBoxPoint> onPointerDownEvent;//按下
public Action<ComponentBoxPoint> onPointerUpEvent;//松开
public Vector2 dragOffset;//拖动偏移量
//坐标系转换成一致的坐标系
private Camera panelCamera; // 渲染拖拽物体所在的Canvas的相机
//canvas渲染方式:Screen Space - Overlay—>像素;Screen Space - Camera或World Space—>世界坐标系统,通常以米为单位
//private Canvas uiCanvas; // 脚本所挂载对象所在的Canvas
private float scalex;//获取Canvas的缩放
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>();
// 寻找带有"PanelCamera"标签的相机
GameObject cameraObj = GameObject.FindGameObjectWithTag("tagname");
if (cameraObj != null)
{
panelCamera = cameraObj.GetComponent<Camera>();
}
// 寻找带有"PPT"标签的Canvas
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;
//Vector2 _offset = eventData.delta;
//if (limitHorizontalAxis)
//{
// _offset.x = 0;
//}
//if (limitVerticalAxis)
//{
// _offset.y = 0;
//}
//dragOffset = _offset;
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);//恢复光标状态
}
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » unity 实现图片的放大与缩小(根据鼠标位置拉伸放缩)
发表评论 取消回复