Unity中鼠标控制3D物体进行拖拽

这篇具有很好参考价值的文章主要介绍了Unity中鼠标控制3D物体进行拖拽。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

轴方向上的移动

拖拽

1 、获取3D物体在世界坐标的位置转换屏幕坐标

 Camera.main.WorldToScreenPoint(dragBeforeGameObjPos)

2、鼠标在屏幕的坐标与物体在屏幕的坐标Z轴进行拟合

Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z))

3、获取3D物体与拟合出来的坐标的偏移量

 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z));

4、通过向量投影得到移动坐标

 Vector3.Project(currentPosition, transform.right) + Vector3.Project(dragBeforeGameObjPos, transform.up) + Vector3.Project(dragBeforeGameObjPos, transform.forward);

5、上干货,附带手指控制,手指控制逻辑同鼠标一样

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PointAxis : MonoBehaviour
{
    public bool IsBeSelected;
    [SerializeField]
    private PointAxis_Type curPAType;

    private bool isMouseDrag = false;
    private Vector3 screenPosition;
    private Vector3 offset;
    private Vector3 dragBeforeGameObjPos;
    void Start()
    {

        //parentTransform = transform.parent;
        //mr = GetComponent<MeshRenderer>();
        switch (curPAType)
        {
            case PointAxis_Type.Axis_X:
                //colorNormal = ColorNormalX;
                break;
            case PointAxis_Type.Axis_Y:
                //colorNormal = ColorNormalY;
                break;
            case PointAxis_Type.Axis_Z:
                //colorNormal = ColorNormalZ;
                break;
        }

    }

    // Update is called once per frame
    void Update()
    {
#if (UNITY_ANDROID || UNITY_IPHONE)
         if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
         {
            dragBeforeGameObjPos = transform.position;
            screenPosition = Camera.main.WorldToScreenPoint(dragBeforeGameObjPos);
            offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPosition.z));
            isMouseDrag = true;
        }


         if (Input.touchCount > 0 &&Input.GetTouch(0).phase == TouchPhase.Moved)
        {
            if (isMouseDrag && IsBeSelected)
            {
                //Debug.Log("开始拖拽了");
                Vector3 currentScreenSpace = new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPosition.z);
                Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenSpace) + offset;
               // float tempLength = Vector3.Distance(currentPosition, transform.position);
                Vector3 tempPos = Vector3.zero;
                switch (curPAType)
                {
                    case PointAxis_Type.Axis_X:
                        tempPos = Vector3.Project(currentPosition, transform.right) + Vector3.Project(dragBeforeGameObjPos, transform.up) + Vector3.Project(dragBeforeGameObjPos, transform.forward);
                        break;
                    case PointAxis_Type.Axis_Y:
                        tempPos = Vector3.Project(currentPosition, transform.up) + Vector3.Project(dragBeforeGameObjPos, transform.right) + Vector3.Project(dragBeforeGameObjPos, transform.forward);
                        break;
                    case PointAxis_Type.Axis_Z:
                        tempPos = Vector3.Project(currentPosition, transform.forward) + Vector3.Project(dragBeforeGameObjPos, transform.up) + Vector3.Project(dragBeforeGameObjPos, transform.right);
                        break;
                }
                transform.position = tempPos;
            }
        }
        

         if(Input.GetTouch(0).phase == TouchPhase.Ended)
            isMouseDrag = false;
#else

        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            dragBeforeGameObjPos = transform.position;
            screenPosition = Camera.main.WorldToScreenPoint(dragBeforeGameObjPos);
            offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z));
            isMouseDrag = true;
        }
        if (Input.GetKey(KeyCode.Mouse0))
        {
            if (isMouseDrag && IsBeSelected)
            {
                Vector3 currentScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
                Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenSpace) + offset;
                Vector3 tempPos = Vector3.zero;
                switch (curPAType)
                {
                    case PointAxis_Type.Axis_X:
                        tempPos = Vector3.Project(currentPosition, transform.right) + Vector3.Project(dragBeforeGameObjPos, transform.up) + Vector3.Project(dragBeforeGameObjPos, transform.forward);
                        break;
                    case PointAxis_Type.Axis_Y:
                        tempPos = Vector3.Project(currentPosition, transform.up) + Vector3.Project(dragBeforeGameObjPos, transform.right) + Vector3.Project(dragBeforeGameObjPos, transform.forward);
                        break;
                    case PointAxis_Type.Axis_Z:
                        tempPos = Vector3.Project(currentPosition, transform.forward) + Vector3.Project(dragBeforeGameObjPos, transform.up) + Vector3.Project(dragBeforeGameObjPos, transform.right);
                        break;
                }
                transform.position = tempPos;
            }
        }
        if (Input.GetKeyUp(KeyCode.Mouse0))
            isMouseDrag = false;
#endif

    }
}
public enum PointAxis_Type
{
    Axis_X, Axis_Y, Axis_Z
}

自由拖拽移动

自由拖拽

自由拖拽同上不同的是 获取3D物体与拟合出来的坐标的加上偏移量限制Y轴坐标就搞定了,

话不多说上干货文章来源地址https://www.toymoban.com/news/detail-843531.html

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PointEntity : MonoBehaviour
{

    public bool IsBeSelected = false;
    private bool isMouseDrag = false;
    private Vector3 screenPosition;
    private Vector3 offset;
    
    void Start()
    {
    }
    
    void Update()
    {
#if (UNITY_ANDROID || UNITY_IPHONE)
          if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
         {
             screenPosition = Camera.main.WorldToScreenPoint(gameObject.transform.position);
            offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPosition.z));
            isMouseDrag = true;
        }


         if (Input.touchCount > 0 &&Input.GetTouch(0).phase == TouchPhase.Moved)
        {
            if (isMouseDrag && IsBeSelected)
            {
                //Debug.Log("开始拖拽了");
                Vector3 currentScreenSpace = new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPosition.z);
                Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenSpace) + offset;
                currentPosition = new Vector3(currentPosition.x, transform.position.y, currentPosition.z);
                gameObject.transform.position = currentPosition;
            }
        }
        
         if(Input.GetTouch(0).phase == TouchPhase.Ended)
            isMouseDrag = false;
#else
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            screenPosition = Camera.main.WorldToScreenPoint(gameObject.transform.position);
            offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z));
            isMouseDrag = true;
        }
        if (Input.GetKey(KeyCode.Mouse0))
        {
            if (isMouseDrag && IsBeSelected)
            {
                //Debug.Log("开始拖拽了");
                Vector3 currentScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
                Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenSpace) + offset;
                currentPosition = new Vector3(currentPosition.x, transform.position.y, currentPosition.z);
                gameObject.transform.position = currentPosition;
            }
        }
        if (Input.GetKeyUp(KeyCode.Mouse0))
        {
            isMouseDrag = false;
        }
#endif
    }
}

到了这里,关于Unity中鼠标控制3D物体进行拖拽的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D实现鼠标悬浮UI或物体上显示文字信息

    Unity工具 大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 本篇文章实现一个鼠标悬浮在ui或者物体上显示文字的功能 unity鼠标悬浮ui显示文字 鼠标进入UI执行的 鼠标离开UI执行的 鼠标在ui里滑动执行的 1. 2. 搭建比较简单,各位顺便搭建吧。

    2024年02月04日
    浏览(95)
  • Unity3D 控制物体移动且自动旋转

    直接上代码(改脚本挂载到游戏物体上) 第三人称摄像机移动

    2024年02月15日
    浏览(83)
  • Unity实现鼠标拖拽多物体(拖拽单物体的拓展)

    学习了B站UP主OneCredit【Unity快速教学】鼠标拖曳甩动物件BV1qK4y1d7iZ的教学视频后 拓展了一下功能,实现多个物体也可以拖拽,互不受影响 主要是做了一个检测,在鼠标上物体才能被拖拽 目录 bool Drag 拖拽物体的实现 解决摄像机视角的影响 绑定刚体,写好需要用到的变量 Dr

    2024年03月24日
    浏览(61)
  • 【Unity3D】Unity 脚本 ③ ( C# 脚本的执行入口函数 | 获取当前游戏物体及物体名称 | 获取游戏物体的 Transform 组件数据 | UnityEngine 命名空间简介 )

    在 C# 脚本中控制 游戏物体 GameObject 运动 , 要先获取该物体 , 然后 修改其 Transform 组件的属性 ; 在 游戏开始运行后 , 会自动执行 游戏物体 GameObject 上的 C# 组件代码 , 程序入口是 MonoBehaviour#Start() 函数 ; 在 C# 脚本中 , 主要的内容都在 Start() 函数 中实现 ; 在 C# 脚本中 , 游戏物体

    2023年04月12日
    浏览(89)
  • Unity3D:当频繁隐藏和显示游戏物体时,最优的处理方式

    首先说明一下处理的方法一般一共有3种 1.SetActive显示和隐藏物体【不推荐】 优:停止了Update和LateUpdate的性能消耗 劣:每一次显示会调用OnEnable,每一次隐藏会调用OnDisable 2.设置物体的位置,使物体移出摄像机的视野【不推荐】 优:相比较SetActive来说,没什么性能消耗 劣:

    2024年02月12日
    浏览(49)
  • 控制renderQueue解决NGUI与Unity3D物体渲染顺序问题

    NGUI与Unity3D物体渲染顺序问题,做过UI的各位应该都遇到过。主要指的是UI与Unity制作的特效、3D人物等一同显示时的层次问题。 由于UI与特效等都是以transparent方式渲染,而Unity与NGUI在管理同是透明物体的render queue时实际上互相没有感知,于是引出排序问题。现在介绍以render

    2024年02月13日
    浏览(54)
  • Unity3d用Animator实现鼠标控制多个门开关

    本人Unity3d小白,目前正在学习U3d,这个功能想用Animator实现,从Key帧到写脚本摸索了三天时间,走了不少弯路,搜了不少实例,有版本改版原因也有的是在Unity中搭建的小场景,不涉及父物体,总之开始做的功能没有实现。现在把我实现的方法记录下来,算是对个功能的总结

    2024年02月13日
    浏览(68)
  • Unity3D通过代码修改RGB值来控制UI与物体的Color颜色

    在实际应用过程中,经常有需要将某一物体颜色修改成特定颜色的情况,此时Color中自带的颜色就不够用了,此时我们就需要通过用代码修改RGB值来控制颜色。 下面以修改TextMeshProUGUI的字体颜色为例 这样直接运行,无论Color后的括号里是什么样的参数,字体颜色大概率为白色

    2024年02月11日
    浏览(64)
  • Unity3D摄像机,键盘控制前后左右上下移动,鼠标控制旋转、放缩

    Unity3D中运行场景时,实现摄像机的前、后、左、右、上、下,以及鼠标滚轮的放缩,鼠标右键的旋转操作。亲测有效,可供参考。 按键功能介绍:W——前;S——后;A——左;D——右;Q——下降;E——上升;鼠标右键——旋转;鼠标滚轮——放缩。 Tourcamera脚本需要挂在摄

    2024年02月11日
    浏览(62)
  • unity2d里实现鼠标拖拽物体的功能

    在 Unity 中实现鼠标拖拽物体的功能需要使用到 Unity 的 Physics 系统。 要实现鼠标拖拽物体,你需要在场景中添加以下内容: 一个 Rigidbody 2D 组件,用于控制物体的运动。 一个 Box Collider 2D 组件,用于检测鼠标与物体的碰撞。 一个脚本,用于监听鼠标的输入,并在鼠标按下时拖

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包