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

《UE5_C++多人TPS完整教程》学习笔记35 ——《P36 武器类(Weapon Class)》


本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P36 武器类(Weapon Class)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Stephen Ulibarri 发布在 Udemy 上的课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。

在这里插入图片描述


文章目录

  • P36 武器类(Weapon Class)
  • 36.1 创建武器 C++ 类
  • 36.2 创建武器蓝图类
  • 36.3 将武器蓝图类添加到关卡中
  • 36.4 Summary


P36 武器类(Weapon Class)

本节课我们将添加武器类应有的基本组件,以及武器状态(Weapon state)的枚举,这样我们就可以根据武器状态来处理武器。
在这里插入图片描述


36.1 创建武器 C++ 类

  1. 在虚幻引擎内容浏览器 “C++ 类”(C++ Classes)目录下新建一个 “Actor” C++ 类,,命名为 “Weapon”,路径为“.../Blaster/Weapon”。
    在这里插入图片描述
    在这里插入图片描述

  2. 在 Visual Studio 中打开头文件 “Weapon.h”,在武器类私有属性中声明所有地方可见(VisibleAnywhere)、归类为武器属性 “Weapon Properties” 的骨骼体组件类(SkeletalMeshComponent) "WeaponMesh 以及球体组件类(SphereComponent) “AreaSphere”,该球体将 “包裹” 武器骨骼体组件,用于判定人物是否碰到球体,若碰到人物将会拾取该武器;在武器类外声明武器状态枚举类型,包括初始状态(武器可以被人物捡起)、已装备状态(武器被人物捡起并装备使用)、已丢弃状态(武器被人物丢弃)以及一个默认最大常量,添加武器状态枚举类型到武器类私有属性中。

    /*** Weapon.h ***/
    // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "Weapon.generated.h"/* P36 武器类(Weapon Class)*/
    // UENUM():参阅《元数据说明符》https://dev.epicgames.com/documentation/zh-cn/unreal-engine/metadata-specifiers-in-unreal-engine?application_version=5.0
    // BlueprintType:将此类公开为可用于蓝图中的变量的类型,参阅《类说明符》https://dev.epicgames.com/documentation/zh-cn/unreal-engine/class-specifiers?application_version=5.0
    UENUM(BlueprintType)									
    enum class EWeaponState : uint8							// 武器状态枚举类型,枚举常量为无符号8位整型						
    {	// UMETA():参阅《元数据说明符》https://dev.epicgames.com/documentation/zh-cn/unreal-engine/metadata-specifiers-in-unreal-engine?application_version=5.0EWS_Initial UMETA(DisplayName = "Initial State"),	// 初始状态,武器可以被人物捡起EWS_Equipped UMETA(DisplayName = "Equipped"),		// 已装备状态,武器被人物捡起并装备使用EWS_Dropped UMETA(DisplayName = "Dropped"),			// 已丢弃状态,武器被人物丢弃EWS_Max UMETA(DisplayName = "DefaultMax")			// 大多数枚举常量都会有一个默认的最大常量,我们通过检查这个最大常量的值,就能知道枚举类型中有多少个常量
    };
    /* P36 武器类(Weapon Class)*/UCLASS()
    class BLASTER_API AWeapon : public AActor
    {GENERATED_BODY()public:	// Sets default values for this actor's propertiesAWeapon();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;/* P36 武器类(Weapon Class)*/
    private:UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")	// 添加所有地方可见的骨骼网格组件,这样就可以通过蓝图进行编辑武器,归类为 Weapon Propertiesclass USkeletalMeshComponent* WeaponMesh;				UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")	// 添加一个重叠体积(Overlap Volume),这里使用球体组件 “包裹” 武器骨骼体组件,用于判定人物是否碰到球体,若碰到人物将会拾取该武器class USphereComponent* AreaSphere;UPROPERTY(VisibleAnywhere)									// 添加新声明的武器状态枚举类型EWeaponState WeaponState;									
    /* P36 武器类(Weapon Class)*/
    };
    

    注意:
    定义枚举类型使用了 “UENUM()” 和 “UMETA()”,具体用法参阅虚幻引擎官方文档《元数据说明符》,还使用了类说明符 “BlueprintType” 参阅《类说明符》https://dev.epicgames.com/documentation/zh-cn/unreal-engine/class-specifiers?application_version=5.0

  3. 打开源文件 “Weapon.cpp”,在 “Weapon” 类构造函数中 “AWeapon()”,将 “bReplicate” 变量设置为 “true” 实现武器类的网络同步,设置WeaponMesh 以及 “AreaSphere” 的碰撞响应预设值,接着设置关闭碰撞检测和碰撞响应,物体之间不会发生任何碰撞,然后在函数 “BeginPlay()” 中设置只在服务器再次启用 “AreaSphere” 的碰撞检测和碰撞响应,因为服务器负责掌管所有武器权限,若检测到发生碰撞事件会产生物理效果。最后进行编译。

    // Fill out your copyright notice in the Description page of Project Settings./* P36 武器类(Weapon Class)*/
    #include "Weapon.h"	// 原来自动生成的代码是 #include "HUD/OverheadWidget.h",这里需要把 "GameMode/" 去掉,否则找不到文件 "LobbyGameMode.h"
    #include "Components//SphereComponent.h"// Sets default values
    AWeapon::AWeapon()
    {// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = false;												// 设置为 false// 参阅《复制Actor属性》:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/replicate-actor-properties-in-unreal-engine?application_version=5.0// 在多人Gameplay中,当属性被带有 Replicated 或 ReplicatedUsing 元数据说明符标记时,服务器会在复制的属性每次更改其值时向每个连接的客户端发送更新。每个客户端会将更新的值应用到其本地版本的Actor。bReplicates = true;																	// 武器只在服务器拥有权限,需要复制到客户端上WeaponMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("WeaponMesh"));	// 基于骨骼网格体组件类创建 WeaponMesh 对象SetRootComponent(WeaponMesh);														// 设置根组件为 WeaponMeshWeaponMesh->SetupAttachment(RootComponent);											// 将 WeaponMesh 附加到武器类的根组件上// SetRootComponent(WeaponMesh);													// 设置根组件为 WeaponMeshWeaponMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Block);		// 设置所有通道(Channels)的碰撞响应(Collision response)为阻塞(Block)使得当武器被丢弃(Drop)时能被地面或墙体弹起(Bounce off)WeaponMesh->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Ignore);			// 修改 Pawn 通道:当武器被玩家丢弃时,玩家可以跨过(Step over)跑过(Run through)落下的武器,不与它发生碰撞WeaponMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);					// 先暂时关闭碰撞检测和碰撞响应,物体之间不会发生任何碰撞,我们将在服务器端启用/* ECollisionResponse// Enum indicating how each type should respond UENUM(BlueprintType, meta = (ScriptName = "CollisionResponseType"))enum ECollisionResponse{ECR_Ignore UMETA(DisplayName = "Ignore"),	// 忽略(Ignore):无论另一个物理形体的"碰撞响应(Collision Responses)"为何,此物理形体都将忽略交互。ECR_Overlap UMETA(DisplayName = "Overlap"),	// 重叠(Overlap):如果已将另一个物理形体设置为"重叠(Overlap)"或"阻挡(Block)"此物理形体的"对象类型(Object Type)",将发生重叠事件。ECR_Block UMETA(DisplayName = "Block"),		// 阻挡(Block):如果已将另一个物理形体设置为"阻挡(Block)"此物理形体的"对象类型(Object Type)",将发生撞击事件。ECR_MAX,};*//* // ECollisionChannel// Enum indicating different type of objects for rigid - body collision purposes.UENUM(BlueprintType)enum ECollisionChannel{ECC_WorldStatic UMETA(DisplayName = "WorldStatic"),ECC_WorldDynamic UMETA(DisplayName = "WorldDynamic"),ECC_Pawn UMETA(DisplayName = "Pawn"),ECC_Visibility UMETA(DisplayName = "Visibility", TraceQuery = "1"),ECC_Camera UMETA(DisplayName = "Camera", TraceQuery = "1"),ECC_PhysicsBody UMETA(DisplayName = "PhysicsBody"),ECC_Vehicle UMETA(DisplayName = "Vehicle"),ECC_Destructible UMETA(DisplayName = "Destructible"),...};*//*	// ECollisionEnabled// Enum used to describe what type of collision is enabled on a body.UENUM(BlueprintType)namespace ECollisionEnabled{enum Type{// Will not create any representation in the physics engine. Cannot be used for spatial queries (raycasts, sweeps, overlaps) or simulation (rigid body, constraints). Best performance possible (especially for moving objects) NoCollision UMETA(DisplayName = "No Collision"),	// 在物理引擎中此形体将不具有任何表示。不可用于空间查询(光线投射、Sweep、重叠)或模拟(刚体、约束)。此设置可提供最佳性能,尤其是对于移动对象// Only used for spatial queries (raycasts, sweeps, and overlaps). Cannot be used for simulation (rigid body, constraints). Useful for character movement and things that do not need physical simulation. Performance gains by keeping data out of simulation tree. QueryOnly UMETA(DisplayName = "Query Only (No Physics Collision)"),	// 此形体仅可用于空间查询(光线投射、Sweep和重叠)。不可用于模拟(刚体、约束)。对于角色运动和不需要物理模拟的对象,此设置非常有用。通过缩小物理模拟树中的数据来实现一些性能提升// Only used only for physics simulation (rigid body, constraints). Cannot be used for spatial queries (raycasts, sweeps, overlaps). Useful for jiggly bits on characters that do not need per bone detection. Performance gains by keeping data out of query tree PhysicsOnly UMETA(DisplayName = "Physics Only (No Query Collision)"),	// 此形体仅可用于物理模拟(刚体、约束)。不可用于空间查询(光线投射、Sweep、重叠)。对于角色上不需要按骨骼进行检测的模拟次级运动,此设置非常有用。通过缩小查询树中的数据来实现一些性能提升// Can be used for both spatial queries (raycasts, sweeps, overlaps) and simulation (rigid body, constraints). QueryAndPhysics UMETA(DisplayName = "Collision Enabled (Query and Physics)")	// 此形体可用于空间查询(光线投射、Sweep、重叠)和模拟(刚体、约束)};}*/AreaSphere = CreateDefaultSubobject<USphereComponent>(TEXT("AreaSphere"));		// 基于球体组件类创建 AreaSphere 对象AreaSphere->SetupAttachment(RootComponent);										// 将 AreaSphere 附加到武器类的根组件上AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);	// 忽略球体组件的碰撞响应,以便于当玩家靠近武器时我们可以检测玩家是否碰到武器(而不是武器被弹开)AreaSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);				// 先暂时关闭碰撞检测和碰撞响应,物体之间不会发生任何碰撞,我们将在服务器端启用
    }// Called when the game starts or when spawned
    void AWeapon::BeginPlay()
    {Super::BeginPlay();// 服务器将负责掌管(in charge of)所有武器权限if (HasAuthority()) {	// 判断是否拥有权威角色,等同于 if (GetLocalRole() == ENetRole::ROLE_Authority) AreaSphere->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);		// 既进行碰撞检测,也进行碰撞响应。物体之间会检测是否发生碰撞,同时会产生物理效果AreaSphere->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Overlap);	// }
    }
    /* P36 武器类(Weapon Class)*/// Called every frame
    void AWeapon::Tick(float DeltaTime)
    {Super::Tick(DeltaTime);
    }
    

    注意:
    代码中涉及的 “碰撞(Collision)“ 属性类别中的 “碰撞预设值(Collision Presets)”/“碰撞响应(Collision Response)” 可参阅虚幻引擎官方文《碰撞响应参考》


36.2 创建武器蓝图类

  1. 在虚幻引擎内容浏览器 “内容” 目录下的 “Blueprints” 文件夹中新建文件夹 “Weapon”,然后新建蓝图类 “BP_Weapon”,其父类为上文编译好的 C++ 类 “Weapon”。
    在这里插入图片描述

  2. 双击新建好的 “BP_Weapon”,进入蓝图编辑器。在左侧 “组件”(Components)面吧N选择 “Weapon Mesh (WeaponMesh)”,然后在右侧 “细节”(Details)面板中设置 “网格”(Mesh)选项卡下的 “骨骼网格体”(SkeletalMesh)为 “Assaults_Rifle_A”。
    在这里插入图片描述

  3. 在左侧 “组件”(Components)面板选择 “Area Sphere (AreaSphere)”,在视口中调整位置至 “Weapon Mesh (WeaponMesh)” 中心,调整大小直至可以恰好 “包裹” 组件 “Weapon Mesh (WeaponMesh)”。
    在这里插入图片描述
    在这里插入图片描述

  4. 在左侧 “组件”(Components)面板选择 “BP_Weapon (自我)” (BP_Weapon (Self)),可以在右侧 “细节”(Details)面板中 “Weapon” 选项卡下看到武器状态 “Weapon State” 为初始状态 “Initial State”。
    在这里插入图片描述


36.3 将武器蓝图类添加到关卡中

  1. 将蓝图类 “BP_Weapon” 拖拽至游戏关卡 “BlasterMap” 中。
    在这里插入图片描述

  2. 点击工具栏的 “播放”()按钮启动运行,可以看到武器均显示在监听服务器中和两个客户端中。
    在这里插入图片描述


36.4 Summary

本节课详细解析了多人射击游戏的武器类(Weapon Class)的构建。武器 C++ 类 “Weapon” 私有属性包含骨骼体组件类 "WeaponMesh” 、球体组件类 “AreaSphere”(该球体将 “包裹” 武器骨骼体组件,用于判定人物是否碰到球体,若碰到人物将会拾取该武器)以及在武器类外声明武器状态枚举类型(包括初始状态、已装备状态、已丢弃状态以及一个默认最大常量),然后我们利用 “bReplicates” 属性实现武器类服务器与客户端的同步,设置WeaponMesh 以及 “AreaSphere” 的碰撞响应预设值,接着设置关闭碰撞检测和碰撞响应,物体之间不会发生任何碰撞,然后设置只在服务器再次启用 “AreaSphere” 的碰撞检测和碰撞响应,因为服务器负责掌管所有武器权限,若检测到发生碰撞事件会产生物理效果。下一步我们由武器 C++ 类构建蓝图类 “BP_Weapon”,在蓝图编辑器中设置 "WeaponMesh” 的 “骨骼网格体” 为资产 “Assaults_Rifle_A”,然后调整球体组件类 “AreaSphere” 位置及大小。最后我们将 “BP_Weapon” 添加到游戏关卡 “BlasterMap” 中进行测试,在服务器和客户端上均可以看到武器。
在这里插入图片描述
36.1 创建武器 C++ 类 中,我们定义武器枚举类型使用了 “UENUM()” 和 “UMETA()”,它们的具体用法可参阅虚幻引擎官方文档《元数据说明符》,还使用了类说明符 “BlueprintType” 参阅《类说明符》。我们还设置了骨骼体组件类 "WeaponMesh” 、球体组件类 “AreaSphere”的碰撞预设值和碰撞响应,虚幻引擎的 “碰撞” 属性具体可参阅虚幻引擎官方文《碰撞响应参考》。


相关文章:

《UE5_C++多人TPS完整教程》学习笔记35 ——《P36 武器类(Weapon Class)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P36 武器类&#xff08;Weapon Class&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephen …...

【SpringMVC】SpringMVC的启动过程与原理分析:从源码到实战

SpringMVC的启动过程与原理分析&#xff1a;从源码到实战 SpringMVC是Spring框架中用于构建Web应用的核心模块&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;提供了灵活且强大的Web开发能力。本文将深入分析SpringMVC的启动过程、核…...

出现“ping不通但可以远程连接”的情况可能由以下原因导致

出现“ping不通但可以远程连接”的情况可能由以下原因导致&#xff1a; 1.防火墙或安全软件限制 • 原因&#xff1a;防火墙或安全软件可能阻止了ICMP数据包&#xff08;ping使用的协议&#xff09;&#xff0c;但允许了远程连接所需的协议&#xff08;如TCP&#xff09;。 …...

MySQL表空间碎片原理和解决方案

一、表空间与碎片的基本概念 表空间&#xff1a;MySQL中存储表数据和索引的物理文件&#xff08;如InnoDB的.ibd文件&#xff09;。分为系统表空间和独立表空间。碎片&#xff1a;数据在物理存储上不连续&#xff0c;分为行级碎片&#xff08;单行跨多页&#xff09;和页级碎片…...

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…...

最小栈 _ _

一&#xff1a;题目 二&#xff1a;思路 解释&#xff1a;一个栈名为st&#xff0c;其用来正常的出入栈&#xff0c;一个栈名为minst&#xff0c;其的栈顶元素一定是最小的元素 入栈&#xff1a;第一个元素&#xff0c;两个栈一起入&#xff0c;后面再入栈&#xff0c;只有入栈…...

HTTPS加密原理详解

目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议&#xff0c;是在HTTP的基础上加入了一个加密层&#xff0c;由…...

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片&#xff0c;运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具&#xff0c;如基本参数调整、HSL&#xff08;色相、饱和度、明亮度&#xff09;调整、曲线工具等改变照片原本的色彩、明度、对比度等属性&#xff0c;将…...

安装pyqt6出现的问题

安装PyQt6报错&#xff1a; PermissionError: [WinError 32] 另一个程序正在使用此文件&#xff0c;进程无法访问。: C:\\Users\\xyj19\\AppData\\Local\\Temp\\tmp3xfmekh7 [end of output] note: This error originates from a subprocess, and is likely not a pr…...

java调用c++

VScode 配置java 并且使用JNA调用c 动态库 安装 Java 开发环境 ​ 安装 JDK官网直接下载就好&#xff0c;推荐镜像下载 通过网盘分享的文件&#xff1a;jdk-8u144-windows-x64.exe​ 链接: https://pan.baidu.com/s/1Ov9bJkPNnOgcliBL-PSTFQ?pwdpg43 提取码: pg43 ​ 直接安…...

gitlab+jenkins+harbor+k8s安装操作流程之Jenkins

准备环境 一台centos7系统 4C/8G/100G 如果是jenkins2.5以上版本需要centos8以上版本 JDK1.8编译安装(最新版本jdk需要18以上) MAVEN编译安装 GIT编译安装 JDK1.8步骤 tar -zxvf 解压 vim /etc/profile export JAVA_HOME/data/jdk1.8.0_111 export JRE_HOME$JAVA…...

【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】

【机械视觉】C#VisionPro联合编程———【三、加载CogToolBlock工具详解&#xff0c;以及实例】 在VisionPro中&#xff0c;CogToolBlock 是一种容器工具&#xff0c;可以将多个视觉工具&#xff08;如CogBlob、CogPMAlign等&#xff09;组合成一个可复用的流程。通过C#与Visi…...

Android14 串口控制是能wifi adb实现简介

Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb&#xff08;1&#xff09;相关prop属性设置&#xff08;2&#xff09;在设置界面或者 ifconfi…...

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…...

常用AI工具推荐

AI对话相关 Deepseek https://chat.deepseek.com/ Kimi https://kimi.moonshot.cn/ 豆包 https://www.doubao.com/ 文心一言 https://yiyan.baidu.com/ 腾讯元宝 https://yuanbao.tencent.com 通义千问 https://tongyi.aliyun.com/qianwen/ 图片生成相关 即梦 https://jimen…...

用AI学编程3——Java学习1

一个Java文件&#xff0c; 整理出Java从入门到精通的所有知识点&#xff0c; 给出注释&#xff0c; 给出这样的Java文件 Java 学习整合文件 /*** Java 学习整合文件* 包含 Java 从入门到精通的主要知识点&#xff0c;包括基础语法、面向对象编程、异常处理、集合框架、多线程…...

如何监控 Pod 的 CPU/内存使用率,prometheus+grafana

一、监控 Pod 的 CPU/内存使用率的方法 1. 使用 kubectl top 命令&#xff08;临时检查&#xff09; # 查看所有 Pod 的资源使用率&#xff08;需安装 Metrics Server&#xff09; kubectl top pods --all-namespaces ​ # 查看指定命名空间的 Pod kubectl top pods -n <n…...

云服务器Linux安装Docker

系统要求 Docker 官方建议将 Docker 运行在 Linux系统上&#xff0c;当然也可以在其他平台运行&#xff0c;本篇博客只介绍在 Linux 系统上的安装方法。 Docker 运行在 CentOS7.X 版本以上&#xff0c;本文使用阿里云 ECS 云服务器 CentOS 7.4 版本。 Docker 需要安装在 64 …...

信息安全与网络安全的区别_信息安全与网络安全之差异探析

在当今数字化时代&#xff0c;信息安全与网络安全成为了人们关注的热点话题。尽管这两个概念经常被提及&#xff0c;但它们之间存在着明显的区别。本文旨在探讨信息安全与网络安全的定义、范畴及应对策略&#xff0c;以帮助读者更好地理解和应对相关挑战。 一、定义与范畴的差…...

Express 中 get 参数获取

1. 使用 req.query 获取 URL 查询字符串参数 在 GET 请求中&#xff0c;参数通常以查询字符串的形式附加在 URL 后面&#xff0c;格式为 ?参数名1值1&参数名2值2 。Express 里可通过 req.query 对象获取这些参数。 const express require("express"); const …...

充电桩快速搭建springcloud(微服务)+前后端分离(vue),客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

充电桩管理系统是专为中小型充电桩运营商、企业和个人开发者设计的一套高效、灵活的管理平台。系统基于Spring Cloud微服务架构开发&#xff0c;采用模块化设计&#xff0c;支持单机部署与集群部署&#xff0c;能够根据业务需求动态扩展。系统前端使用uniapp框架&#xff0c;可…...

深度求索(DeepSeek)开源周技术全景与行业影响研究报告

2025年2月24日至28日&#xff0c;中国AI企业深度求索&#xff08;DeepSeek&#xff09;发起了为期五天的“开源周”活动&#xff0c;连续开源五大核心代码库&#xff08;FlashMLA、DeepEP、DeepGEMM、DualPipe、EPLB&#xff09;及分布式文件系统3FS&#xff0c;覆盖AI模型训练…...

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢&#xff0c;时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何&#xff1f; 我谈谈自己观点&#xff1a;芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后&#xff0c;芯…...

串口助手的C#编写以及有人串口服务器USR-DR301的使用

本文介绍C#编写串口程序的要点,串口服务器USR-DR301(RS232转TCP)的使用、以及调试过程中碰到的两个问题: 1). 调用串口报“连到系统上的设备没有发挥作用”. 2). “所有文本框都变成了透明”的异常处理 代码见:https://download.csdn.net/download/qq_34047402/9046713…...

Android中AIDL和HIDL的区别

在Android中&#xff0c;AIDL&#xff08;Android Interface Definition Language&#xff09; 和 HIDL&#xff08;HAL Interface Definition Language&#xff09; 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC&#xff08;进程间通信&#xff0…...

【HeadFirst系列之HeadFirst设计模式】第18天之蝇量模式(Flyweight Pattern):优化资源的秘密武器

蝇量模式&#xff08;Flyweight Pattern&#xff09;&#xff1a;优化资源的秘密武器 在软件开发中&#xff0c;当系统需要创建大量相似对象时&#xff0c;内存占用和性能问题就会浮出水面。《Head First 设计模式》介绍了 蝇量模式&#xff08;Flyweight Pattern&#xff09;…...

微信小程序将markdown内容转为pdf并下载

要在微信小程序中将Markdown内容转换为PDF并下载,您可以使用以下方法: 方法一:使用第三方API服务 选择第三方API服务: 可以选择像 Pandoc、Markdown-PDF 或 PDFShift 这样的服务,将Markdown转换为PDF。例如,PDFShift 提供了一个API接口,可以将Markdown内容转换为PDF格式…...

SQL CHAR_LENGTH返回字符串长度的函数

CHAR_LENGTH 是 SQL 中的一个用于返回字符串长度的函数。它计算的是字符串中的字符数&#xff0c;而不是字节数。这在处理多字节字符集&#xff08;如 UTF-8&#xff09;时尤其有用&#xff0c;因为一个字符可能会占用多个字节。 CHAR_LENGTH(string) string 是要计算长度的字…...

sqlserver删除表记录语句,及删除表时清零ID的SQL语句

sqlserver中&#xff0c;删除表中所有记录的语句如下 Delete from tableName 例&#xff0c;删除表logs的所有记录 sqlserver&#xff0c;删除表中所有数据&#xff0c;标识列ID归零&#xff0c;保留表结构的语句 truncate table tableName 例&#xff0c;删除表logs的所…...

求最大公约数问题(信息学奥赛一本通-1207)

【题目描述】 给定两个正整数&#xff0c;求它们的最大公约数。 【输入】 输入一行&#xff0c;包含两个正整数(<1,000,000,000)。 【输出】 输出一个正整数&#xff0c;即这两个正整数的最大公约数。 【输入样例】 6 9 【输出样例】 3 【题解代码】 #include<bits/stdc…...