当前位置: 首页 > news >正文

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)

效果展示&#xff1a; 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&#xff0c;链接https://www.anaconda.com/download 下载完后&#xff0c;双击exe文件 将anaconda自动弹出的窗口全部关掉即可&#xff0c;然后配置高级系统变量 根据自己的路径&#xff0c;配置…...

[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)

(static成员 explicit 友元函数 内部类 编译器优化&#xff09; 一.static 成员&#xff1a;1.概念引入&#xff1a;1-1&#xff1a;定义全局变量记录个数&#xff1f; 2.如果有多个类需要分开去记录类对象的个数&#xff1f;2-1&#xff1a;可不可以声明成员变量解决&#…...

ONES Design UI 组件库环境搭建

这个 ONES Design UI 组件库 是基于 Ant Design 的 React UI 组件库&#xff0c;主要用于企业级研发管理工具的研发。 首先用 React 的脚手架搭建一个项目&#xff1a; npx create-react-app my-app cd my-app目前 ONES Design UI 组件库 托管在 ONES 私有的 npm 仓库上, 因此…...

支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新

支付宝是全球领先的独立第三方支付平台&#xff0c;致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验&#xff0c;及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具&#xff0c;也是一个数字生活平台&#xff0c;通过…...

taro全局配置页面路由和tabBar页面跳转

有能力可以看官方文档&#xff1a;Taro 文档 页面路由配置&#xff0c;配置在app.config.ts里面的pages里&#xff1a; window用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff0c;其配置项如下&#xff1a; tabBar配置&#xff1a;如果小程序是一个多 tab 应用&…...

【k8s】pod进阶

一、资源限制 1、资源限制的概念 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上…...

【设计模式】第18节:行为型模式之“迭代器模式”

一、简介 迭代器模式&#xff08;Iterator Design Pattern&#xff09;&#xff0c;也叫作游标模式&#xff08;Cursor Design Pattern&#xff09;。 在通过迭代器来遍历集合元素的同时&#xff0c;增加或者删除集合中的元素&#xff0c;有可能会导致某个元素被重复遍历或遍…...

【数据结构】单链表OJ题

前言: 本节博客将讲解单链表的反转&#xff0c;合并有序链表&#xff0c;寻找中间节点及约瑟夫问题 文章目录 一、反转链表二、合并有序链表三、链表的中间结点四、环形链表的约瑟夫问题 一、反转链表 要反转链表&#xff0c;我们需要遍历链表并改变每个节点的 next 指针&#…...

智能工厂架构

引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <...

阿里云多款ECS产品全面升级 性能最多提升40%

“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新&#xff0c;为客户创造业务价值。”10月31日&#xff0c;杭州云栖大会上&#xff0c;阿里云弹性计算计算产品线负责人张献涛表示&#xff0c;通过持续的产品和技术创新&#xff0c;阿里云发布了HPC优化实例等多…...

责任链模式(Chain of Responsibility)

责任链模式是对象的行为模式。使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者直接的耦合关系。 public abstract class Handler {protected Handler successor;public abstract void handlerRequest(String condition);protected Handler getSuccessor()…...

文件管理技巧:根据大小智能分类并移动至目标文件夹

在文件管理过程中&#xff0c;我们经常需要整理大量的文件。根据文件的大小&#xff0c;将其智能分类并移动至目标文件夹&#xff0c;可以帮助我们更高效地管理文件&#xff0c;提高工作效率。通过使用云炫文件管理器可以根据文件大小进行智能分类和移动至目标文件夹&#xff0…...

具有自主产权的SaaS门店收银系统全套源码输出

PHPMysql前后端分离&#xff0c; 小程序线上商城&#xff1b; 进销存管理库存盘点&#xff0c; 多仓库库存调拨&#xff0c; 会员系统。 消费者扫码查价系统。...

论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings

1. 优势 现存的emmbedding应用在新的task或者domain上时表现会有明显下降&#xff0c;甚至在相同task的不同domian上的效果也不行。这篇文章的重点就是提升embedding在不同任务和领域上的效果&#xff0c;特点是不需要用特定领域的数据进行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 %…...

软件测试---边界值分析(功能测试)

能对限定边界规则设计测试点---边界值分析 选取正好等于、刚好大于、刚好小于边界的值作为测试数据 上点: 边界上的点 (正好等于)&#xff1b;必选(不考虑区开闭) 内点: 范围内的点 (区间范围内的数据)&#xff1b;必选(建议选择中间范围) 离点: 距离上点最近的点 (刚好…...

使用pytorch处理自己的数据集

目录 1 返回本地文件中的数据集 2 根据当前已有的数据集创建每一个样本数据对应的标签 3 tensorboard的使用 4 transforms处理数据 tranfroms.Totensor的使用 transforms.Normalize的使用 transforms.Resize的使用 transforms.Compose使用 5 dataset_transforms使用 1 返回本地…...

http进一步认识

好久不见各位&#xff0c;今天为大家带来http协议的进一步认识 文章目录 &#x1f440;http协议的认识&#x1f440;新的改变 &#x1f440;http协议的认识 http协议经历了三个版本的演化&#xff0c;HTTP0.9是第一个版本的协议&#xff0c;它的组成极其简单&#xff0c;只涉…...

grafana docker安装

grafana docker安装 Grafana是一款用Go语言开发的开源数据可视化工具&#xff0c;可以做数据监控和数据统计&#xff0c;带有告警功能。目前使用grafana的公司有很多&#xff0c;如paypal、ebay、intel等。 Grafana 是 Graphite 和 InfluxDB 仪表盘和图形编辑器。Grafana 是开…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...