Unity中拖拽3D物体并放入到指定位置

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

一、脚本编写

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DragTest : MonoBehaviour
{
    //3D目标
    public List<GameObject> listTargets = new List<GameObject>();
    //2D目标点
    public List<Image> listUITargets = new List<Image>();

    //操作模式
    bool isUI = false;

    public Button buttonUI;
    public Button buttonModel;

    //起始坐标
    Vector3 starPos;
    private void Start()
    {
        starPos = transform.localPosition;
        buttonUI.onClick.AddListener(()=>
        {
            isUI = true;
        });
        buttonModel.onClick.AddListener(() =>
        {
            isUI = false;
        });
    }

    public void OnMouseDrag()
    {
        Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
        Vector3 mouseScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPos.z);
        transform.position = Camera.main.ScreenToWorldPoint(mouseScreenPos);
        Debug.Log("OnMouseDrag");
    }

    public void OnMouseUp()
    {
        if (isUI==false)
        {
            //是否落位
            bool isTarget = false;
            foreach (GameObject item in listTargets)
            {
                if (GetOverGameObject(Camera.main.gameObject).Contains(item))
                {
                    isTarget = true;
                    transform.position = item.transform.position;
                    break;
                }
            }
            if (isTarget == false)
            {
                transform.position = starPos;
            }
        }
        else
        {
            foreach (Image item in listUITargets)
            {
                if (GetOverUI(GameObject.Find("Canvas")).Count>0)
                {
                    List<GameObject> listTemp = new List<GameObject>();
                    listTemp.AddRange(GetOverUI(GameObject.Find("Canvas")));
                    if (listTemp.Contains(item.gameObject))
                    {
                        //简单做一个变色效果,实际应用中可能会是改Image的sprite之类的操作
                        item.GetComponent<Image>().color = Color.green;
                        break;
                    }
                }
               
            }
            transform.position = starPos;
        }

        //有时候操作次数多了会出现不能拖拽的问题,暂时没去看是什么原因,将该对象关闭打开一次可暂时解决。
        gameObject.SetActive(false);
        gameObject.SetActive(true);
    }

    //获取光标停留的3D物体
    public List<GameObject> GetOverGameObject(GameObject raycaster)
    {
        PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
        pointerEventData.position = Input.mousePosition;
        PhysicsRaycaster pr = raycaster.GetComponent<PhysicsRaycaster>();
        List<RaycastResult> results = new List<RaycastResult>();
        pr.Raycast(pointerEventData, results);
        List<GameObject> listObjs = new List<GameObject>();
        if (results.Count != 0)
        {
            foreach (RaycastResult item in results)
            {
    
                listObjs.Add(item.gameObject);
            }
            //return listObjs;
        }
        return listObjs;
    }

    //获取光标停留的UI物体
    public List<GameObject> GetOverUI(GameObject canvas)
    {
        PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
        pointerEventData.position = Input.mousePosition;
        GraphicRaycaster gr = canvas.GetComponent<GraphicRaycaster>();
        List<RaycastResult> results = new List<RaycastResult>();
        gr.Raycast(pointerEventData, results);
        List<GameObject> listObjs = new List<GameObject>();
        if (results.Count != 0)
        {
            foreach (RaycastResult item in results)
            {
                listObjs.Add(item.gameObject);
            }
            //return listObjs;
        }
        return listObjs;
    }
}

二、编辑场景

1.新建一个cube作为我们用来拖拽的物体:

Unity中拖拽3D物体并放入到指定位置

 2.给该cube添加我们刚刚编写的脚本:

Unity中拖拽3D物体并放入到指定位置

3.场景中新建几个cube命名为Taget3D,摆在不同的位置并将这些新的cube传入到ListTartgets中: 

Unity中拖拽3D物体并放入到指定位置

 Unity中拖拽3D物体并放入到指定位置

4.新建几个Image命名为TargetUI,放在不同的位置并传入到ListUITarget中 :

Unity中拖拽3D物体并放入到指定位置

5.新建两个Button分别对应传入buttonUI和buttonModel:

Unity中拖拽3D物体并放入到指定位置

6.在Main Camera上添加PhisicsRaycaster组件:

Unity中拖拽3D物体并放入到指定位置

 

 三、运行调试

此时点击运行,点击”模型模式“Button,然后拖动我们的cube到左边的一排Target3D物体上去,效果如下:

Unity中拖拽3D物体并放入到指定位置

然后我们点击”UI模式“Button,再去拖动我们的cube与右边的一排TargetUI对象进行交互,可以看到效果如下:

Unity中拖拽3D物体并放入到指定位置

 至此,我们的拖拽功能就基本实现了。文章来源地址https://www.toymoban.com/news/detail-507374.html

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

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

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

相关文章

  • Unity 之transform.LookAt() 调整一个物体的旋转,使其朝向指定的位置

    transform.LookAt 是 Unity 引擎中 Transform 组件的一个方法,用于调整一个物体的旋转,使其朝向指定的位置。通常情况下,它被用来使一个物体(如摄像机、玩家角色等)朝向另一个物体、位置或方向。以下是关于 transform.LookAt 方法的详细介绍: 方法签名: 参数说明: target :要

    2024年02月09日
    浏览(49)
  • 【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置

    ♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油! 加油! 加油 🎈欢迎评论 💬点赞👍🏻 收藏 📂加关注+! 提针对这个需求,以下是示例脚本代码: ♥️作者

    2024年02月12日
    浏览(42)
  • Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

    教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip Unity 脚本概览 脚本编写并不困难,但是如果直接从细节开始讲起,会让 读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写 的细节,只介绍简单的修改物体位置、处理用户输入和检测碰 撞的方法

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

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

    2023年04月12日
    浏览(85)
  • Java将获取的参数,图片以及pdf文件放入到word文档指定位置

    首先引入的依赖 接下面的是template.docx文档,参数是以{{paramName}}格式的,为什么要以这种格式,是因为下面的方法,在替换参数的时候需要 但是从数据库获取的参数跟模板中的参数一一对应上即可,格式如下(我是json形式展示的): {     \\\"countQuota\\\": \\\"1\\\",     \\\"noEmission\\\": \\\"1\\\",  

    2024年02月15日
    浏览(48)
  • unity3D中用Mesh Collider创建的碰撞体与物体模型位置有偏差的解决方法

    1.相信很多小伙伴在使用Mesh Collider时都遇到过下面这个情况: 1.解决方法:在这个对象Alpaca下面新建一个空对象Collider,我们把Mesh Collider添加到这个空对象上面就可以调整碰撞体的位置了  3.完成效果:

    2024年02月13日
    浏览(54)
  • unity | 图片放入指定文件夹自动变成sprite精灵模式

    一、理解我们要做的事         原本图片放入文件夹后是Default(默认)模式,但是需要大量处理图片的时候,我们希望它拖进去就是sprite模式 = 我们想修改unity原本的功能。 二、unity是允许我们去修改它本身的一些功能的,你可以定制属于你的unity         这需要用到UnityEdit

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

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

    2024年03月24日
    浏览(58)
  • unity拖拽背包物体,并交换两个物体的信息

    前几天看了一个教程,背包物品交换。由于教程中使用的是ngui,很多代码需要使用UGUI重新写,因此苦恼了几天。 我遇到了以下问题,在此详细罗列,以记录错误的原因和修改的方法,供日后阅读查找。 一、背包中的物品在拖拽之后放入指定的空格子(问题1:不知道该怎么

    2024年04月15日
    浏览(47)
  • Unity使用ConfigurableJoint实现物理拖拽物体

    我们如何在游戏中实现拖拽物体呢,如果仅仅是让拖拽坐标,可能没有物理效果,这里可以使用Joint来实现。 首先我们在场景中放置道具。 如图,我们放置一个圆柱体Cylinder,一个Sphere球体,和地面。 圆柱体就是我们要拖动的物体,红色球体是我们点击的位置,白色的地面放

    2023年04月08日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包