代码改变世界

在屏幕拖拽3D物体移动

  糯米粥  阅读(1346)  评论(0编辑  收藏  举报

3D物体的拖拽不同于2D的。因为3D物体有x,y,z当然。实际拖拽还是在XZ平面。只是多了几个转换

复制代码
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class tuotuo : MonoBehaviour
 5 {
 6 
 7     Vector3 currPosition; //拖拽前的位置
 8     Vector3 newPosition; //拖拽后的位置
 9 
10     // Use this for initialization
11     void Start()
12     {
13 
14     }
15 
16     // Update is called once per frame
17     void Update()
18     {
19 
20     }
21 
22     /// <summary>
23     /// 开始拖拽 3D物体 拖拽是在平面拖拽 即 xy平面
24     /// </summary>
25     void OnMouseDrag()
26     {
27         //1:把物体的世界坐标转为屏幕坐标 (依然会保留z坐标)
28         currPosition = Camera.main.WorldToScreenPoint(transform.position);
29 
30         //2:更新物体屏幕坐标系的x,y
31         currPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, currPosition.z);
32 
33         //3:把屏幕坐标转为世界坐标
34         newPosition = Camera.main.ScreenToWorldPoint(currPosition);
35 
36         //4:更新物体的世界坐标
37         transform.position = newPosition;
38     }
39 }
复制代码

 

 OnMouseDrag只是MonoBehaviour的一个方法。如果想拖拽UGUI界面是不行的。必须继承接口
复制代码
using UnityEngine;
using System.Collections;
using DG.Tweening;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine.EventSystems;
public class newButton : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
  
    //自己的RectTransform
    RectTransform rf;
    //Vector3 oldPosition;//原来的位置,拖拽前的位置
    Vector3 newPosition;//拖拽中的位置
    bool isDrag; //是否开始拖拽
    public void OnEndDrag(PointerEventData eventData)
    {


    }

    public void OnDrag(PointerEventData eventData)
    {
        if (isDrag) //必须要执行了OnBeginDrag才执行OnDrag 有时候会遇到不执行OnBeginDrag
        {
            // 通过屏幕中的鼠标点,获取在父节点中的鼠标点
            RectTransformUtility.ScreenPointToWorldPointInRectangle(rf, eventData.position, eventData.enterEventCamera, out newPosition);
            rf.position = newPosition; //设置拖动的图片的位置
            //print(newPosition);
        }
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        isDrag = true;
    }
复制代码

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
'
点击右上角即可分享
微信分享提示