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

【Unity3D】实现横版2D游戏——攀爬绳索(简易版)

目录

GeneRope.cs 场景绳索生成类 

HeroColliderController.cs 控制角色与单向平台是否忽略碰撞

HeroClampController.cs 控制角色攀爬

OnTriggerEnter2D方法

OnTriggerStay2D方法

OnTriggerExit2D方法

Update方法

开始攀爬

结束攀爬

Sensor_HeroKnight.cs 角色触发器

HeroKnight.cs 角色类


  

基于【Unity3D】实现横版2D游戏——单向平台(简易版)-CSDN博客

实现了单向平台后才能进行攀爬绳索到平台,否则攀爬到平台后会被阻挡,以及无法从平台往下攀爬。

GeneRope.cs 场景绳索生成类 

GitHub - dbrizov/NaughtyAttributes: Attribute Extensions for Unity

上面是一个特性能够让脚本上出现一个按钮去点击执行我们的生成绳索方法   

用法:[Button("Generate Rope")] 写在生成绳索方法头部。

绳索标签Rope

using System.Collections;
using NaughtyAttributes;
using System.Collections.Generic;
using UnityEngine;[ExecuteInEditMode]
public class GeneRope : MonoBehaviour
{public Sprite top;public Sprite middle;public Sprite bottom;public int ropeNodeCount;public Vector2 ropeNodeSize;List<GameObject> nodeList;BoxCollider2D boxCollider2D;[Button("Generate Rope")]public void GenerateRope(){//清理if (nodeList == null){nodeList = new List<GameObject>();}else{for (int i = nodeList.Count - 1; i >= 0; i--){DestroyImmediate(nodeList[i]);}nodeList.Clear();}Transform[] childrens = transform.GetComponentsInChildren<Transform>();if (childrens != null && childrens.Length > 0){for (int i = childrens.Length - 1; i >= 0; i--){if (childrens[i].gameObject != this.gameObject){DestroyImmediate(childrens[i].gameObject);}}}//生成绳索节点图片for (int i = 0; i < ropeNodeCount; i++){Sprite sprite;if (i == 0){//头部sprite = top;}else if (i == ropeNodeCount - 1){//尾部sprite = bottom;}else{//中间sprite = middle;}SpriteRenderer sp = new GameObject("node_" + i, typeof(SpriteRenderer)).GetComponent<SpriteRenderer>();sp.sprite = sprite;nodeList.Add(sp.gameObject);sp.transform.SetParent(transform);//从根节点向下延伸的绳索sp.transform.localPosition = new Vector3(0, i * -ropeNodeSize.y - 0.5f, 0);}//生成绳索碰撞体(1个)boxCollider2D = GetComponent<BoxCollider2D>();if (boxCollider2D == null){boxCollider2D = gameObject.AddComponent<BoxCollider2D>();}boxCollider2D.size = new Vector2(ropeNodeSize.x, ropeNodeSize.y * ropeNodeCount);boxCollider2D.offset = new Vector2(0, boxCollider2D.size.y * -0.5f);boxCollider2D.isTrigger = true;//绳索标签(触发检测使用判定是否为绳索,处理攀爬逻辑)gameObject.tag = "Rope";}
}

HeroColliderController.cs 控制角色与单向平台是否忽略碰撞

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class HeroColliderController : MonoBehaviour
{BoxCollider2D heroCollider;public bool isOn;Collider2D m_Collision;public bool isIgnoreCollision = false;private void Awake(){heroCollider = GetComponent<BoxCollider2D>();}IEnumerator StartIgnoreCollision(Collider2D collider2D){//Debug.Log("忽略碰撞");//等待人物完整地达到平台上 或 平台下时 退出死循环while (isOn){yield return new WaitForEndOfFrame();}//Debug.Log("恢复");Physics2D.IgnoreCollision(heroCollider, collider2D, false); //恢复isIgnoreCollision = false;isOn = false;}private void OnTriggerEnter2D(Collider2D collision){//实现从下往上跳跃穿过单向平台效果if (collision != null && collision.gameObject.tag == "SingleDirCollider" && !isOn){//this.transform.position.y + 0.062f是人物minYif (collision.GetComponent<SingleDirCollider>().maxY > (this.transform.position.y + 0.062f)){IgnoreCollision(collision);}}}private void OnCollisionStay2D(Collision2D collision){//实现按下↓键位 让角色从单方向平台往下掉效果if (Input.GetKeyDown(KeyCode.DownArrow) && collision.gameObject.tag == "SingleDirCollider"){IgnoreCollision(collision.collider);}}public void IgnoreCollision(Collider2D collision){isOn = true;m_Collision = collision;Physics2D.IgnoreCollision(heroCollider, collision); //这2个碰撞体互相忽略碰撞isIgnoreCollision = true;StartCoroutine(StartIgnoreCollision(collision));}public void ResumeCollider(){Physics2D.IgnoreCollision(heroCollider, m_Collision, false); //恢复isOn = false;isIgnoreCollision = false;}private void OnTriggerExit2D(Collider2D collision){if (collision != null && collision.gameObject.tag == "SingleDirCollider" && isOn){var singleDirCollider = collision.GetComponent<SingleDirCollider>();//this.transform.position.y + 0.062f是人物minY, this.transform.position.y + 1.31f是人物maxY//当人物完整地位于平台之上 或 之下时if (singleDirCollider.maxY < (this.transform.position.y + 0.062f) || singleDirCollider.minY > (this.transform.position.y + 1.31f)){//协程死循环退出isOn = false;}}}
}

HeroClampController.cs 控制角色攀爬

OnTriggerEnter2D方法

当某个触发器检测到单向平台,持有它 并 triggerCount计数+1

OnTriggerStay2D方法

当角色检测到绳索时,角色底部在绳索顶部之上,需要按↓键才开始往下爬,此时需要立刻将角色底部瞬移到绳索顶部之下,避免与结束攀爬条件3冲突即

//3.接触单向平台 且人物在单向平台之上时 离开攀爬
lastIsTouchSingleDirPlatform = (singleDirCollider.maxY) < (heroKnight.transform.position.y + 0.062f);

角色底部在绳索顶部之下,需要按↑键才开始往上爬。 

OnTriggerExit2D方法

检测到某个触发器离开单向平台时,triggerCount计数-1,当triggerCount为0时,需要进行结束攀爬条件2判定

//2.接触单向平台 且人物在单向平台之上时 离开攀爬
lastIsTouchSingleDirPlatform = (singleDirCollider.maxY) <= (heroKnight.transform.position.y + 0.062f);

 并且将持有的单向平台脚本置空 singleDirCollider = null;

Update方法

检查到攀爬中,会使用角色类heroKnight.MoveY移动角色进行匀速运动上下攀爬。
进行结束攀爬条件1,2种情况:
1、isGrounds && !singleDirCollider :在地面且没有接触中的单向平台,结束攀爬
2、isGrounds && singleDirCollider && (singleDirCollider.maxY) <= (heroKnight.transform.position.y + 0.062f):在地面且接触单向平台中且角色在平台之上,结束攀爬。

开始攀爬

需要立即忽略重力影响以及接触中的单向平台碰撞体,否则会发生异常。

结束攀爬

需要立即恢复重力以及碰撞体

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class HeroClampController : MonoBehaviour
{//英雄类对象 控制移动HeroKnight heroKnight;//是否处于攀爬状态public bool isOn;//仅用于观察、调试参数public bool heroGround;//仅用于观察 绳索Y参数public float ropeY;//攀爬速度public float speed = 2f;//攀爬达到的单向平台private SingleDirCollider singleDirCollider;private int triggerCount = 0; //可能会有多个触发检测到平台,需要用计数形式来检测 是否完全离开平台//一个控制是否忽略角色与平台碰撞的控制器(攀爬开始 检测到平台会立刻忽略碰撞 防止角色和平台发生碰撞, 以及结束攀爬时立即恢复碰撞 让玩家站在上面)private HeroColliderController heroColliderController;//仅用于观测数据 调试 : 上次是否触碰到单向平台 并恰好离开了平台 标记public bool lastIsTouchSingleDirPlatform;void Start(){heroKnight = GetComponent<HeroKnight>();heroColliderController = GetComponent<HeroColliderController>();}public float InputY{get{return Input.GetAxis("Vertical");}}private void Update(){heroGround = heroKnight.IsGrounded();if (isOn){//攀爬移动float inputY = InputY;heroKnight.MoveY(inputY * speed * Time.deltaTime);//Debug.Log("攀爬:" + (inputY * speed * Time.deltaTime) + ", posY:" + (heroKnight.transform.position.y + 0.062f));bool isGrounds = heroKnight.IsGrounded();//1.接触地面 离开攀爬//2.接触单向平台 且人物在单向平台之上时 离开攀爬bool isTouchGround = isGrounds && !singleDirCollider;bool isTouchSingleDirPlatform = isGrounds && singleDirCollider && (singleDirCollider.maxY) <= (heroKnight.transform.position.y + 0.062f);if (isTouchGround || isTouchSingleDirPlatform){EndClamp();//Debug.LogError("攀爬结束 isOn:" + isOn + ", isTouchGround:" + isTouchGround + ", isTouchSingleDirPlatform:" + isTouchSingleDirPlatform//    + " singleDirCollider.maxY:" + singleDirCollider?.maxY + ", posY:" + (heroKnight.transform.position.y + 0.062f));}}}private void OnTriggerEnter2D(Collider2D collision){//触发检测到平台 持有它if (collision.tag == "SingleDirCollider"){triggerCount++;singleDirCollider = collision.transform.GetComponent<SingleDirCollider>();}}private void OnTriggerStay2D(Collider2D collision){if (isOn && singleDirCollider != null){//3.接触单向平台 且人物在单向平台之上时 离开攀爬lastIsTouchSingleDirPlatform = (singleDirCollider.maxY) < (heroKnight.transform.position.y + 0.062f);//Debug.LogError("离开时: " + (singleDirCollider.maxY) + ", HeroY:" + (heroKnight.transform.position.y + 0.062f));                if (lastIsTouchSingleDirPlatform){EndClamp();//Debug.LogError(">>>>> 3333 攀爬结束 isOn:" + isOn + ", isTouchSingleDirPlatform:" + lastIsTouchSingleDirPlatform//    + " singleDirCollider.maxY:" + singleDirCollider?.maxY + ", posY:" + (heroKnight.transform.position.y + 0.062f));}}if (collision.tag == "Rope" && !isOn){float inputY = InputY;bool hasInput = Mathf.Abs(inputY) > 0;bool isGrounds = heroKnight.IsGrounded();bool isValidInput = !isGrounds; //非站立地面则允许攀爬float heroY = heroKnight.transform.position.y + 0.062f;float ropeY = collision.transform.position.y;float deltaY = Mathf.Abs(heroY - ropeY); //绳索顶部和英雄底部的差值//若站立地面上if (hasInput && isGrounds){this.ropeY = ropeY;if (heroY > ropeY){isValidInput = inputY < 0; //角色位于绳索上方,按↓键才能攀爬}else{isValidInput = inputY > 0; //角色位于绳索下方,按↑键才能攀爬}}//Debug.Log("isValidInput:" + isValidInput + " inputY :"  + inputY + ", heroY:" + heroY + ", ropeY:" + ropeY);if (hasInput && isValidInput) //可以检测角色中心点x是否在绳索范围内才进入攀爬状态{var hero = heroKnight.transform;var rope = collision.transform;int dir = (inputY > 0 ? 0 : -1); //按↑时不需要偏移Y值,按↓时进行偏移//Debug.LogError("攀爬开始 heroY:" + heroY + ", ropeY:" + ropeY + ", inputY:" + inputY + ", isGrounds:" + isGrounds);//当角色从绳索顶部往下爬时,需要增加一个Y轴偏移 使得角色底部位于绳索顶部之下 避免发生临界点问题//(避免:开始攀爬 又会检测到物体在绳索上而结束攀爬的情况)float offsetY = 0f;if (heroY > ropeY){offsetY = -deltaY - 0.01f;}hero.position = new Vector3(rope.position.x, hero.position.y + offsetY, 0);isOn = true;heroKnight.isClamp = true;heroKnight.BlockGravity(true); //禁用重力影响if (singleDirCollider != null){heroColliderController.IgnoreCollision(singleDirCollider.GetComponent<BoxCollider2D>()); //主动忽略碰撞体}//heroKnight.MoveY(inputY * speed * Time.deltaTime);//Debug.LogError("攀爬开始 isOn:" + isOn + ", heroY:" + (hero.position.y + 0.062f) + ", dir * deltaY:" + dir * deltaY);}}//Debug.Log("heroKnight.transform.position.y + 0.062f:" + (heroKnight.transform.position.y + 0.062f));}private void OnTriggerExit2D(Collider2D collision){if (collision.tag == "SingleDirCollider" && singleDirCollider != null && collision.gameObject == singleDirCollider.gameObject){triggerCount--;if (triggerCount <= 0){if (isOn){//2.接触单向平台 且人物在单向平台之上时 离开攀爬lastIsTouchSingleDirPlatform = (singleDirCollider.maxY) <= (heroKnight.transform.position.y + 0.062f);//Debug.LogError("离开时: " + (singleDirCollider.maxY) + ", HeroY:" + (heroKnight.transform.position.y + 0.062f));                if (lastIsTouchSingleDirPlatform){EndClamp();//Debug.LogError(">>>>> 2222 攀爬结束 isOn:" + isOn + ", isTouchSingleDirPlatform:" + lastIsTouchSingleDirPlatform//    + " singleDirCollider.maxY:" + singleDirCollider?.maxY + ", posY:" + (heroKnight.transform.position.y + 0.062f));}}singleDirCollider = null;}}//还有其他的情况 退出攀爬状态的,比如攀爬中允许跳出去之类的 就还要写类似计数形式的 检测是否完全离开了绳索,再结束攀爬状态isOn = false//if (collision.tag == "Rope")//{//    isOn = false;//}}/// <summary>/// 结束攀爬/// </summary>private void EndClamp(){isOn = false;heroKnight.isClamp = false;heroKnight.BlockGravity(false); //恢复重力影响if (heroColliderController != null){heroColliderController.ResumeCollider(); //恢复碰撞体}}
}

Sensor_HeroKnight.cs 角色触发器

主要是忽略对Rope绳索层的检测,否则角色会认为绳索是地面或障碍物。

using UnityEngine;
using System.Collections;public class Sensor_HeroKnight : MonoBehaviour
{public int m_ColCount = 0;public float m_DisableTimer;public bool m_State;private void OnEnable(){m_ColCount = 0;}public bool State(){if (m_DisableTimer > 0){m_State = false;return m_State;}m_State = m_ColCount > 0;return m_State;}void OnTriggerEnter2D(Collider2D other){if (other.tag != "Rope"){m_ColCount++;}}void OnTriggerExit2D(Collider2D other){if (other.tag != "Rope"){m_ColCount--;}}void Update(){m_DisableTimer -= Time.deltaTime;}public void Disable(float duration){m_DisableTimer = duration;}
}

HeroKnight.cs 角色类

如下是部分代码新增isClamp是否攀爬中标记,Move和Roll判定要加上非攀爬中才允许进行,新增MoveY(攀爬时上下移动使用)、BlockGravity(禁用重力影响 攀爬时会禁用)、IsGrounded(获取是否真正在地面上)

    public bool isClamp;// Moveif (!m_rolling && !isClamp )m_body2d.velocity = new Vector2(inputX * m_speed, m_body2d.velocity.y);// Rollelse if (Input.GetKeyDown("left shift") && !m_rolling && !isClamp){m_rolling = true;m_animator.SetTrigger("Roll");m_body2d.velocity = new Vector2(m_facingDirection * m_rollForce, m_body2d.velocity.y);}public void MoveY(float y){m_body2d.MovePosition(new Vector2(transform.position.x, transform.position.y + y));}public void BlockGravity(bool isStatic){float oldScale = m_body2d.gravityScale;float newScale = isStatic ? 0f : 1f;if (Mathf.Abs(oldScale - newScale) > 0.0001){m_body2d.gravityScale = newScale;m_body2d.velocity = new Vector2(0, 0);}}public bool IsGrounded() { return m_groundSensor.State(); }

相关文章:

【Unity3D】实现横版2D游戏——攀爬绳索(简易版)

目录 GeneRope.cs 场景绳索生成类 HeroColliderController.cs 控制角色与单向平台是否忽略碰撞 HeroClampController.cs 控制角色攀爬 OnTriggerEnter2D方法 OnTriggerStay2D方法 OnTriggerExit2D方法 Update方法 开始攀爬 结束攀爬 Sensor_HeroKnight.cs 角色触发器…...

JS 时间格式大全(含大量示例)

在 JS 中&#xff0c;处理时间和日期是常见的需求。无论是展示当前时间、格式化日期字符串&#xff0c;还是进行时间计算&#xff0c;JavaScript 都提供了丰富的 API 来满足这些需求。本文将详细介绍如何使用 JavaScript 生成各种时间格式&#xff0c;从基础到高级&#xff0c;…...

opencv裁剪视频区域

import cv2 # 打开视频文件 video_path input.mp4 cap cv2.VideoCapture(video_path) # 获取视频的帧率、宽度和高度 fps int(cap.get(cv2.CAP_PROP_FPS)) width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 定义裁剪区…...

C++ deque(1)

1.deque介绍 deque的扩容不像vector那样麻烦 直接新开一个buffer 不用重新开空间再把数据全部移过去 deque本质上是一个指针数组和vector<vector>不一样&#xff0c;vector<vector>本质上是一个vector对象数组&#xff01;并且vector<vector>的buffer是不一…...

MapReduce概述

目录 1. MapReduce概述2. MapReduce的功能2.1 数据划分和计算任务调度2.2 数据/代码互定位2.3 系统优化2.4 出错检测和恢复 3. MapReduce处理流程4. MapReduce编程基础参考 1. MapReduce概述 MapReduce是面向大数据并行处理的计算模型、框架和平台:   1. 基于集群的高性能并行…...

DOM操作中childNodes与children的差异及封装方案

引言 在JavaScript的DOM操作中&#xff0c;childNodes和children是开发者常用的属性&#xff0c;但它们在浏览器中的行为差异可能导致兼容性问题。尤其是在处理空白符&#xff08;如换行符\n&#xff09;时&#xff0c;某些浏览器&#xff08;如Chrome和Edge&#xff09;会将空…...

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

分布式系统架构怎么搭建?

分布式系统架构 互联网企业的业务飞速发展&#xff0c;促使系统架构不断变化。总体来说&#xff0c;系统架构大致经历了单体应用架构—垂直应用架构—分布式架构—SOA架构—微服务架构的演变&#xff0c;很多互联网企业的系统架构已经向服务化网格&#xff08;Service Mesh&am…...

大模型知识蒸馏技术(2)——蒸馏技术发展简史

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl2006年模型压缩研究 知识蒸馏的早期思想可以追溯到2006年,当时Geoffrey Hinton等人在模型压缩领域进行了开创性研究。尽管当时深度学习尚未像今天这样广泛普及,但Hinton的研究已经为知识迁移和模…...

C++初阶 -- 泛型编程(函数模板、类模板)入门

目录 一、泛型编程 1.1 介绍 二、函数模板 2.1 函数模板的概念 2.2 函数模板的格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.4.1 隐式实例化 2.4.2 显式实例化 2.5 模板参数的匹配原则 三、类模板 3.1 类模板的使用格式 3.2 类模板的实例化 一、泛型编程 在有…...

[EAI-027] RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation

Paper Card 论文标题&#xff1a;RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者&#xff1a;Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接&#xff1a;https://arxiv.org/ab…...

MongoDB常见的运维工具总结介绍

MongoDB 提供了一些强大的运维工具&#xff0c;帮助管理员进行数据库监控、备份、恢复、性能优化等操作。以下是一些常见的 MongoDB 运维工具及其功能介绍&#xff1a; 1. MongoDB Atlas 功能&#xff1a;MongoDB Atlas 是 MongoDB 官方的云托管数据库服务&#xff0c;它提供…...

dify实现原理分析-rag-数据检索的实现

数据检索的总体执行步骤 数据检索总体步骤如下&#xff1a; #mermaid-svg-YCRNdSE7T1d0Etyj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YCRNdSE7T1d0Etyj .error-icon{fill:#552222;}#mermaid-svg-YCRNdSE7T1d…...

20个整流电路及仿真实验汇总

0、 前言 以下是关于“20个整流电路及仿真实验汇总”的前言部分: 在现代电力电子技术领域,整流电路作为将交流电(AC)转换为直流电(DC)的关键电路,广泛应用于各类电源设计、信号处理以及电力电子设备中。整流电路不仅能够为电子设备提供稳定的直流电源,还在电力传输、…...

CVE-2020-0796永恒之蓝2.0(漏洞复现)

目录 前言 产生原因 影响范围 漏洞复现 复现环境 复现步骤 防御措施 总结 前言 在网络安全的战场上&#xff0c;漏洞一直是攻防双方关注的焦点。CVE-2020-0796&#xff0c;这个被称为 “永恒之蓝 2.0” 的漏洞&#xff0c;一度引起了广泛的关注与担忧。它究竟是怎样的…...

爬虫基础(一)HTTP协议 :请求与响应

前言 爬虫需要基础知识&#xff0c;HTTP协议只是个开始&#xff0c;除此之外还有很多&#xff0c;我们慢慢来记录。 今天的HTTP协议&#xff0c;会有助于我们更好的了解网络。 一、什么是HTTP协议 &#xff08;1&#xff09;定义 HTTP&#xff08;超文本传输协议&#xff…...

拼车(1094)

1094. 拼车 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:bool carPooling(vector<vector<int>>& trips, int capacity) {uint32_t passenger_cnt 0;//将原数据按照from排序auto func_0 [](vector<int> & …...

Ubuntu全面卸载mysql

如果你已经看到whereis mysql输出了与MySQL相关的路径&#xff0c;说明MySQL仍然存在于系统中。要卸载MySQL&#xff0c;可以按照以下步骤操作&#xff0c;确保完全删除所有相关的文件和配置&#xff1a; 1. 停止MySQL服务 首先&#xff0c;停止MySQL服务&#xff1a; sudo …...

@Inject @Qualifier @Named

Inject Qualifier Named 在依赖注入&#xff08;DI&#xff09;中&#xff0c;Inject、Qualifier 和 Named 是用于管理对象创建和绑定的关键注解。以下是它们的用途、依赖配置和代码示例的详细说明&#xff1a; 1. 注解的作用 Inject&#xff1a;标记需要注入的构造函数、字段…...

OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?

找了一圈发现官方的文档都是最新的&#xff0c;3.2很多API都不支持&#xff0c;比如获取OhosAppContext&#xff0c;通过OhosAppContext来获取应用版本号&#xff0c;最终是通过读取app.json5的文件内容来读取版本号&#xff0c;最终修改entry下的hvigorfile.ts如下&#xff0c…...

初始化mysql报错cannot open shared object file: No such file or directory

报错展示 我在初始化msyql的时候报错&#xff1a;mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读&#xff1a; libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要&#xff0c;因此…...

Vue.js组件开发-实现全屏背景图片滑动切换特效

使用 Vue 实现全屏背景图片滑动切换特效的详细步骤、代码、注释和使用说明。 步骤 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个新的 Vue 项目。准备图片资源&#xff1a;准备好要用于背景切换的图片&#xff0c;并将它们放在项目的合适目录下。编写 HTML 结构&#xff1…...

AI在自动化测试中的伦理挑战

在软件测试领域&#xff0c;人工智能&#xff08;AI&#xff09;已经不再是遥不可及的未来技术&#xff0c;而是正在深刻影响着测试过程的现实力量。尤其是在自动化测试领域&#xff0c;AI通过加速测试脚本生成、自动化缺陷检测、测试数据生成等功能&#xff0c;极大提升了测试…...

FreeRTOS的任务创建和删除

1&#xff0c;任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 动态创建任务&#xff1a; 任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 FreeRTOS 从 FreeRTOS 管理的堆中分配。 静态创建任务&#xff1a; 任务的任务控制块以及任务的…...

【C++】STL容器使用与实现详解:vector

文章目录 Ⅰ. vector的介绍和使用一、vector的介绍二、vector的使用 &#xff08;只列出比较重要的&#xff0c;其他的需要时查文档&#xff09;1. vector的定义2. vector iterator&#xff08;迭代器&#xff09;的使用3. vector 容量问题4. vector 增删查改5. 正确释放 vecto…...

【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用

论文信息 标题: Dynamic Snake Convolution based on Topological Geometric Constraints for Tubular Structure Segmentation 作者: 戚耀磊、何宇霆、戚晓明、张媛、杨冠羽 会议: 2023 IEEE/CVF International Conference on Computer Vision (ICCV) 发表时间: 2023年10月…...

物业管理软件引领社区智能化转型提升服务效率与居民生活质量

内容概要 物业管理软件的出现&#xff0c;标志着社区管理方式的一场革命&#xff0c;它不仅仅是一个工具&#xff0c;更是推动智能化转型的关键助力。通过高效的管理功能&#xff0c;物业管理软件在优化服务流程的同时&#xff0c;也提升了居民的生活质量和社区的整体发展活力…...

论文阅读(十三):复杂表型关联的贝叶斯、基于系统的多层次分析:从解释到决策

1.论文链接&#xff1a;Bayesian, Systems-based, Multilevel Analysis of Associations for Complex Phenotypes: from Interpretation to Decision 摘要&#xff1a; 遗传关联研究&#xff08;GAS&#xff09;报告的结果相对稀缺&#xff0c;促使许多研究方向。尽管关联概念…...

线性调整器——耗能型调整器

线性调整器又称线性电压调节器&#xff0c;以下是关于它的介绍&#xff1a; 基本工作原理 线性调整器的基本电路如图1.1(a)所示,晶体管Q1(工作于线性状态,或非开关状态)构成一个连接直流源V和输出端V。的可调电气电阻,直流源V由60Hz隔离变压器&#xff08;电气隔离和整流&#…...

梯度提升用于高效的分类与回归

使用 决策树&#xff08;Decision Tree&#xff09; 实现 梯度提升&#xff08;Gradient Boosting&#xff09; 主要是模拟 GBDT&#xff08;Gradient Boosting Decision Trees&#xff09; 的原理&#xff0c;即&#xff1a; 第一棵树拟合原始数据计算残差&#xff08;负梯度…...

使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1

Ollama本身就是非常优秀的大模型管理和推理组件&#xff0c;再使用Open WebUI更加如虎添翼&#xff01; Ollama快速使用指南 安装Ollama Windows下安装 下载Windows版Ollama软件&#xff1a;Release v0.5.7 ollama/ollama GitHub 下载ollama-windows-amd64.zip这个文件即可…...

2025年1月个人工作生活总结

本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表&#xff0c;不需进入命令行模式。示例如下&#xff1a; sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…...

Windows环境安装nvm,并使用nvm管理nodejs版本教程

目录 1.nvm安装步骤 2.验证nvm是否安装成功 3.查看本地可以安装的所有版本 4.安装特定nodejs版本 5.配置nvm镜像 6.使用特定nodejs版本 7.给nodejs配置镜像和环境变量 8.查看本地安装的所有版本(* 表示当前版本) 9.卸载指定版本的nodejs 前端开发中&#xff0c;不…...

C++中常用的排序方法之——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的…...

SQL进阶实战技巧:如何分析浏览到下单各步骤转化率及流失用户数?

目录 0 问题描述 1 数据准备 2 问题分析 3 问题拓展 3.1 跳出率计算 3.2 计算从浏览商品到支付订单的不同路径的用户数&#xff0c;并按照用户数降序排列。 往期精彩 0 问题描述 统计从浏览商品到最终下单的各个步骤的用户数和流失用户数,并计算转化率 用户表结构和…...

NLP模型大对比:Transformer >Seq2Seq > LSTM > RNN > n-gram

结论 Transformer 大于 传统的Seq2Seq 大于 LSTM 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的&q…...

接口技术-第5次作业

目录 作业内容 解答 一、填空题 二、综合题 1.采用AD570通过82C55A与CPU接口&#xff0c;82C55A的端口地址为300H~303H,完成用查询方式采集250个数据&#xff0c;送到2000H开始的存储单元存储。绘制电路连接图&#xff08;AD570的4种主要信号线都要标出&#xff09;。 2…...

实战技巧:如何快速提高网站的收录比例?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/28.html 快速提高网站的收录比例是网站优化中的重要目标之一。以下是一些实战技巧&#xff0c;可以帮助你实现这一目标&#xff1a; 一、内容优化 高质量原创内容&#xff1a; 确保网站内…...

WEB集群6-10天

第六天 nginx编译安装 全新的进行编译安装 [rootweb-1 ~]# mkdir /nginx [rootweb-1 ~]# cd /nginx/ [rootweb-1 nginx]# ls [rootweb-1 nginx]#curl -O https://nginx.org/download/nginx-1.26.1.tar.gz解压源码包 [rootweb-1 nginx]#tar xf nginx-1.26.1.tar.gz [rootw…...

10.共享内存 信号量集 消息队列

10.共享内存 信号量集 消息队列 **1. IPC对象操作通用框架****2. 共享内存&#xff08;Shared Memory&#xff09;****3. 信号量集&#xff08;Semaphore&#xff09;****4. 消息队列&#xff08;Message Queue&#xff09;****5. 练习与作业****6. 总结** 1. IPC对象操作通用框…...

玩转大语言模型——使用langchain和Ollama本地部署大语言模型

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

数据结构与算法学习笔记----容斥原理

数据结构与算法学习笔记----容斥原理 author: 明月清了个风 first publish time: 2025.1.30 ps⭐️介绍了容斥原理的相关内容以及一道对应的应用例题。 Acwing 890. 能被整除的数 [原题链接](890. 能被整除的数 - AcWing题库) 给定一个整数 n n n和 m m m个不同的质数 p 1 …...

Appium介绍

在使用不同版本的Appium包进行自动化测试时&#xff0c;出现警告问题可能是由于版本不兼容、配置不正确等原因导致的。下面将详细介绍解决这些问题的步骤&#xff0c;确保模拟器能够正常启动&#xff0c;并能在Appium查看器中同步显示。 1. 环境准备 首先&#xff0c;确保你已…...

doris:Bitmap

BITMAP 类型可以在 Duplicate 表、Unique 表、Aggregate 表中使用&#xff0c;只能作为 Key 类&#xff0c;无法作为 Value 列使用。在 Aggregate 表中使用 BITMAP 类型&#xff0c;其建表时必须使用聚合类型 BITMAP_UNION。用户不需要指定长度和默认值。长度根据数据的聚合程度…...

gitee——报错修改本地密码

有时候当我们向远端push本地的仓库时会有一些报错的行为。 如下&#xff1a; 这是因为我们在gitee修改了密码时&#xff0c;本地还没有更新提交&#xff0c;总是报错 解决修改密码报错 如下&#xff1a; 1.在本地点击搜索栏找到控制面板 步骤如下...

Leetcode 45. 跳跃游戏 II

这题是一个动态规划问题&#xff0c;首先我先说一下自己的动态规划解题步骤&#xff1a; 1&#xff0c;首先需要明确动态规划数组的含义&#xff1a;这个是根据题目来定的&#xff0c;这一个题目的数组含义&#xff1a;dp【i】指的是从0跳到i所需要的最小的步骤。 2&#xff…...

ROS2---基础操作

工作空间(workspace) workspace是一个存放项目开发相关文件的文件夹。例如我们要开发一个机器人&#xff0c;我们可以创建一个工作空间&#xff0c;然后存放这个机器人不同功能的包&#xff08;感知&#xff08;雷达&#xff0c;相机等&#xff09;&#xff0c;运动&#xff0…...

【Leetcode 每日一题】350. 两个数组的交集 II

问题背景 给你两个整数数组 n u m s 1 nums_1 nums1​ 和 n u m s 2 nums_2 nums2​&#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值…...

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…...

STM32 PWMI模式测频率占空比

接线图&#xff1a; PWMI基本结构 代码配置&#xff1a; 与上一章输入捕获代码一样&#xff0c;根据结构体&#xff0c;需要在输入捕获单元再配置一个通道。我们调用一个函数 这个函数可以给结构体赋值&#xff0c;当我们定义了一遍结构体参数&#xff0c;再调用这个函数&…...