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

【Unity基础】Unity中拖拽3D物体的过程分析和实现方法

我们先来分析一下Unity中拖拽物体的过程:

第一步:先检测拖拽的输入方式,可以鼠标,触摸,可以用InputManager输入,也可以 使用InputSystem输入

第二步:获取触碰点的位置,并计算offset。

第三步:在每一帧里改变物体的位置。

其实3D物体拖拽的过程可以分为上面几个清晰的步骤,而每一步都有不同的方法可以选择,尤其是在第一步和第二步,你可以根据项目需求和输入方式的不同选择合适的实现方法。下面,我会根据你的描述,对每个步骤和方法做一个详细的拆解。

第一步:检测拖拽的输入方式

这一阶段主要是检测用户的输入,具体输入方式可以有很多种,每种方式有不同的事件方法或API调用:

  1. 鼠标输入:

    • OnMouseDownOnMouseDrag:通过 Unity 自带的 MonoBehaviour 事件,适用于鼠标操作。这种方式简单直观,但对于复杂的拖拽控制可能不够灵活。

      void OnMouseDown() {// 记录点击时的偏移量
      }void OnMouseDrag() {// 获取新的鼠标位置,并移动物体
      }
      
    • Input.GetMouseButtonDownInput.GetMouseButton:通过 Input 类手动检查鼠标按钮的状态。适用于需要手动控制输入事件的场景,能够精细控制鼠标输入。

      if (Input.GetMouseButtonDown(0)) {// 鼠标按下时记录位置
      }
      if (Input.GetMouseButton(0)) {// 鼠标拖动时更新位置
      }
      
  2. Event System (UI):

    • OnBeginDragOnDragOnEndDrag

      :这些方法来自

      IDragHandler
      

      接口,适合需要与 Unity 的

      EventSystem
      

      一起工作的项目。这种方式适用于有 UI 或需要流畅交互的场景。

      public void OnBeginDrag(PointerEventData eventData) {// 拖拽开始,记录偏移
      }public void OnDrag(PointerEventData eventData) {// 拖拽过程中,根据触摸点移动物体
      }public void OnEndDrag(PointerEventData eventData) {// 拖拽结束
      }
      
  3. 触摸输入(适用于移动设备):

    • OnTouchBeginOnTouchMoved

      :适用于移动设备的触摸输入。这种方式通常与移动端游戏或应用的触摸交互配合使用,特别是多点触控的场景。

      void OnTouchBegin() {// 获取触摸开始的位置信息
      }void OnTouchMoved() {// 获取触摸移动的位置信息,并更新物体位置
      }
      
  4. 新输入系统(Input System):

    • Mouse.current.leftButton.wasPressedThisFrame

      :使用 Unity 的新输入系统,可以精确控制鼠标、触摸等各种输入设备。

      if (Mouse.current.leftButton.wasPressedThisFrame) {// 鼠标按下
      }
      

第二步:获取触碰点的位置并计算 offset

获取触碰点的位置是拖拽的关键。在 3D 场景中,通常会使用射线检测(Raycasting)或将屏幕空间的触摸位置转换为世界空间来实现。

  1. 使用 Camera.main.ScreenToWorldPoint: 将触摸或鼠标位置从屏幕空间转换为世界空间,适用于你有准确的摄像机信息,并希望直接获取物体在世界空间的位置。

    Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Vector3 offset = transform.position - touchPosition;
    
  2. 使用 Raycast: 使用射线检测可以在 3D 场景中更精确地判断鼠标点击的物体,并通过射线交点来计算物体的新位置。射线通常从摄像机位置发出,穿过鼠标或触摸点。

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit)) {Vector3 touchPosition = hit.point;Vector3 offset = transform.position - touchPosition;
    }
    

第三步:改变物体的位置

一旦得到了触碰点和 offset,可以通过直接修改物体的位置来实现拖拽效果。

  1. 直接设置物体位置: 通过将物体的位置设置为新的触摸或鼠标位置来完成拖拽。你需要确保物体的位置在物理世界中平滑移动。

    Vector3 targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition) + offset;
    transform.position = targetPosition;
    
  2. 使用 Rigidbody 移动: 如果你的物体有 Rigidbody 组件,并且需要物理反馈(比如碰撞或惯性效果),可以使用物理方法来更新物体的位置。

    Rigidbody rb = GetComponent<Rigidbody>();
    Vector3 targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition) + offset;
    rb.MovePosition(targetPosition);
    

组合方式

根据输入方式和具体需求,第一步和第二步会有不同的组合方式。以下是一些可能的组合:

  1. 鼠标输入 + Camera.main.ScreenToWorldPoint:适合基础的桌面端拖拽,无需复杂的射线检测。
  2. 鼠标输入 + Raycast:适合需要精确控制和碰撞检测的拖拽,特别是在3D空间中。
  3. Event System + Camera.main.ScreenToWorldPoint:适合有 UI 交互需求的拖拽,能够结合 Unity 的 EventSystem
  4. 触摸输入 + Camera.main.ScreenToWorldPoint:适合移动设备,简化触摸位置的转换。
  5. 触摸输入 + Raycast:适合在 3D 空间中实现触摸拖拽,支持碰撞和精确位置控制。
  6. 新输入系统 + Raycast 或 Camera.main.ScreenToWorldPoint:适合支持多种输入设备的场景,能够灵活处理各种设备输入。

我们先将拖拽过程分为这些步骤:检测输入方式、计算触碰点位置、更新物体位置。通过不同的组合,能够满足不同的项目需求。

以下是几种常见的拖拽实现方式,结合上面提到的组合进行分析,并给出优缺点和适用场景:

1. 鼠标输入 + Camera.main.ScreenToWorldPoint

这种方式简单直观,适用于基础的桌面端拖拽,不需要过多的物理处理和碰撞检测。

示例代码:
private Vector3 offset;
private bool isDragging = false;void OnMouseDown() {// 记录初始偏移量offset = transform.position - Camera.main.ScreenToWorldPoint(Input.mousePosition);isDragging = true;
}void OnMouseDrag() {if (isDragging) {Vector3 targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition) + offset;targetPosition.z = 0; // 确保拖拽物体在二维平面上移动transform.position = targetPosition;}
}void OnMouseUp() {isDragging = false;
}
优点:
  • 简单易懂:只需要使用 OnMouseDownOnMouseDrag 事件进行处理。
  • 性能较好:不需要复杂的射线检测或物理计算,适合简单的拖拽需求。
  • 适合桌面端:特别适用于桌面端的鼠标操作。
缺点:
  • 缺乏物理反馈:没有物理碰撞的处理,不能模拟物体与其他物体的碰撞反应。
  • 限制性较强:仅适用于鼠标操作,不能直接支持多点触控等复杂输入设备。
适用场景:
  • 简单的 2D 游戏或桌面应用中的拖拽需求。
  • 不需要物理交互或碰撞检测的场景。

2. 鼠标输入 + Raycast

这种方式通过射线检测来判断鼠标点击的位置,适用于3D场景中需要精确控制拖拽对象的情况。

示例代码:
private Vector3 offset;
private bool isDragging = false;void Update() {if (Input.GetMouseButtonDown(0)) {Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)) {offset = hit.point - transform.position;isDragging = true;}}if (isDragging && Input.GetMouseButton(0)) {Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)) {Vector3 targetPosition = hit.point + offset;transform.position = targetPosition;}}if (Input.GetMouseButtonUp(0)) {isDragging = false;}
}
优点:
  • 精确控制:使用射线检测可以精确控制拖拽物体与其他物体的交互。
  • 适用于3D场景:特别适合需要对物体进行 3D 拖拽的场景。
  • 支持碰撞检测:能够通过射线检测与其他物体碰撞,适应复杂场景。
缺点:
  • 性能开销:射线检测会占用一定的性能,尤其是在复杂场景中。
  • 需要物理组件:射线检测对物体的碰撞需要依赖物理引擎,可能增加开发复杂性。
适用场景:
  • 3D 游戏中的物体拖拽,特别是涉及到复杂的物理交互或物体间的碰撞。
  • 需要精准控制鼠标与物体交互的场景。

3. Event System + OnBeginDrag, OnDrag, OnEndDrag

使用 Unity 的 EventSystem 来处理拖拽,可以实现更加流畅的交互体验,特别适合有 UI 或复杂交互需求的场景。

示例代码:
using UnityEngine;
using UnityEngine.EventSystems;public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {private Vector3 offset;public void OnBeginDrag(PointerEventData eventData) {// 记录初始偏移offset = transform.position - Camera.main.ScreenToWorldPoint(eventData.position);}public void OnDrag(PointerEventData eventData) {Vector3 targetPosition = Camera.main.ScreenToWorldPoint(eventData.position) + offset;targetPosition.z = 0; // 确保物体在 2D 平面内transform.position = targetPosition;}public void OnEndDrag(PointerEventData eventData) {// 结束拖拽}
}
优点:
  • 流畅的交互体验:通过 EventSystem 处理拖拽,能够确保UI和物体拖拽的流畅体验。
  • 易于扩展:支持与其他 UI 元素的交互,能够轻松集成到复杂的 UI 系统中。
  • 自动处理交互:不需要手动编写输入检测代码,EventSystem 会自动管理输入事件。
缺点:
  • 依赖 EventSystem:需要依赖 Unity 的 EventSystem,且实现稍微复杂一些。
  • 限制于 UI 系统:适用于与 UI 组件的交互,复杂的 3D 场景中可能不太适用。
适用场景:
  • 需要与 UI 元素交互的拖拽场景,例如 UI 控件、按钮等。
  • 需要流畅拖拽体验且项目中已经在使用 EventSystem。

4. 触摸输入 + Camera.main.ScreenToWorldPoint

适用于移动设备,处理触摸输入来实现物体的拖拽,尤其适合简单的触摸拖拽。

示例代码:
private Vector3 offset;
private bool isDragging = false;void Update() {if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) {// 触摸开始Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);offset = transform.position - touchPosition;isDragging = true;}if (isDragging && Input.touchCount > 0) {// 触摸拖拽Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);transform.position = touchPosition + offset;}if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) {// 触摸结束isDragging = false;}
}
优点:
  • 适用于移动设备:专为触摸屏设备设计,支持多点触控和手势操作。
  • 简单易用:类似于鼠标拖拽的方式,易于实现。
缺点:
  • 触摸精度问题:在某些情况下,触摸输入的精度可能不如鼠标,尤其在快速移动时。
  • 设备限制:不适用于桌面设备,局限性较强。
适用场景:
  • 移动设备上的拖拽需求,特别是平板、手机等触摸屏设备。
  • 不需要复杂物理反馈的应用。

5. 新输入系统 + Raycast 或 Camera.main.ScreenToWorldPoint

使用 Unity 新输入系统来处理多种输入设备,适合需要支持多种设备(如鼠标、触摸、手柄)的拖拽场景。

示例代码:
using UnityEngine.InputSystem;private Vector3 offset;
private bool isDragging = false;void Update() {if (Mouse.current.leftButton.wasPressedThisFrame) {// 开始拖拽Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());RaycastHit hit;if (Physics.Raycast(ray, out hit)) {offset = hit.point - transform.position;isDragging = true;}}if (isDragging && Mouse.current.leftButton.isPressed) {// 拖拽中Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());RaycastHit hit;if (Physics.Raycast(ray, out hit)) {Vector3 targetPosition = hit.point + offset;transform.position = targetPosition;}}if (Mouse.current.leftButton.wasReleasedThisFrame) {// 结束拖拽isDragging = false;}
}
优点:
  • 多设备支持:可以处理鼠标、触摸、手柄等不同输入设备。
  • 灵活性强:能够轻松适配不同类型的输入设备,适合跨平台开发。
缺点:
  • 需要新输入系统:如果项目还没有集成新输入系统,可能需要额外的学习成本和配置。
  • 复杂性较高:相比于传统的 Input 方式,代码实现可能会稍显复杂。
适用场景:
  • 需要支持多种输入设备

的项目,如PC、移动端和游戏机。

  • 跨平台应用,特别是需要处理多种输入设备的场景。

总结

拖拽方式优点缺点适用场景
鼠标输入 + ScreenToWorldPoint简单易懂,性能较好缺乏物理反馈,限制于鼠标输入适合桌面端简单的 2D 游戏或应用
鼠标输入 + Raycast精确控制,支持碰撞检测性能开销较大,依赖物理引擎3D 游戏中的精确物体拖拽,带碰撞检测
Event System + OnBeginDrag流畅的交互体验,易于扩展依赖 EventSystem,实现稍复杂UI 交互或需要 EventSystem 支持的拖拽场景
触摸输入 + ScreenToWorldPoint简单易用,适合移动设备触摸精度较低,设备限制较强移动设备上的简单拖拽,适合触摸屏设备
新输入系统 + Raycast 或 ScreenToWorldPoint支持多设备输入,灵活适应多平台需要配置新输入系统,代码稍复杂多设备支持的应用,跨平台项目,支持鼠标和触摸输入

相关文章:

【Unity基础】Unity中拖拽3D物体的过程分析和实现方法

我们先来分析一下Unity中拖拽物体的过程&#xff1a; 第一步&#xff1a;先检测拖拽的输入方式&#xff0c;可以鼠标&#xff0c;触摸&#xff0c;可以用InputManager输入&#xff0c;也可以 使用InputSystem输入 第二步&#xff1a;获取触碰点的位置&#xff0c;并计算offse…...

深入了解Spring

目录 Spring基础 什么是Spring框架&#xff1f; Spring 包含的模块有哪些&#xff1f; Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架&#xff1f; Sp…...

vue3修改elementui-plus的默认样式的几种方法

#创作灵感 今天写vue的前端项目&#xff0c;因为需要去修改elementui-plus中drawer的默认样式&#xff0c;所以刚好将修改步骤记录下来。 一共提供了三种方法&#xff0c;但亲测第二种最好用。 使用第二种是可以无视自己的代码中是否定义了该盒子&#xff0c;因为有时候盒子的…...

免费开源!推荐一款网页版数据库管理工具!

免费开源&#xff01;推荐一款网页版数据库管理工具&#xff01; DBGate 是一个开源的数据库管理工具&#xff0c;DBGate 的最大特点是可以 Web 访问&#xff01;&#xff0c;轻松实现一台机器部署&#xff0c;所有人使用&#xff01; 无论是 MySQL、PostgreSQL、SQLite 还是…...

Ubuntu22.04切换gcc版本教程

在编译安装程序的时候,由于gcc版本过高,导致编译无法通过,需要降低gcc版本。 一、安装gcc版本 根据自己的需求安装gcc版本。 sudo apt update sudo apt install gcc-10 g++-10二、切换gcc版本 sudo update-alternatives --install /usr/bin/gcc gcc...

OpenCV相机标定与3D重建(24)计算两个二维点集之间的最佳仿射变换矩阵(2x3)函数estimateAffine2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个二维点集之间的最优仿射变换&#xff0c;它计算 [ x y ] [ a 11 a 12 a 21 a 22 ] [ X Y ] [ b 1 b 2 ] \begin{bmatrix} x\\ y\\ \en…...

并发修改导致MVCC脏写问题

并发修改导致MVCC脏写问题 一、概要 1.1 业务场景 数据库表结构设计&#xff1a; 一个主档数据&#xff0c;通过一个字段&#xff0c;逗号分隔的方式去关联其他明细信息的id。 如主档数据A&#xff0c;有3条明细数据与A关联&#xff0c;其id分别是1,2,3&#xff0c;那么其存…...

webSokect安卓和web适配的Bug 适用实时语音场景

❌BUG&#xff1a; Failed to construct WebSocket: The URLs scheme must be either ws or wss. https is not allowed.WebSocket 协议在创建连接时&#xff0c;规定其 URL 的协议头&#xff08;scheme&#xff09;必须是 ws&#xff08;用于非加密的普通 WebSocket 连接&…...

Linux系列之如何更换Centos yum源?

环境 Centos7Xshell7 问题描述 最近安装了一个虚拟机&#xff0c;准备用来学习&#xff0c;不过使用yum命令安装一些软件&#xff0c;不过使用这个命令时候&#xff0c;提示 Cannot find a valid baseurl for repo: base/7/x86_64&#xff0c;Could not retrieve mirrorlis…...

微知-C语言如何指定弱符号?(#define WEAK __attribute__((weak)); WEAK int foo(void))

背景 在C语言中&#xff0c;弱符号是一种特殊的符号&#xff0c;它可以被重定义&#xff0c;但在链接时&#xff0c;只会使用被重定义的符号。 在某些情况下&#xff0c;我们需要在多个文件中定义相同的函数&#xff0c;但只使用其中一个函数。本文将介绍如何在C语言中实现弱符…...

三极管功能

1 三极管的结构 2 三极管开关电路设计注意事项 1 三极管进入饱和状态 电机&#xff1a;500毫安 2 判断三级什么状态&#xff1a;电压法 3 判断三级什么状态&#xff1a;电流法 4 求IB的电阻 5 当三极管用作开关时&#xff0c;通常N型三极管控制负载的gnd端&#xff0c;P型…...

Python的3D可视化库【vedo】2-5 (plotter模块) 坐标转换、场景导出、添加控件

文章目录 4 Plotter类的方法4.7 屏幕和场景中的坐标点转换4.7.1 屏幕坐标转为世界坐标4.7.2 世界坐标转为屏幕坐标4.7.3 屏幕坐标取颜色 4.8 导出4.8.1 导出2D图片4.8.2 导出3D文件 4.9 添加控件4.9.1 添加内嵌子窗口4.9.2 添加选择区4.9.3 添加比例尺4.9.4 为对象添加弹出提示…...

定时/延时任务-万字解析Spring定时任务原理

文章目录 1. 概要2. EnableScheduling 注解3. Scheduled 注解4. postProcessAfterInitialization 解析4.1 createRunnable 5. 任务 Task 和子类6. ScheduledTaskRegistrar6.1 添加任务的逻辑6.2 调度器初始化6.3 调用时机 7. taskScheduler 类型7.1 ConcurrentTaskScheduler7.2…...

Android上传到Minio本地存储

Minio简介 MinIO是一个对象存储解决方案&#xff0c;它提供了与Amazon Web Services S3兼容的API&#xff0c;并支持所有核心S3功能。 MinIO有能力在任何地方部署 - 公有云或私有云&#xff0c;裸金属基础设施&#xff0c;编排环境&#xff0c;以及边缘基础设施。author: https…...

海量数据-Vastbase G100数据库安装

海量数据-Vastbase G100数据库安装 文章目录 海量数据-Vastbase G100数据库安装前期准备防火墙配置方案一&#xff1a;关闭防火墙方案二&#xff1a;开放数据库端口 SELINUX配置时间同步IPC参数配置 单机安装设置主机名创建数据库安装用户和目录(可选)修改资源限制 字符安装&am…...

Python | 对于DataFrame中所有行数据比较的几种方法

在数据分析中&#xff0c;比较DataFrame数据框中的行是一项基本操作&#xff0c;可应用于多种场景&#xff0c;包括&#xff1a; 查找重复项&#xff1a;标识所有相似或包含相同数据的行。相似性检查&#xff1a;确定某些选定因子的不相似行的相似程度。成对分析&#xff1a;非…...

React:闭包陷阱产生和解决

在 React 中&#xff0c;闭包陷阱是一个常见的问题&#xff0c;尤其是在处理异步操作、事件处理器、或是定时器时。理解闭包的工作原理以及它在 React 中如何与状态和渲染交互&#xff0c;可以帮助你避免陷入一些常见的错误。 一、闭包陷阱的产生 1、什么是闭包陷阱&#xff1…...

图的遍历|深度优先搜索|广度优先搜索(C)

图的基本操作 图的基本操作是独立于图的存储结构的。而对于不同的存储方式&#xff0c;操作算法的具体实现会有着不同的性能。在设计具体算法的实现时&#xff0c;应考虑采用何种存储方式的算法效率会更高。 图的基本操作主要包括&#xff08;仅抽象地考虑&#xff0c;所以忽略…...

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave&#xff1a;选择最适合的 Python BDD 框架 Pytest BDD vs Behave&#xff1a;选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave&#xff1a;关键区别Pytest BDD vs Behave&#xff1a;最佳应用场景结…...

python文字转语音

一、安装对应的包 pip install pyttsx3 二、代码实现 import pyttsx3# 初始化tts引擎 engine pyttsx3.init()# 设置要转换的文本 text "你好"# 设置语速&#xff0c;范围从-1到1&#xff0c;1是正常速度&#xff0c;-1是最慢速度 rate engine.getProperty(rate…...

【安全研究】某黑产网站后台滲透与逆向分析

文章目录 x01. 前言x02. 分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与…...

XSLT 编辑 XML

XSLT 编辑 XML 介绍 XSLT&#xff08;可扩展样式表语言转换&#xff09;是一种用于转换XML文档的语言。它允许开发人员将XML数据转换为其他格式&#xff0c;如HTML、PDF或纯文本。XSLT通过使用XPath查询来定位XML文档中的元素&#xff0c;并对这些元素应用转换规则。在本教程…...

计算机网络信息系统安全问题及解决策略

目 录 摘 要 前 言 一、计算机网络信息系统研究现状及安全技术 &#xff08;一&#xff09;计算机网络信息系统研究现状 &#xff08;二&#xff09;计算机网络信息系统全技术概述 二、计算机网络信息系统安全问题 &#xff08;一&#xff09;环境危害引发的安全问…...

112.【C语言】数据结构之排序(详解插入排序)

目录 1.排序定义 2.插入排序 "插入"的含义 代码 函数框架 函数设计思路 以升序为例,分析插入的三种可能 单趟排序代码 优化后 将单趟排序代码嵌入到循环中 错误代码 两种改法 运行结果 时间复杂度 1.排序定义 使一串记录,按照其中的某个或某些关键字的…...

洞察:OpenAI 全球宕机,企业应该如何应对 LLM 的不稳定性?

北京时间12月12日上午&#xff0c;OpenAI证实其聊天机器人ChatGPT正经历全球范围的宕机&#xff0c;ChatGPT、Sora及API受到影响。 OpenAI 更新事故报告称&#xff0c;已查明宕机原因&#xff0c;正努力以最快速度恢复正常服务&#xff0c;并对宕机表示歉意。 此次 OpenAI 故障…...

Git Bash Here 中文显示乱码的处理方法

在使用"open Git Bash Here"时&#xff0c;遇到中文显示乱码问题。 原因&#xff1a;通常是由于编码设置不正确导致的。 open Git Bash Here —>鼠标右击空白处&#xff0c;点击「选项」|或「Options」 在「文本」或 「Text」选项卡中&#xff0c;找到"local…...

【python因果库实战6】LaLonde 数据集

目录 LaLonde 数据集 数据 收入指示变量 教育年限的因子化 变量选择 模型 估计因果效应 未经调整的估计 LaLonde 数据集 经济学家长期以来假设培训项目可以改善参与者的劳动力市场前景。为了测试&#xff08;或证明&#xff09;这一点&#xff0c;国家支持性工作示范项…...

和Ente交流

今日去清华大学深圳国际研究生院能源环境大楼与研三师弟交流。 交流内容&#xff1a; 今年年初3月份的时候去实习&#xff0c;刚刚开始字节远程实习&#xff08;海投&#xff09;&#xff0c;然后远程了一个月&#xff0c;让去线下&#xff0c;然后就去线下待了一个月&#x…...

imx6ull qt多页面控制系统(正点原子imx系列驱动开发)

开题答辩完了也考完了四六级&#xff0c;赶紧来更新一下一个月前留下的坑吧 QAQ首先&#xff0c;因为毕业设计需要用到这些知识所以就从网络上找了一个智能车机系统&#xff0c;借鉴了一下大佬的项目思路&#xff0c;缝缝补补一个月终于完成了这一内容。 在这里先感谢从两位大佬…...

[C++]运算符重载

一、 什么是运算符重载&#xff1f; 运算符重载是 C 中的一种功能&#xff0c;它允许用户定义的类或数据类型重新定义或扩展运算符的行为&#xff0c;使运算符能够作用于用户定义的对象。 二、 通俗解释 在 C 中&#xff0c;运算符&#xff08;如 , -, *, 等&#xff09;默认…...

C++基础

01引用的本质 int a 10;/**引用本质是指针常量&#xff0c;指针指向不可更改,因此引用一旦初始化就不可以更改*自动转换为int* const ref&a;*/int &ref a;/*内部发现是引用&#xff0c;自动转换为*ref20;*/ref20; 02函数高级 2.1默认参数 #include <iostream&g…...

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现 最后设置首页的推荐模块&#xff0c;参考模板如下图所示。 一、首页热门推荐模块的实现 对于热门推荐模块&#xff0c;先有上面的小标题栏&#xff0c;这里的标题栏也有一个小图标&#xff0c;首先从“百度图库”中…...

【网络安全设备系列】1、防火墙

0x00 前言 最近由于工作原因&#xff0c;需要详细如今各类网络安全设备&#xff0c;所以开了此系列文章&#xff0c;希望通过对每个网络安全设备进行整理总结&#xff0c;来详细了解各类网络安全设备作用功能以及实现原理、部署配置方法等。 0x01 定义&#xff1a;防火墙指的…...

C# 备份文件夹

C# 备份目标文件夹 方法1&#xff1a;通过 递归 或者 迭代 结合 C# 方法 参数说明&#xff1a; sourceFolder&#xff1a;源文件夹路径destinationFolder&#xff1a;目标路径excludeNames&#xff1a;源文件夹中不需备份的文件或文件夹路径哈希表errorLog&#xff1a;输出错…...

【sizeof】各种数据类型所占空间大小

各种数据类型所占空间大小 文章目录 前言 一、sizeof是什么&#xff1f; 二、使用步骤 1.整型 2.字符型 总结 前言 ‌sizeof在C语言中是一个运算符&#xff0c;用于获取数据类型或变量在内存中所占的字节数。‌它可以在编译时计算数据类型或变量的内存大小&#xff0c;而…...

水仙花数(流程图,NS流程图)

题目&#xff1a;打印出所有的100-999之间的"水仙花数"&#xff0c;并画出流程图和NS流程图。所谓"水仙花数"是指一个三位数&#xff0c;其各位数字立方和等于该数本身。例如&#xff1a;153是一个"水仙花数"&#xff0c;因为1531的三次方&#…...

wireshark捕获过滤和操作方式详解

大家觉得有用记得关注和点赞&#xff0c;谢谢。 一、Wireshark介绍 Wireshark&#xff08;前身是Ethereal&#xff09;是一个网络封包分析软件&#xff0c;目前是全球使用最广泛的开源抓包软件&#xff0c;别名小鲨鱼或者鲨鱼鳍。 网络封包分析软件的功能是截取网卡进出的网络…...

ChatGPT Search开放:实时多模态搜索新体验

点击访问 chatTools 免费体验GPT最新模型&#xff0c;包括o1推理模型、GPT4o、Claude、Gemini等模型&#xff01; ChatGPT Search&#xff1a;功能亮点解析 本次更新的ChatGPT Search带来了多项令人瞩目的功能&#xff0c;使其在搜索引擎市场中更具竞争力。 1. 高级语音模式&…...

【docker】docker swarm常用命令以及电商平台构建案例

1. 初始化Swarm集群 用于初始化一个Swarm集群&#xff0c;并将当前节点设置为Manager节点。 docker swarm init 用法&#xff1a; docker swarm init --advertise-addr <Manager节点IP>示例&#xff1a; docker swarm init --advertise-addr 192.168.1.100这会将当前节…...

3D计算机视觉概述

3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像&#xff08;像素表达&#xff…...

23. 合并 K 个升序链表(java)

题目描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff…...

与乐鑫相约 CES 2025|创新技术引领物联网与嵌入式未来

2025 国际消费电子产品展览会 (International Consumer Electronics Show, CES) 将于 2025 年 1 月 7 至 10 日在美国拉斯维加斯盛大开幕。作为全球规模最大、水准最高&#xff0c;且影响力最广的消费电子类科技盛会&#xff0c;CES 每年都吸引着全球行业领袖、开发者和技术爱好…...

MIPS指令集(一)基本操作

目录 计算机硬件的操作数 存储器操作数 常数或立即数操作数 有符号数和无符号数 指令的格式 逻辑操作 决策指令 循环 计算机硬件的操作数 先从一条C语句入手 a b c; 将其翻译为MIPS add a, b, c 其中a&#xff0c;b&#xff0c;c就是这条指令的操作数。表示将b与c…...

半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列

一、概述 在上一篇文章中&#xff0c;我们一起学习了STDF格式的文件&#xff0c;知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后&#xff0c;好比掌握了切入半导体行业的金钥匙。 从今天开始&#xff0c;我们一起来一步步地学习如何解构、熟…...

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前&#xff0c;让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目&#xff0c;让我们创建一个名为node-ssl -server 的目录&#xff0c;用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…...

C++中类和对象的细节原理

文章目录 一、C中的构造函数二、C中的析构函数三、两者的配合与注意事项四、C中的静态成员变量五、C中的静态成员函数六、C中普通成员函数和静态成员函数的区别七、C中的const成员变量八、C中的const 成员函数九、C中构造函数的初始化列表十、C中的浅拷贝操作十一、C中的深拷贝…...

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误&#xff1a;index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时&#xff0c;调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误&#xff1a; Model inference er…...

OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

windows和LINUX下校验文件的哈希值(MD5、SHA256)

可以通过两个文件的哈希值来对比两个文件是不是一模一样&#xff0c;有没有缺失 1、windows CertUtil -hashfile 文件路径 MD5 CertUtil -hashfile 文件路径 SHA256 2、Liunx 校验当前目录下所有文件 sha256sum . 校验指定文件名 sha256sum 文件名...

〔 MySQL 〕视图

以下是上述文章的目录&#xff1a; 一、视图概述 视图的定义 二、基本使用 创建视图查询视图修改视图影响基表查询验证删除视图 三、视图规则和限制 命名规则数量限制索引和触发器安全性ORDER BY规则与表一起使用 四、实战案例 牛客实战OJ修改基表影响视图查询验证删除…...