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

【Unity基础】Unity 2D实现拖拽功能的10种方法

在这里插入图片描述

方法1. 基于 Update 循环的拖拽方法 (DragDrop2D)

代码概述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DragDrop2D : MonoBehaviour
{bool isDraggable;bool isDragging;Collider2D objectCollider;void Start(){objectCollider = GetComponent<Collider2D>();isDraggable = false;isDragging = false;}void Update(){DragAndDrop();}void DragAndDrop(){Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);if (Input.GetMouseButtonDown(0)){if (objectCollider == Physics2D.OverlapPoint(mousePosition)){isDraggable = true;}else{isDraggable = false;}if (isDraggable){isDragging = true;}}if (isDragging){this.transform.position = mousePosition;}if (Input.GetMouseButtonUp(0)){isDraggable = false;isDragging = false;}}
}

特点与分析

  • 实现方式
    • 手动输入检测:在Update方法中通过检测鼠标按下、拖动和松开事件来实现拖拽。
    • 碰撞检测:使用Physics2D.OverlapPoint手动判断鼠标是否点击在对象的碰撞器上。
  • 优点
    • 简单直观:适合初学者理解和实现基础的拖拽功能。
  • 缺点
    • 代码复杂度:需要手动管理多个状态变量(isDraggableisDragging)。
    • 用户体验:直接将对象的位置设置为鼠标位置,可能导致拖拽时对象“跳跃”到鼠标位置,尤其是点击点不是对象中心时。
    • 可维护性:随着功能需求的增加,代码扩展性较差,难以处理复杂的交互情况。

方法2. 基于内置鼠标事件的方法 (`DragDropByMouse)

代码概述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DragDropByMouse : MonoBehaviour
{private bool isDragging;public void OnMouseDown(){isDragging = true;}public void OnMouseUp(){isDragging = false;}public void OnMouseDrag(){Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;transform.Translate(mousePosition);}private void OnTriggerEnter2D(Collider2D other){Debug.Log("collision " + other.name);}
}

特点与分析

  • 实现方式
    • 使用Unity内置事件方法:依赖OnMouseDownOnMouseUpOnMouseDrag等内置事件方法处理拖拽逻辑。
    • 自动交互检测:Unity自动调用这些事件方法,当鼠标与对象的碰撞器交互时,无需手动检测。
  • 优点
    • 代码简洁:通过内置事件方法管理拖拽状态,代码更简洁易懂。
    • 自动处理交互:无需手动检测鼠标与对象的碰撞,简化了交互逻辑。
    • 额外功能:实现了OnTriggerEnter2D方法,可以在拖拽过程中检测与其他碰撞器的碰撞,增加了互动功能。
  • 缺点
    • 拖拽体验OnMouseDrag方法中使用transform.Translate基于位移更新位置,但计算方式可能不如其他方法平滑,尤其是在高帧率或快速移动时。
    • 灵活性有限:依赖于Unity的内置事件系统,对于更复杂的拖拽需求可能需要额外的实现。

方法3. 基于事件接口 (EventSystem) 的拖拽方法 (`DragDropWithEvent)

代码概述

using UnityEngine;
using UnityEngine.EventSystems;public class DragDropWithEvent : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{private Vector3 offset; // 偏移量,用来保持拖动时鼠标和物体之间的相对位置private Camera mainCamera; // 主摄像机,用于屏幕坐标到世界坐标的转换private void Awake(){mainCamera = Camera.main;}public void OnBeginDrag(PointerEventData eventData){Vector3 mousePos = mainCamera.ScreenToWorldPoint(eventData.position);offset = transform.position - new Vector3(mousePos.x, mousePos.y, transform.position.z);Debug.Log("Begin drag");}public void OnDrag(PointerEventData eventData){Vector3 mousePos = mainCamera.ScreenToWorldPoint(eventData.position);transform.position = new Vector3(mousePos.x, mousePos.y, transform.position.z) + offset;Debug.Log("On Dragging");}public void OnEndDrag(PointerEventData eventData){Debug.Log("End Drag");}
}

特点与分析

  • 实现方式
    • 使用 EventSystem 接口:实现IBeginDragHandlerIDragHandlerIEndDragHandler接口,通过这些接口方法处理拖拽逻辑。
    • 偏移量管理:计算并保持拖拽时鼠标与对象之间的相对偏移量,确保拖拽过程中的平滑和自然。
  • 优点
    • 拖拽体验流畅:通过计算偏移量,避免了拖拽时对象位置的“跳跃”,提供更自然的拖拽体验。
    • 利用 EventSystem:更好地集成到Unity的事件系统中,支持更复杂的交互需求。
    • 扩展性强:可以轻松添加更多的拖拽相关逻辑,如拖拽过程中触发的其他事件或效果。
  • 缺点
    • 依赖 EventSystem:需要确保场景中存在 EventSystem,否则事件接口可能无法正常工作。
    • 稍复杂的实现:相较于基于内置鼠标事件的方法,实现接口需要更多的代码和理解。

三种方法的对比总结

特性/方法基于 Update 循环 (DragDrop2D)基于内置鼠标事件 (`DragDropByMouse)基于 EventSystem 接口 (`DragDropWithEvent)
实现方式手动检测鼠标输入和碰撞使用Unity内置的鼠标事件方法实现 EventSystem 的拖拽接口
代码复杂度中等,需管理多个状态变量低,依赖内置事件方法中等,需实现接口并管理偏移量
拖拽体验可能出现位置跳跃平滑性一般,基于位移更新非常流畅,保持鼠标与对象的相对位置
自动交互检测手动检测自动检测自动检测
扩展性较差,难以处理复杂交互一般,较难扩展更多功能优秀,易于添加更多拖拽相关功能
依赖组件需要 Collider2D需要 Collider2D需要 EventSystemCollider2D
额外功能支持碰撞检测可集成更多基于事件的功能
适用场景简单拖拽需求基础拖拽和碰撞检测需求需要流畅拖拽体验和高度可扩展性的复杂需求

推荐选择

  • 简单项目或初学者:如果项目需求较为简单,且开发者对Unity的事件系统不太熟悉,基于内置鼠标事件的方法 (DragDropByMouse) 是一个不错的选择。它实现简单,适合快速上手。
  • 需要更流畅体验和扩展性的项目:对于需要更高质量的拖拽体验以及可能扩展更多交互功能的项目,基于 EventSystem 接口的方法 (DragDropWithEvent) 更为适合。它提供了更自然的拖拽体验,并且易于集成更多复杂的逻辑。
  • 需要自定义拖拽逻辑:如果项目有特定的拖拽需求,且需要完全控制拖拽过程的每个细节,基于 Update 循环的方法 (DragDrop2D) 可能更灵活,但同时也需要更多的代码管理和逻辑控制。

除了上述三种方法,Unity中实现2D物体拖拽还有其他多种方法。不同的方法适用于不同的需求和场景。以下是一些常见的替代方法及其详细说明:

方法4. 基于 Rigidbody2D 的物理拖拽

概述

利用 Rigidbody2D 组件,通过物理引擎实现拖拽效果。这种方法适用于需要物理反馈(如碰撞、重力等)的拖拽场景。

实现步骤

  1. 添加组件

    • 为要拖拽的物体添加 Rigidbody2DCollider2D 组件。
    • 设置 Rigidbody2DBody TypeDynamic,以便受物理引擎控制。
  2. 创建拖拽脚本

    using UnityEngine;public class PhysicsDrag2D : MonoBehaviour
    {private Rigidbody2D rb;private Camera mainCamera;private bool isDragging = false;private Vector3 offset;void Start(){rb = GetComponent<Rigidbody2D>();mainCamera = Camera.main;}void Update(){Vector2 mousePosition = mainCamera.ScreenToWorldPoint(Input.mousePosition);if (Input.GetMouseButtonDown(0)){Collider2D collider = Physics2D.OverlapPoint(mousePosition);if (collider != null && collider.gameObject == this.gameObject){isDragging = true;offset = transform.position - new Vector3(mousePosition.x, mousePosition.y, transform.position.z);}}if (Input.GetMouseButtonUp(0)){isDragging = false;}}void FixedUpdate(){if (isDragging){Vector2 targetPosition = (Vector2)mainCamera.ScreenToWorldPoint(Input.mousePosition) + (Vector2)offset;rb.MovePosition(targetPosition);}}
    }
    

特点与分析

  • 优点
    • 物理反馈:拖拽过程中物体受物理引擎控制,适用于需要物理交互的场景。
    • 平滑移动:利用 Rigidbody2D.MovePosition 实现平滑的物体移动。
  • 缺点
    • 复杂性增加:需要理解和管理物理组件及其参数。
    • 性能开销:对于大量可拖拽物体,物理计算可能带来性能开销。

方法5. 使用 Unity 的新输入系统(Unity Input System)

概述

Unity 的新输入系统提供更灵活和可扩展的输入处理方式。可以结合新输入系统来实现拖拽功能,适用于需要支持多种输入设备(鼠标、触摸、游戏手柄等)的项目。

实现步骤

  1. 安装新输入系统

    • 在 Unity Package Manager 中安装 “Input System” 包。
    • 按提示切换到新输入系统,并重启编辑器。
  2. 创建输入动作

    • 创建一个新的 Input Actions 资产,配置鼠标或触摸输入动作。
  3. 编写拖拽脚本

    using UnityEngine;
    using UnityEngine.InputSystem;public class NewInputDrag2D : MonoBehaviour
    {private Camera mainCamera;private bool isDragging = false;private Vector3 offset;private void Awake(){mainCamera = Camera.main;}public void OnPointerDown(InputAction.CallbackContext context){if (context.performed){Vector2 mousePos = mainCamera.ScreenToWorldPoint(Mouse.current.position.ReadValue());Collider2D collider = Physics2D.OverlapPoint(mousePos);if (collider != null && collider.gameObject == this.gameObject){isDragging = true;offset = transform.position - new Vector3(mousePos.x, mousePos.y, transform.position.z);}}}public void OnPointerUp(InputAction.CallbackContext context){if (context.performed){isDragging = false;}}public void OnDrag(InputAction.CallbackContext context){if (isDragging){Vector2 mousePos = mainCamera.ScreenToWorldPoint(Mouse.current.position.ReadValue());transform.position = new Vector3(mousePos.x, mousePos.y, transform.position.z) + offset;}}
    }
    
  4. 绑定输入动作

    • Input Actions 资产中,将拖拽相关的动作绑定到脚本中的方法,如 OnPointerDownOnPointerUpOnDrag

特点与分析

  • 优点
    • 多设备支持:方便支持鼠标、触摸和其他输入设备。
    • 可扩展性:通过 Input Actions 资产轻松管理和扩展输入。
  • 缺点
    • 学习曲线:新输入系统相对复杂,需要一定的学习和配置时间。
    • 额外配置:需要额外的输入动作配置和绑定步骤。

方法6. 基于 Raycasting 的拖拽

概述

通过自定义射线检测(Raycasting)来识别并拖拽对象。这种方法适用于需要更精确控制拖拽逻辑的场景。

实现步骤

  1. 创建拖拽脚本

    using UnityEngine;public class RaycastDrag2D : MonoBehaviour
    {private Camera mainCamera;private bool isDragging = false;private Vector3 offset;private Rigidbody2D rb;void Start(){mainCamera = Camera.main;rb = GetComponent<Rigidbody2D>();}void Update(){Vector2 mousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);if (Input.GetMouseButtonDown(0)){RaycastHit2D hit = Physics2D.Raycast(mousePos, Vector2.zero);if (hit.collider != null && hit.collider.gameObject == this.gameObject){isDragging = true;offset = transform.position - new Vector3(mousePos.x, mousePos.y, transform.position.z);}}if (Input.GetMouseButtonUp(0)){isDragging = false;}if (isDragging){Vector2 targetPos = mousePos + (Vector2)offset;rb.MovePosition(targetPos);}}
    }
    

特点与分析

  • 优点
    • 精确控制:可以自定义射线检测的逻辑,适应复杂的交互需求。
    • 性能优化:射线检测可以减少不必要的碰撞检测,提高性能,尤其在有大量对象时。
  • 缺点
    • 复杂性增加:需要理解射线检测和物理层的交互。
    • 配置要求:需要合理设置碰撞器和物理层,避免射线误判。

方法7. 使用 Tweening 库进行动画拖拽

概述

利用 Tweening 库(如 DOTween)通过插值动画实现拖拽效果,适用于需要平滑动画过渡和复杂拖拽效果的场景。

实现步骤

  1. 安装 Tweening 库

    • 以 DOTween 为例,在 Unity Asset Store 或通过 Package Manager 安装 DOTween。
  2. 创建拖拽脚本

    using UnityEngine;
    using DG.Tweening;public class TweenDrag2D : MonoBehaviour
    {private Camera mainCamera;private bool isDragging = false;private Vector3 offset;void Start(){mainCamera = Camera.main;}void Update(){Vector2 mousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);if (Input.GetMouseButtonDown(0)){Collider2D collider = Physics2D.OverlapPoint(mousePos);if (collider != null && collider.gameObject == this.gameObject){isDragging = true;offset = transform.position - new Vector3(mousePos.x, mousePos.y, transform.position.z);}}if (Input.GetMouseButtonUp(0)){isDragging = false;}if (isDragging){Vector3 targetPos = new Vector3(mousePos.x, mousePos.y, transform.position.z) + offset;transform.DOMove(targetPos, 0.1f).SetEase(Ease.Linear);}}
    }
    

特点与分析

  • 优点
    • 平滑动画:Tweening 库提供平滑的动画过渡,提升用户体验。
    • 丰富的动画选项:可以轻松添加缓动效果、延迟等复杂动画。
  • 缺点
    • 额外依赖:需要引入第三方库,增加项目依赖。
    • 性能开销:大量使用 Tweening 动画可能带来性能开销,需优化使用。

方法8. 使用 UI 元素的拖拽

概述

将2D物体作为 UI 元素(如 ImageButton),利用 Unity 的 UI 系统进行拖拽。适用于需要与其他 UI 组件集成的拖拽场景。

实现步骤

  1. 设置 UI 元素

    • 将要拖拽的物体作为 UI 元素添加到 Canvas 下,确保有 CanvasGroup 组件。
  2. 创建拖拽脚本

    using UnityEngine;
    using UnityEngine.EventSystems;public class UIDrag2D : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
    {private Canvas canvas;private RectTransform rectTransform;private CanvasGroup canvasGroup;private Vector3 offset;void Awake(){rectTransform = GetComponent<RectTransform>();canvasGroup = GetComponent<CanvasGroup>();canvas = GetComponentInParent<Canvas>();}public void OnBeginDrag(PointerEventData eventData){canvasGroup.alpha = 0.6f; // 半透明表示正在拖拽canvasGroup.blocksRaycasts = false;Vector3 globalMousePos;if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out globalMousePos)){offset = rectTransform.position - globalMousePos;}}public void OnDrag(PointerEventData eventData){Vector3 globalMousePos;if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out globalMousePos)){rectTransform.position = globalMousePos + offset;}}public void OnEndDrag(PointerEventData eventData){canvasGroup.alpha = 1f;canvasGroup.blocksRaycasts = true;}
    }
    

特点与分析

  • 优点
    • 与 UI 集成:易于与其他 UI 组件(如按钮、面板)集成。
    • 简化输入管理:利用 UI 系统自动处理输入事件。
  • 缺点
    • 限制于 UI 元素:适用于 UI 元素,若需要拖拽非 UI 2D物体,需额外调整。
    • 层级管理:需要合理管理 UI 元素的层级和渲染顺序,避免遮挡问题。

方法9. 使用第三方插件

概述

利用 Unity Asset Store 上的第三方插件(如 NaughtyAttributes, EasyTouch, Lean Touch 等)来简化拖拽功能的实现。这些插件通常提供丰富的功能和更高的灵活性。

实现步骤

  1. 选择并安装插件
    • 根据项目需求选择合适的插件,下载安装并导入到项目中。
  2. 配置插件
    • 按照插件的文档和指南进行配置,通常包括添加组件、设置参数等。
  3. 编写拖拽逻辑
    • 利用插件提供的接口和方法,实现自定义的拖拽行为。

特点与分析

  • 优点
    • 功能丰富:第三方插件通常提供比内置方法更丰富的功能,如多点触控支持、惯性拖拽等。
    • 节省开发时间:利用现成的解决方案,减少自定义代码编写。
  • 缺点
    • 依赖性:引入第三方插件增加项目依赖,需关注插件的维护和兼容性。
    • 学习成本:需要学习和理解插件的使用方法和接口。

方法10. 基于动画控制器的拖拽

概述

通过动画控制器(Animator)和状态机管理拖拽状态,结合动画过渡实现拖拽效果。这种方法适用于需要复杂状态管理和动画过渡的拖拽场景。

实现步骤

  1. 创建动画状态

    • 在 Animator 中创建拖拽相关的动画状态(如 Idle、Dragging)。
  2. 配置动画过渡

    • 设置状态之间的过渡条件,如布尔参数 isDragging
  3. 编写拖拽脚本

    using UnityEngine;public class AnimatorDrag2D : MonoBehaviour
    {private Animator animator;private Camera mainCamera;private bool isDragging = false;private Vector3 offset;void Start(){animator = GetComponent<Animator>();mainCamera = Camera.main;}void Update(){Vector2 mousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);if (Input.GetMouseButtonDown(0)){Collider2D collider = Physics2D.OverlapPoint(mousePos);if (collider != null && collider.gameObject == this.gameObject){isDragging = true;animator.SetBool("isDragging", true);offset = transform.position - new Vector3(mousePos.x, mousePos.y, transform.position.z);}}if (Input.GetMouseButtonUp(0)){isDragging = false;animator.SetBool("isDragging", false);}if (isDragging){transform.position = new Vector3(mousePos.x, mousePos.y, transform.position.z) + offset;}}
    }
    

特点与分析

  • 优点
    • 动画集成:便于与其他动画效果集成,实现更复杂的视觉反馈。
    • 状态管理:利用 Animator 的状态机管理拖拽状态,清晰且易于维护。
  • 缺点
    • 复杂性高:需要设置 Animator Controller 和动画状态,增加开发复杂度。
    • 性能开销:频繁的动画状态切换可能带来性能开销,需优化。

方法11. 使用触摸事件(针对移动设备)

概述

在移动设备上,通过处理触摸事件来实现拖拽。这种方法适用于需要支持触摸交互的2D拖拽场景。

实现步骤

  1. 编写拖拽脚本

    using UnityEngine;public class TouchDrag2D : MonoBehaviour
    {private Camera mainCamera;private bool isDragging = false;private Vector3 offset;private int touchId = -1;void Start(){mainCamera = Camera.main;}void Update(){foreach (Touch touch in Input.touches){Vector2 touchPos = mainCamera.ScreenToWorldPoint(touch.position);if (touch.phase == TouchPhase.Began){Collider2D collider = Physics2D.OverlapPoint(touchPos);if (collider != null && collider.gameObject == this.gameObject){isDragging = true;touchId = touch.fingerId;offset = transform.position - new Vector3(touchPos.x, touchPos.y, transform.position.z);}}if (touch.fingerId == touchId){if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary){if (isDragging){Vector3 newPos = new Vector3(touchPos.x, touchPos.y, transform.position.z) + offset;transform.position = newPos;}}if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled){isDragging = false;touchId = -1;}}}}
    }
    

特点与分析

  • 优点
    • 移动优化:专为触摸设备设计,支持多点触控。
    • 直观交互:适合触摸屏的直观拖拽操作。
  • 缺点
    • 平台限制:主要针对移动设备,桌面设备可能不适用。
    • 复杂性增加:需要处理多点触控和不同触摸阶段。

总结与对比

以下是对这些拖拽方法的总结与对比:

方法实现方式优点缺点适用场景
基于 Update 循环手动检测输入和碰撞简单直观,适合初学者代码复杂,用户体验可能不佳基础拖拽需求,初学者项目
基于内置鼠标事件使用 OnMouseDown 等事件方法代码简洁,自动处理交互拖拽体验有限,灵活性较差基础拖拽和简单碰撞检测需求
基于 EventSystem 接口实现 IBeginDragHandler 等接口流畅拖拽体验,易扩展依赖 EventSystem,稍复杂需要流畅拖拽和复杂交互的项目
基于 Rigidbody2D 物理使用物理组件控制位置物理反馈,平滑移动需要管理物理组件,性能开销需要物理交互和反馈的拖拽场景
使用新输入系统利用 Unity 新输入系统处理输入多设备支持,灵活可扩展学习曲线陡峭,额外配置需要支持多种输入设备的项目
基于 Raycasting自定义射线检测拖拽逻辑精确控制,性能优化实现复杂,需管理射线检测需要精确控制和优化性能的拖拽场景
使用 Tweening 库利用动画插值实现拖拽平滑动画,丰富动画选项依赖第三方库,性能开销需要复杂动画过渡和视觉效果的拖拽项目
使用 UI 元素拖拽将物体作为 UI 元素,利用 UI 系统拖拽与 UI 集成,简化输入管理仅适用于 UI 元素,层级管理复杂需要与 UI 组件集成的拖拽场景
使用第三方插件利用 Asset Store 插件简化实现功能丰富,节省开发时间增加项目依赖,需学习插件使用方法需要快速实现复杂拖拽功能的项目
基于动画控制器利用 Animator 管理拖拽状态和动画与动画集成,清晰状态管理实现复杂,可能影响性能需要复杂状态管理和动画过渡的拖拽项目
使用触摸事件处理触摸输入实现拖拽支持多点触控,适合移动设备平台限制,需处理多点触控移动设备上的触摸拖拽场景

推荐选择

  • 简单项目或初学者:如果项目需求简单,且希望快速实现拖拽功能,基于内置鼠标事件的方法 (DragDropCard)基于 Update 循环的方法 (DragDrop2D) 是不错的选择。
  • 需要流畅体验和复杂交互:对于需要更流畅拖拽体验和易于扩展的项目,基于 EventSystem 接口的方法 (Draggable2DSprite) 更为合适。
  • 需要物理反馈:如果拖拽过程中需要物理交互,基于 Rigidbody2D 的物理拖拽 是最佳选择。
  • 多设备支持:需要支持鼠标、触摸等多种输入设备时,使用 Unity 新输入系统触摸事件方法 更为合适。
  • 动画需求:需要丰富的动画效果和状态管理时,使用 Tweening 库基于动画控制器的方法 可以实现更复杂的拖拽效果。
  • 集成 UI:如果拖拽对象是 UI 元素,使用 UI 元素的拖拽方法 更为方便。
  • 节省开发时间:对于需要快速实现复杂拖拽功能的项目,使用第三方插件 是一个高效的选择。

结论

Unity 提供了多种实现2D物体拖拽的方法,每种方法都有其适用的场景和优缺点。选择合适的方法取决于项目的具体需求、开发者的熟悉程度以及对拖拽体验和功能扩展性的要求。理解各种方法的实现机制和适用场景,有助于在实际开发中做出更合适的选择。

相关文章:

【Unity基础】Unity 2D实现拖拽功能的10种方法

方法1. 基于 Update 循环的拖拽方法 (DragDrop2D) 代码概述 using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragDrop2D : MonoBehaviour {bool isDraggable;bool isDragging;Collider2D objectCollider;void Start(){objectC…...

duxapp中兼容多端的 BoxShadow 阴影组件

由于RN 安卓端对阴影的支持不太完善&#xff0c;使用这个组件可以实现阴影效果 在RN端是使用 react-native-fast-shadow 实现的 示例 import { BoxShadow, Text } from /duxui<BoxShadow><Text>这是内容</Text> </BoxShadow>Props 继承自Taro的View…...

服务器---centos上安装docker并使用docker配置jenkins

要在 Docker 中安装 Jenkins 并进行管理,可以按照以下步骤操作: 1. 安装 Docker 首先,确保你的系统已经安装了 Docker。如果尚未安装,可以使用以下命令进行安装: 在 CentOS 上安装 Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://…...

Linux系统操作03|chmod、vim

上文&#xff1a; Linux系统操作02|基本命令-CSDN博客 目录 六、chmod&#xff1a;给文件设置权限 1、字母法 2、数字法&#xff08;用的最多&#xff09; 七、vim&#xff1a;代码编写和文本编辑 1、启动和退出 1️⃣启动 2️⃣退出 2、vim基本操作 六、chmod&#x…...

数据库同步中间件DBSyncer安装配置及使用

1、介绍 DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务&#xf…...

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色...

ISP帳戶會記錄什麼資訊?

許多用戶並不知道ISP會記錄有關線上活動的大量資訊。從流覽歷史記錄到數據使用情況&#xff0c;ISP經常收集和保留用戶數據&#xff0c;引發一系列隱私問題。 ISP 記錄哪些數據&#xff1f; ISP可以根據其隱私政策記錄各種類型的資訊。常見的記錄數據包括&#xff1a; 1.流覽…...

Facebook如何避免因IP变动而封号?实用指南

随着Facebook在个人社交与商业推广中的广泛应用&#xff0c;越来越多的用户面临因“IP变动”而被封号的问题。尤其是跨境电商、广告运营者和多账号管理用户&#xff0c;这种情况可能严重影响正常使用和业务发展。那么&#xff0c;如何避免因IP变动导致的封号问题&#xff1f;本…...

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值&#xff1a; 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析&#xff0c;中国&#xff0c;李宗璋用EXCEL学统计学&#xff0c;日EXCEL统计分析与决策&#x…...

web网页连接MQTT,显示数据与下发控制命令

web网页连接MQTT&#xff0c;显示数据与下发控制命令 零、前言 在完成一些设备作品后&#xff0c;常常会因为没有一个上位机用来实时检测数据和下发命令而苦恼&#xff0c;在上一篇文章中提到了怎么白嫖阿里云服务器&#xff0c;并且在上面搭建了属于自己的web网站。那么现在…...

数据结构day3作业

一、完整功能【顺序表】的创建 【seqList.h】 #ifndef __SEQLIST_H__ #define __SEQLIST_H__#include <stdio.h> #include <string.h> #include <stdlib.h>//宏定义&#xff0c;线性表的最大容量 #define MAX 30//类型重定义&#xff0c;表示要存放数据的类…...

Android SDK 平台工具版本说明

Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具&#xff0c;主要是 adb 和 fastboot。虽然 adb 是 Android 应用开发所必需的&#xff0c;但应用开发者通常仅使用 Studio 安装的副本。如果您想直接从命令行使用 adb 并且未安装 S…...

Sharding-jdbc基本使用步骤以及执行原理剖析

一、基本使用步骤 1、需求说明 使用sharding-jdbc完成对订单表的水平分表&#xff0c;通过快速入门的开发&#xff0c;了解sharding-jdbc使用方法 人工创建两张表&#xff0c;t_order_1和t_order_2&#xff0c;这两张表是订单表拆分后的表&#xff0c;通过sharding-jdbc向订…...

mysql重置root密码(适用于5.7和8.0)

今天出一期重置mysql root密码的教程&#xff0c;适用于5.7和8.0&#xff0c;在网上搜索了很多的教程发现都没有效果&#xff0c;浪费了很多时间&#xff0c;尝试了多次之后发现这种方式是最稳妥的&#xff0c;那么废话不多说&#xff0c;往下看&#xff1a; 目录 第一步&…...

Linux下SVN客户端保存账号密码

参考文章&#xff1a;解决&#xff1a;Linux上SVN 1.12版本以上无法直接存储明文密码_linux svn 保存密码-CSDN博客新版本svn使用gpg-agent存储密码-CSDN博客svn之无法让 SVN 存储密码&#xff0c;即使配置设置为允许_编程设计_ITGUEST 方法一&#xff1a;明文方式保存密码 首…...

centos7.9 gcc升级到11.2.1

一、信息查看 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Copyright © 2015 Free Software Foundation, Inc. 本程序是自由软件&#xff1b;请参看源代码的版权声明。本软件没有任…...

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构 效果图DRAWTEXTREL示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont DRAWTEXTABS示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont 效果图 …...

数仓高频面试 | 数仓为什么要分层

大家好&#xff0c;我是大D呀。 关于数仓分层&#xff0c;在面试过程中几乎是必问的。不过&#xff0c;面试官一般也不会直接考你数仓为什么要分层&#xff0c;而是在你介绍项目时&#xff0c;可能会换一种形式来穿插着问&#xff0c;比如数据链路为什么要这样设计&#xff0c…...

网络安全—部署CA证书服务器

网络拓扑 两台服务器在同一网段即可&#xff0c;即能够互相ping通。 安装步骤 安装证书系统 首先我们对计算机名进行确认&#xff0c;安装了证书系统后我们是不能随意更改计算机名字的&#xff0c;因为以后颁发的证书都是和计算机也就是这一台的服务器名字有关。 修改完成后开…...

MATLAB中circshift函数的原理分析——psf2otf函数的核心

之所以讲到MATLAB中circshift函数&#xff0c;也是源于Rafael Gonzalez的这个图&#xff0c;作为前几篇答廖老师问的blog的基础。 Rafael Gonzalez的这个图无论从哪幅图到哪幅图都不是直接的傅里叶变换或傅里叶逆变换&#xff0c;需要循环移位&#xff0c;即circshift函数。 这…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...