当前位置: 首页 > 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 角色触发器…...

【llm对话系统】大模型 Llama 源码分析之 LoRA 微调

1. 引言 微调 (Fine-tuning) 是将预训练大模型 (LLM) 应用于下游任务的常用方法。然而&#xff0c;直接微调大模型的所有参数通常需要大量的计算资源和内存。LoRA (Low-Rank Adaptation) 是一种高效的微调方法&#xff0c;它通过引入少量可训练参数&#xff0c;固定预训练模型…...

算法随笔_35: 每日温度

上一篇:算法随笔_34: 最后一个单词的长度-CSDN博客 题目描述如下: 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升…...

嵌入式硬件篇---CPUGPUTPU

文章目录 第一部分&#xff1a;处理器CPU&#xff08;中央处理器&#xff09;1.通用性2.核心数3.缓存4.指令集5.功耗和发热 GPU&#xff08;图形处理器&#xff09;1.并行处理2.核心数量3.内存带宽4.专门的应用 TPU&#xff08;张量处理单元&#xff09;1.为深度学习定制2.低精…...

STM32 PWM驱动舵机

接线图&#xff1a; 这里将信号线连接到了开发板的PA1上 代码配置&#xff1a; 这里的PWM配置与呼吸灯一样&#xff0c;呼吸灯连接的是PA0引脚&#xff0c;输出比较单元用的是OC1通道&#xff0c;这里只需改为OC2通道即可。 完整代码&#xff1a; #include "servo.h&quo…...

设计心得——平衡和冗余

一、平衡 在前面分析了一些软件设计的基础和原则后&#xff0c;今天分析一下整体设计上的一些实践问题。首先分析一下设计上的平衡问题。平衡非常好理解&#xff0c;看到过天平或者标称的同学们应该都知道什么平衡。无论在哪个环境里&#xff0c;平衡都是稳定的基础。 既然说到…...

webrtc协议详细解释

### 一、概述与背景 WebRTC&#xff08;Web Real-Time Communication&#xff09;最早由 Google 在 2011 年开源&#xff0c;旨在为浏览器与移动端应用提供客户端直连&#xff08;点对点&#xff09;方式进行实时音视频及数据传输的能力。传统的网络应用在进行高实时性音视频通…...

动手学强化学习(四)——蒙特卡洛方法

一、蒙特卡洛方法 蒙特卡洛方法是一种无模型&#xff08;Model-Free&#xff09;的强化学习算法&#xff0c;它通过直接与环境交互采样轨迹&#xff08;episodes&#xff09;来估计状态或动作的价值函数&#xff08;Value Function&#xff09;&#xff0c;而不需要依赖环境动态…...

网络原理(3)—— 传输层详解

目录 一. 再谈端口号 二. UDP协议(用户数据报协议) 2.1 UDP协议端格式 2.2 UDP报文长度 2.3 UDP校验和 三. TCP协议(传输控制协议) 3.1 TCP协议段格式 3.2 核心机制 3.2.1 确认应答 —— “感知对方是否收到” 3.2.2 超时重传 3.3.3 连接管理 —— 三次握手与四…...

2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)

2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.1.4问题1样例代码运行结果&…...

Elasticsearch的开发工具(Dev Tools)

目录 说明1. **Console**2. **Search Profiler**3. **Grok Debugger**4. **Painless Lab**总结 说明 Elasticsearch的开发工具&#xff08;Dev Tools&#xff09;在Kibana中提供了多种功能强大的工具&#xff0c;用于调试、优化和测试Elasticsearch查询和脚本。以下是关于Cons…...

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具

前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…...

小程序-视图与逻辑

前言 1. 声明式导航 open-type"switchTab"如果没有写这个&#xff0c;因为是tabBar所以写这个&#xff0c;就无法跳转。路径开始也必须为斜线 open-type"navigate"这个可以不写 现在开始实现后退的效果 现在我们就在list页面里面实现后退 2.编程式导航…...

UE5制作视差图

双目深度估计开源数据集很多都是用UE制作的&#xff0c;那么我们自己能否通过UE制作自己想要的场景的数据集呢。最近花了点时间研究了一下&#xff0c;分享给需要的小伙伴。 主要使用的是UnrealCV插件&#xff0c;UnrealCV是一个开源项目&#xff0c;旨在帮助计算机视觉研究人…...

海浪波高预测(背景调研)

#新星杯14天创作挑战营第7期# ps&#xff1a;图片由通义千问生成 历史工作&#xff1a; 针对更高细粒度、更高精度的波浪高度预测任务&#xff1a; Mumtaz Ali 等人提出了一种多元线性回归模型&#xff08;MLR-CWLS&#xff09;&#xff0c;该模型利用协方差加权最小二乘法&a…...

代码随想录算法训练营第四十二天-动态规划-股票-188.买卖股票的最佳时机IV

题目要求进行k次买卖其实就是上一题的扩展&#xff0c;把2次扩展为k次定义动规数组依然是二维&#xff0c;第一个维度表示第几天&#xff0c;第二个维度表示第几次买入和卖出所以第二个维度的长度应该是2k1在for循环内&#xff0c;要使用一个内循环来表示第几次买入或卖出&…...

Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)

文章目录 Gradle配置指南&#xff1a;深入解析settings.gradle.kts&#xff08;Kotlin DSL版&#xff09;settings.gradle.kts 基础配置选项单项目配置多项目配置 高级配置选项插件管理&#xff08;Plugin Management&#xff09;基础配置模板案例&#xff1a;Android项目标准配…...

软件工程经济学-日常作业+大作业

目录 一、作业1 作业内容 解答 二、作业2 作业内容 解答 三、作业3 作业内容 解答 四、大作业 作业内容 解答 1.建立层次结构模型 (1)目标层 (2)准则层 (3)方案层 2.构造判断矩阵 (1)准则层判断矩阵 (2)方案层判断矩阵 3.层次单排序及其一致性检验 代码 …...

论文阅读(三):微阵列数据的图形模型和多变量分析

1.论文链接&#xff1a;Graphical Models and Multivariate Analysis of Microarray Data 摘要&#xff1a; 基因表达数据的通常分析忽略了基因表达值之间的相关性。从生物学上讲&#xff0c;这种假设是不合理的。本章介绍的方法允许通过稀疏高斯图形模型来描述基因之间的相关…...

【大模型LLM面试合集】大语言模型架构_MHA_MQA_GQA

MHA_MQA_GQA 1.总结 在 MHA&#xff08;Multi Head Attention&#xff09; 中&#xff0c;每个头有自己单独的 key-value 对&#xff1b;标准的多头注意力机制&#xff0c;h个Query、Key 和 Value 矩阵。在 MQA&#xff08;Multi Query Attention&#xff09; 中只会有一组 k…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...