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 是开…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
