前提:
1.修改 渲染模式
Render Mode 为Screen Space - Camera
2. 修改 投影模式
Projection 为 Perspective (透视模式)
persp 透视模式-2D
Los 正交模式-3D
屏幕坐标 转为 世界坐标
方法一:
将鼠标的屏幕坐标 转为 世界坐标(物体随着鼠标移动)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragManager : ListenerEvent
{
public GameObject target;
public Camera UIcamera;
void Start()
{
target.SetActive(false);
}
void Update()
{
if (Input.GetMouseButton(0)&&!SysDefault.isMove)
{
target.SetActive(true);
// 将鼠标屏幕坐标转换为世界坐标
Vector3 mousePosition = Input.mousePosition;
// 设置鼠标位置的 z 坐标与 UI 相机相距的距离
mousePosition.z = UIcamera.nearClipPlane; // 你可以根据需要调整这个值(100)
Vector3 worldPosition = UIcamera.ScreenToWorldPoint(mousePosition);
target.transform.position = worldPosition;
}
}
}
- mousePosition.z: 设置鼠标位置的 z 坐标为相机的近裁剪面距离
- ScreenToWorldPoint(vector3 position): 将鼠标的屏幕坐标转换为世界坐标。
方法二:
在拖拽物体时,将屏幕坐标转为世界坐标
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems; // 导入命名空间 可使用拖拽 相关的接口
public class DragHandle : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler,IPointerDownHandler,IPointerUpHandler
{
//拖拽中
public void OnDrag(PointerEventData eventData)
{
Vector3 worldPos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.pressEventCamera, out worldPos))
{
transform.position = worldPos;
}
//transform.position = Input.mousePosition;
}
}
- public static bool ScreenPointToWorldPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector3 worldPoint);
- RectTransformUtility.ScreenPointToWorldPointInRectangle(rect, eventData.position, eventData.pressEventCamera, out worldPos)
- eventData为pressEventCamera,可以正常使用
- 如果eventData为enterEventCamera,拖动的速度加快会消失在 屏幕上,如果为其他物体的子级将不会出现问题,但父级要充满屏幕
(方法二:未深入了解)
标签:position,mousePosition,世界坐标,坐标,eventData,using,屏幕,public From: https://blog.csdn.net/LFJINNAN/article/details/141063259