unity 从UI上拖出3D物体,(2D转3D)
效果展示:
2D转3D视频

UI结构

UI组件挂载
UI结构
这个脚本挂载到 3D物体身上
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DragGame : MonoBehaviour
{[HideInInspector]public bool isDrag;public int z=8;void Start(){}// Update is called once per framevoid Update(){}IEnumerator OnMouseDown(){Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标//将鼠标屏幕坐标转为三维坐标,再计算物体位置与鼠标之间的距离var offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));isDrag = true;while (Input.GetMouseButton(0)){Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, z);var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;transform.position = curPosition;yield return new WaitForFixedUpdate();}}IEnumerator OnMouseUp(){isDrag = false;Whereabouts();yield return 0;}private void OnTriggerEnter(Collider other){//物体拖出后 碰到其他物体的逻辑}public void Whereabouts(){RaycastHit hit;//参数:当前物体,世界空间的方向,碰撞信息,最大距离if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), out hit, Mathf.Infinity)){transform.DOMove(new Vector3(hit.point.x, hit.point.y + (transform.localScale.y / 2), hit.point.z), 0.5f);}}
}
挂载到UI上面
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class KnapsackPanel : MonoBehaviour
{List<GameObject> scrollList = new List<GameObject>();//容量列表List<Toggle> toggles = new List<Toggle>();//背包类型列表GameObject to, sv, im;GameObject toggle;GameObject scrollView;Toggle Switch;public void Start(){toggle = transform.Find("GameObject/ToggleGroup/Toggle").gameObject;scrollView = transform.Find("GameObject/ScrollGroup/Scroll View").gameObject;Switch = transform.Find("GameObject/BG/Switch").GetComponent<Toggle>();RectTransform tf = transform.Find("GameObject").GetComponent<RectTransform>();Switch.onValueChanged.AddListener((arg) =>{if (arg){tf.transform.DOLocalMoveX(tf.transform.localPosition.x - tf.rect.width, 1f);}else{tf.transform.DOLocalMoveX(tf.transform.localPosition.x + tf.rect.width, 1f);}});CreateKnapsack();}/// <summary>/// 生成背包内容/// </summary>public void CreateKnapsack(){Toggle[] tog = transform.Find("GameObject/ToggleGroup").GetComponentsInChildren<Toggle>();for (int i = 0; i < tog.Length; i++){toggles.Add(tog[i]);}ScrollRect[] scrollbars= transform.Find("GameObject/ScrollGroup").GetComponentsInChildren<ScrollRect>(true);for (int i = 0; i < scrollbars.Length; i++){scrollList.Add(scrollbars[i].gameObject);Transform content = scrollbars[i].transform.Find("Viewport/Content");for (int j = 0; j < content.childCount; j++){int t = j;GameObject game = Resources.Load<GameObject>(content.GetChild(t).name);//需要拖拽出的3D物体DragGameCommand drag = new DragGameCommand(content.GetChild(t).gameObject, game, j, () => { Switch.isOn = true; });//dragGames.Add(drag);}}//类型切换事件绑定for (int i = 0; i < toggles.Count; i++){int t = i;toggles[i].onValueChanged.RemoveAllListeners();toggles[i].onValueChanged.AddListener((arg) =>{scrollList[t].SetActive(arg);});}}}
挂载到空物体上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IEnumeratorManager : MonoBehaviour
{public static IEnumeratorManager instance;void Start(){instance = this;}
}
这个脚本 不需要挂载
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class DragGameCommand
{public GameObject instance;//UI图标public GameObject dragGame;//拖拽的物体GameObject game;//要创建的物体public GameObject scrollView;//对应的背包分类界面(拖回物体到UI的范围)public int z;//物体的Z轴距离int index;//在背包里排列的索引Action dragEnd;public DragGameCommand(GameObject image, GameObject _game, int _index, Action _dragEnd){instance = image;game = _game;scrollView = image.transform.parent.parent.parent.gameObject;AddListener();z = 8;int index = _index;dragEnd = _dragEnd;AddEvent(scrollView.transform);}#region 背包拖出物体/// <summary>/// 物体从UI 拖出的事件/// </summary>private void AddListener(){//给Image 动态添加 拖拽 事件EventTrigger eventTrigger = instance.gameObject.AddComponent<EventTrigger>();EventTrigger.Entry beginDrag = new EventTrigger.Entry();beginDrag.eventID = EventTriggerType.BeginDrag;beginDrag.callback.AddListener((v) =>{Debug.Log("开始拖拽");Image dragImage = instance.GetComponent<Image>();dragImage.raycastTarget = false;//UI置灰dragImage.color = new Color(1, 1, 1, 0.5f);string name = game.name;dragGame = GameObject.Instantiate(game);//创建3D物体DragGame dg = dragGame.GetComponent<DragGame>();dg.z = z;dragGame.name = name;ObjFollowMouse(dragGame);//让物体跟随鼠标});EventTrigger.Entry drag = new EventTrigger.Entry();drag.eventID = EventTriggerType.Drag;drag.callback.AddListener((v) =>{ObjFollowMouse(dragGame);//让物体跟随鼠标});EventTrigger.Entry endDrag = new EventTrigger.Entry();endDrag.eventID = EventTriggerType.EndDrag;endDrag.callback.AddListener((v) => {dragEnd?.Invoke();dragGame.GetComponent<DragGame>().Whereabouts();//下落});eventTrigger.triggers.Add(beginDrag);eventTrigger.triggers.Add(drag);eventTrigger.triggers.Add(endDrag);}/// <summary>/// UI跟随鼠标/// </summary>/// <param name="eventData"></param>private void ObjFollowMouse(GameObject gameObject){gameObject.transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, z));}#endregion#region 物体放回背包Coroutine coroutine;//绑定背包界面鼠标移入和移出事件public void AddEvent(Transform viewport){EventTrigger eventr = viewport.gameObject.AddComponent<EventTrigger>();//给拖入范围UI,添加 鼠标进入和鼠标离开事件EventTrigger.Entry pointerEnter = new EventTrigger.Entry();pointerEnter.eventID = EventTriggerType.PointerEnter;pointerEnter.callback.RemoveAllListeners();//鼠标进入UIpointerEnter.callback.AddListener((v) =>{if (dragGame != null)//已经拖出来的物体{DragGame dragGame1 = dragGame.GetComponent<DragGame>();if (dragGame1.isDrag)//物体正在拖拽中{coroutine =IEnumeratorManager.instance. StartCoroutine(OnMouse(index));//放回背包事件}}});EventTrigger.Entry pointerExit = new EventTrigger.Entry();pointerExit.eventID = EventTriggerType.PointerExit;pointerExit.callback.RemoveAllListeners();//鼠标离开UIpointerExit.callback.AddListener((v) =>{if (coroutine != null){IEnumeratorManager.instance.StopCoroutine(coroutine);}});eventr.triggers.Add(pointerEnter);eventr.triggers.Add(pointerExit);}/// <summary>/// 物体放回背包/// </summary>/// <param name="index"></param>/// <returns></returns>IEnumerator OnMouse(int index){DragGame game = dragGame.GetComponent<DragGame>();Image image = instance.GetComponent<Image>();while (true){if (!game.isDrag && scrollView.activeInHierarchy)//物体结束拖拽 并且在对应的背包类型容量处于显示状态、{GameObject.DestroyImmediate(game.gameObject);image.raycastTarget = true;image.color = new Color(1, 1, 1, 1);dragGame = null;IEnumeratorManager.instance. StopCoroutine(coroutine);}yield return 0;}}#endregion
}
可以根据自己需求去修改,比如 动态生成背包里的类型和元素,
Demo上传了,可以下载,
相关文章:
unity 从UI上拖出3D物体,(2D转3D)
效果展示: 2D转3D视频 UI结构 UI组件挂载 UI结构 这个脚本挂载到 3D物体身上 using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragGame : MonoBehaviour {[HideInInspector]public bool isDrag…...
win10pycharm和anaconda安装和环境配置教程
windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda,链接https://www.anaconda.com/download 下载完后,双击exe文件 将anaconda自动弹出的窗口全部关掉即可,然后配置高级系统变量 根据自己的路径,配置…...
[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)
(static成员 explicit 友元函数 内部类 编译器优化) 一.static 成员:1.概念引入:1-1:定义全局变量记录个数? 2.如果有多个类需要分开去记录类对象的个数?2-1:可不可以声明成员变量解决&#…...
ONES Design UI 组件库环境搭建
这个 ONES Design UI 组件库 是基于 Ant Design 的 React UI 组件库,主要用于企业级研发管理工具的研发。 首先用 React 的脚手架搭建一个项目: npx create-react-app my-app cd my-app目前 ONES Design UI 组件库 托管在 ONES 私有的 npm 仓库上, 因此…...
支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新
支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具,也是一个数字生活平台,通过…...
taro全局配置页面路由和tabBar页面跳转
有能力可以看官方文档:Taro 文档 页面路由配置,配置在app.config.ts里面的pages里: window用于设置小程序的状态栏、导航条、标题、窗口背景色,其配置项如下: tabBar配置:如果小程序是一个多 tab 应用&…...
【k8s】pod进阶
一、资源限制 1、资源限制的概念 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上…...
【设计模式】第18节:行为型模式之“迭代器模式”
一、简介 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。 在通过迭代器来遍历集合元素的同时,增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍…...
【数据结构】单链表OJ题
前言: 本节博客将讲解单链表的反转,合并有序链表,寻找中间节点及约瑟夫问题 文章目录 一、反转链表二、合并有序链表三、链表的中间结点四、环形链表的约瑟夫问题 一、反转链表 要反转链表,我们需要遍历链表并改变每个节点的 next 指针&#…...
智能工厂架构
引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <...
阿里云多款ECS产品全面升级 性能最多提升40%
“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新,为客户创造业务价值。”10月31日,杭州云栖大会上,阿里云弹性计算计算产品线负责人张献涛表示,通过持续的产品和技术创新,阿里云发布了HPC优化实例等多…...
责任链模式(Chain of Responsibility)
责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。 public abstract class Handler {protected Handler successor;public abstract void handlerRequest(String condition);protected Handler getSuccessor()…...
文件管理技巧:根据大小智能分类并移动至目标文件夹
在文件管理过程中,我们经常需要整理大量的文件。根据文件的大小,将其智能分类并移动至目标文件夹,可以帮助我们更高效地管理文件,提高工作效率。通过使用云炫文件管理器可以根据文件大小进行智能分类和移动至目标文件夹࿰…...
具有自主产权的SaaS门店收银系统全套源码输出
PHPMysql前后端分离, 小程序线上商城; 进销存管理库存盘点, 多仓库库存调拨, 会员系统。 消费者扫码查价系统。...
论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings
1. 优势 现存的emmbedding应用在新的task或者domain上时表现会有明显下降,甚至在相同task的不同domian上的效果也不行。这篇文章的重点就是提升embedding在不同任务和领域上的效果,特点是不需要用特定领域的数据进行finetune而是使用instuction finetun…...
[BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
居然把第3周忘了写笔记了. 后边难度上来了,还是很有意思的 Crypto Rabins RSA rsa一般要求e与phi互质,但rabin一般用2,都是板子题也没什么好解释的 from Crypto.Util.number import * from secret import flag p getPrime(64) q getPrime(64) assert p % 4 3 assert q %…...
软件测试---边界值分析(功能测试)
能对限定边界规则设计测试点---边界值分析 选取正好等于、刚好大于、刚好小于边界的值作为测试数据 上点: 边界上的点 (正好等于);必选(不考虑区开闭) 内点: 范围内的点 (区间范围内的数据);必选(建议选择中间范围) 离点: 距离上点最近的点 (刚好…...
使用pytorch处理自己的数据集
目录 1 返回本地文件中的数据集 2 根据当前已有的数据集创建每一个样本数据对应的标签 3 tensorboard的使用 4 transforms处理数据 tranfroms.Totensor的使用 transforms.Normalize的使用 transforms.Resize的使用 transforms.Compose使用 5 dataset_transforms使用 1 返回本地…...
http进一步认识
好久不见各位,今天为大家带来http协议的进一步认识 文章目录 👀http协议的认识👀新的改变 👀http协议的认识 http协议经历了三个版本的演化,HTTP0.9是第一个版本的协议,它的组成极其简单,只涉…...
grafana docker安装
grafana docker安装 Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。目前使用grafana的公司有很多,如paypal、ebay、intel等。 Grafana 是 Graphite 和 InfluxDB 仪表盘和图形编辑器。Grafana 是开…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
