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

UE5学习笔记21-武器的射击功能

一、创建C++类

        创建武器子弹的类,创建生产武器子弹的类,创建弹壳的类,生产武器子弹的类的父类是武器的类

        创建后如图,ProjectileMyWeapon类(产生子弹的类)继承自weapon类,Projectile(子弹的类),Casing(弹壳声音的类)

         在子弹的类中添加如下代码

//头文件中添加
private:UPROPERTY(EditAnywhere)class UBoxComponent* CollisionBox;// 碰撞盒的类//构造中添加
CollisionBox = CreateDefaultSubobject<UBoxComponent>(TEXT("CollisionBox"));
SetRootComponent(CollisionBox);
CollisionBox->SetCollisionObjectType(ECollisionChannel::ECC_WorldStatic); //设置自身的碰撞类型
CollisionBox->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); //启动碰撞,启动触发器
CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); //设置对其他类型的碰撞
/* 第一个参数对角色 第二个参数是对角色是哪种碰撞 */
CollisionBox->SetCollisionResponseToChannel(ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block);
CollisionBox->SetCollisionResponseToChannel(ECollisionChannel::ECC_WorldStatic, ECollisionResponse::ECR_Block);

 二、武器蒙太奇(开火动画),添加开火功能

        1.将动画设置为加性的(让动作连贯),将瞄准和不瞄准的动画找到设置如图

        2.创建武器蒙太奇动画,在对应动画右键->创建->创建动画蒙太奇 (我将创建好的蒙太奇动画放到了其他文件夹中)

        3.新建蒙太奇片段,添加插槽,将瞄准的动画拖拽到蒙太奇中

 将之前的default片段名删除

 

添加另一端动画

将之前默认跳转的动画清空变成单独的动画 

 

选择插槽

最后样子

 三、绑定开火按键

        1.编辑->项目设置->输入->操作映射->添加fire鼠标左键

        2.在角色类中添加绑定

//角色类头文件
/* 发射子弹函数 */
void FireButtonPressed();
void FireButtonRelease();
/* 发射子弹函数 *///角色类源文件
void ABlasterCharacter::FireButtonPressed()
{if (Combat){Combat->FireButtonPressed(true);}
}void ABlasterCharacter::FireButtonRelease()
{if (Combat){Combat->FireButtonPressed(false);}
}//函数SetupPlayerInputComponent中
PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &ABlasterCharacter::FireButtonPressed);
PlayerInputComponent->BindAction("Fire", IE_Released, this, &ABlasterCharacter::FireButtonRelease);

         3.声明一个蒙太奇动画类指针

//角色头文件	
// 当前类指针在界面中赋值 EditAnywhere可编辑 Combat在细节中找到对应设置
UPROPERTY(EditAnywhere , Category = Combat)
class UAnimMontage* FireWeaponMontage; // 动画蒙太奇类

        4.编译后在角色蓝图中设置对应的蒙太奇动画

        5.定义播放动画的函数,FName中的名字是蒙太奇动画中的名字

//角色类头文件
void PlayFireMontage(bool bAiming);//角色类源文件
void ABlasterCharacter::PlayFireMontage(bool bAiming)
{if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return;UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();if (AnimInstance && FireWeaponMontage){AnimInstance->Montage_Play(FireWeaponMontage);/* 找到播放哪段动画 名字是动画中新建蒙太奇片段的名字 */FName SectionName;SectionName = bAiming ? FName("RifleAim") : FName("RifleHip");/* 找到播放哪段动画 */AnimInstance->Montage_JumpToSection(SectionName);}
}

         6.动画蓝图中的改变,武器开火实在装备武器后才可以所以如图,动画蓝图类中添加

slot中右侧细节可以选择槽

 new一个姿势

         7.在aimoffset中使用6中的姿势(在动作偏移中使用对应姿势)

        8. 在战斗组件类中添加代码(class ABlasterCharacter* Character指针我在角色类中的PostInitializeComponents函数赋值),使用了RPC函数多播功能让动画在每个客户端都能看见

void ABlasterCharacter::PostInitializeComponents()
{Super::PostInitializeComponents();if (Combat){Combat->Character = this;}
}
FVector_NetQuantize是FVector的网络传输的序列化的结构,减少网络带宽
//战斗组件类头文件
// 开火函数 
void FireButtonPressed(bool bPressed);/* Server RPC函数 */
UFUNCTION(Server, Reliable)
void ServerFire(const FVector_NetQuantize& TraceHitTarget);
/* Server RPC函数 *//* 多播函数 */
UFUNCTION(NetMulticast , Reliable)
void MulticastFire(const FVector_NetQuantize& TraceHitTarget);
/* 多播函数 *//* 命中线 */
void TraceUnderCrosshairs(FHitResult& TraceHitResult);
/* 命中线 */class ABlasterCharacter* Character;
bool bFireButtonPressed;//战斗组件类源文件
void UCombatComponent::FireButtonPressed(bool bPressed)
{bFireButtonPressed = bPressed;if (bFireButtonPressed){FHitResult HitResult;TraceUnderCrosshairs(HitResult);ServerFire(HitResult.ImpactPoint);}
}void UCombatComponent::TraceUnderCrosshairs(FHitResult& TraceHitResult)
{/* 屏幕中心为瞄准点 *//* 获得视口大小 */FVector2D ViewportSize;if (GEngine && GEngine->GameViewport){GEngine->GameViewport->GetViewportSize(ViewportSize);}/* 获得屏幕中心坐标 */FVector2D CrosshaurLocation(ViewportSize.X / 2.f, ViewportSize.Y / 2.f);FVector CrosshairWorldPosition; //世界空间中的相应 3D 位置FVector CrosshairWorldDirection; //在给定的 2d 点处远离摄像机的世界空间方向矢量bool bScreenToWorld = UGameplayStatics::DeprojectScreenToWorld(UGameplayStatics::GetPlayerController(this, 0),CrosshaurLocation,CrosshairWorldPosition,CrosshairWorldDirection);if (bScreenToWorld){FVector Start = CrosshairWorldPosition;TRACE_LENGTH 我设置为8000 在世界坐标的长度可以理解成武器的射程FVector End = Start + CrosshairWorldDirection * TRACE_LENGTH;/** bool LineTraceSingleByChannel(FHitResult& OutHit,             // 输出的碰撞信息const FVector& Start,           // 射线的起点const FVector& End,             // 射线的终点ECollisionChannel TraceChannel, // 碰撞通道const FCollisionQueryParams& Params = FCollisionQueryParams::DefaultQueryParam, // 可选的额外查询参数const FCollisionResponseParams& ResponseParam = FCollisionResponseParams::DefaultResponseParam // 可选的碰撞响应参数);*///检查射线与场景中的物体是否有交点,并返回相关的碰撞信息GetWorld()->LineTraceSingleByChannel(TraceHitResult,Start,End,ECollisionChannel::ECC_Visibility);
#if 0if (!TraceHitResult.bBlockingHit){TraceHitResult.ImpactPoint = End;HitTarget = End;}else{HitTarget = TraceHitResult.ImpactPoint;/*DrawDebugSphere(const UWorld* World,     // 表示你要在哪个世界中绘制球体FVector Center,          // 球体的中心位置float Radius,            // 球体的半径int32 Segments,          // 球体的分段数,影响球体的平滑度FColor Color,            // 球体的颜色bool bPersistentLines,    // 是否为持久化的调试线条(场景切换后是否还存在)float LifeTime,          // 调试球体的生存时间,0 为永久存在uint8 DepthPriority,     // 渲染优先级(影响是否被遮挡)float Thickness          // 球体线条的厚度)*/DrawDebugSphere(GetWorld(),TraceHitResult.ImpactPoint,12.f, //半径12, //FColor::Red);} 
#endif}
}void UCombatComponent::ServerFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{MulticastFire(TraceHitTarget);
}void UCombatComponent::MulticastFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{if (EquippedWeapon == nullptr) return;if (Character){//UE_LOG(LogTemp, Warning, TEXT("FireButtonPressed"));Character->PlayFireMontage(bAiming);EquippedWeapon->Fire(TraceHitTarget);}
}

         9.武器类添加代码

//武器类头文件
/* 开火功能 */
virtual void Fire(const FVector& HitTaget);UPROPERTY(EditAnywhere , Category = "Weapon Properties")
class UAnimationAsset* FireAnimation; //动画资产类UPROPERTY(EditAnywhere)
TSubclassOf<class ACasing> CasingClass; // 监视类 -- 监视蛋壳弹出//武器类源文件
void AWeapon::Fire(const FVector& HitTaget)
{if (FireAnimation){WeapomMesh->PlayAnimation(FireAnimation, false);}if (CasingClass){const USkeletalMeshSocket* AmmoEjectSocket = WeapomMesh->GetSocketByName(FName("AmmoEject"));if (AmmoEjectSocket){FTransform SocketTransform = AmmoEjectSocket->GetSocketTransform(GetWeaponMesh());UWorld* World = GetWorld();if (World){World->SpawnActor<ACasing>(CasingClass,SocketTransform.GetLocation(),SocketTransform.GetRotation().Rotator());}}}
}

        10.创建子弹蓝图类

        11.设置蓝图

        1.打开蓝图设置对用的武器网格体,WeaponMesh细节中网格体的骨骼网格体资产选择对于你武器资产

         2.设置pickwidget(没有可以不用设置)细节中用户界面的空间选择屏幕空间类选择对饮蓝图类

        3.设置动画(武器开火动画)该蓝图的类是projectileweapon,它的父类是weapon,父类中有

    UPROPERTY(EditAnywhere , Category = "Weapon Properties")
    class UAnimationAsset* FireAnimation; //动画资产类

        所以一在细节中可以找到(C++类的继承)

        4.将11中的创建武器蓝图拖拽到地图中

        12. 摄像机的偏移(可选,若想看见角色前方的可以设置)

         13.生产子弹类中代码(GetSocketName中的名字是对应武器网格体中枪口的插槽的名字)

//子弹类头文件
public:virtual void Fire(const FVector& HitTaget) override;protected:UPROPERTY(EditAnywhere)TSubclassOf<class AProjectile> ProjectileClass;//子弹类源文件
void AProjectileMyWeapon::Fire(const FVector& HitTaget)
{Super::Fire(HitTaget);if (!HasAuthority()) return;APawn* InstigatorPawn = Cast<APawn>(GetOwner());const USkeletalMeshSocket* MuzzleFlashSocket = GetWeaponMesh()->GetSocketByName(FName("MuzzleFlash"));if (MuzzleFlashSocket){FTransform SocketTransform = MuzzleFlashSocket->GetSocketTransform(GetWeaponMesh());// 从枪口闪光插座到开火位置 获得尖端的位置FVector ToTarget = HitTaget - SocketTransform.GetLocation();FRotator TargetRotation = ToTarget.Rotation();if (ProjectileClass && InstigatorPawn){FActorSpawnParameters SpawnParams;SpawnParams.Owner = GetOwner();SpawnParams.Instigator = InstigatorPawn;UWorld* World = GetWorld();if (World){World->SpawnActor<AProjectile>(ProjectileClass,SocketTransform.GetLocation(),TargetRotation,SpawnParams);}}}
}

        14.创建子弹类蓝图

        15.打开子弹类蓝图设置(中间黄色的是碰撞盒)

        15.1 设置碰撞盒大小

         16.定义粒子特效类和声音类

//子弹类头文件virtual void Destroyed() override;protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;UFUNCTION()virtual void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);public:	private:UPROPERTY(VisibleAnywhere)class UProjectileMovementComponent* ProjectileMovementComponent; //子弹运动的类UPROPERTY(EditAnywhere)class UParticleSystem* Tracer; //粒子系统类class UParticleSystemComponent* TracerComponent;	//粒子系统组件类UPROPERTY(EditAnywhere)class UParticleSystem* ImpactParticals; //粒子系统类UPROPERTY(EditAnywhere)class USoundCue* ImpactSound;//声音提示类//子弹类源文件
//构造中添加
ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
ProjectileMovementComponent->bRotationFollowsVelocity = true; //如果为 true,则此射弹将在每一帧更新其旋转以匹配其速度方向
// Called when the game starts or when spawned
void AProjectile::BeginPlay()
{Super::BeginPlay();if (Tracer){//播放附加到指定组件并跟随指定组件的指定效果。当效果完成时,系统将消失。不复制TracerComponent = UGameplayStatics::SpawnEmitterAttached(Tracer,//粒子系统创建CollisionBox,//要附加到的组件。FName(),//AttachComponent 中的可选命名点,用于生成发射器GetActorLocation(),// 位置 -- 根据 LocationType 的值,这是与附加组件/点的相对偏移量,或者是将转换为相对偏移量的绝对世界位置(如果 LocationType 为 KeepWorldPosition)。GetActorRotation(),//旋转 -- 根据 LocationType 的值,这是与附加组件/点的相对偏移量,或者是将转换为相对偏移量的绝对世界旋转(如果 LocationType 为 KeepWorldPosition)EAttachLocation::KeepWorldPosition//根据 LocationType 的值,这是附加组件中的相对缩放,或者是将转换为相对缩放的绝对世界缩放(如果 LocationType 为 KeepWorldPosition)。//指定 Location 是相对偏移还是绝对世界位置//当粒子系统完成播放时,组件是否会自动销毁,或者是否可以重新激活//用于池化此组件的方法。默认为 none。//组件是否在创建时自动激活。	);}if (HasAuthority()){CollisionBox->OnComponentHit.AddDynamic(this,&AProjectile::OnHit);}
}void AProjectile::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{Destroy();
}void AProjectile::Destroyed()
{Super::Destroyed();if (ImpactParticals){UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactParticals, GetActorTransform());}if (ImpactSound){UGameplayStatics::PlaySoundAtLocation(this, ImpactSound, GetActorLocation());}
}

        17.设置声音和粒子特效设置速度

        18. 若想发射子弹时在其他客户端也可以显示在子弹类的构造中将bReplicates = true;即可

        19.弹壳类

//弹壳头文件UFUNCTION()virtual void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);#if 0
public:	// Called every framevirtual void Tick(float DeltaTime) override;
#endifprivate:UPROPERTY(VisibleAnywhere)UStaticMeshComponent* CasingMesh;//静态网格体类 武器开火时弹出的子弹的网格体UPROPERTY(EditAnywhere)float ShellEjectionImpulse;// 弹壳初速度UPROPERTY(EditAnywhere)class USoundCue* ShellSound;// 弹壳弹出时的声音//弹壳源文件
ACasing::ACasing()
{// 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;CasingMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("CasingMesh"));SetRootComponent(CasingMesh);CasingMesh->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera,ECollisionResponse::ECR_Ignore);CasingMesh->SetSimulatePhysics(true); // 物理CasingMesh->SetEnableGravity(true); // 重力CasingMesh->SetNotifyRigidBodyCollision(true); //通知ShellEjectionImpulse = 10.f;
}// Called when the game starts or when spawned
void ACasing::BeginPlay()
{Super::BeginPlay();CasingMesh->OnComponentHit.AddDynamic(this, &ACasing::OnHit);// 给弹壳添加初始速度CasingMesh->AddImpulse(GetActorForwardVector() * ShellEjectionImpulse);
}
void ACasing::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{if (ShellSound){UGameplayStatics::PlaySoundAtLocation(this, ShellSound, GetActorLocation());}Destroy();
}
#if 0
// Called every frame
void ACasing::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}
#endif

        20.弹壳类蓝图

相关文章:

UE5学习笔记21-武器的射击功能

一、创建C类 创建武器子弹的类&#xff0c;创建生产武器子弹的类&#xff0c;创建弹壳的类&#xff0c;生产武器子弹的类的父类是武器的类 创建后如图&#xff0c;ProjectileMyWeapon类(产生子弹的类)继承自weapon类&#xff0c;Projectile(子弹的类)&#xff0c;Casing(弹壳声…...

Mamba模型学习笔记

笔记来源&#xff1a;bilibili Transformer 的死穴 Transformer 结构的核心是自注意力机制层&#xff0c;无论是 encoder 还是 decoder&#xff0c;序列数据都先经过位置编码后喂给这个模块。 但是自注意力机制的计算范围仅限于窗口内&#xff0c;而无法直接处理窗口外的元素…...

android kotlin 基础复习 继承 inherit

1、新建文件kt 2、代码&#xff1a; /**用户基类**/ open class Person1(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")println("name:${name},age:${age}")} }/**子…...

读软件设计的要素06概念完整性

1. 概念完整性 1.1. 当概念组合成一个软件时&#xff0c;它们可以同步以便协调行为 1.1.1. 同步可能会消除一个概念的某些行为&#xff0c;但决不会添加与该概念的规范不一致的新行为 1.1.2. 在使用概念设计软件时&#xff0c;即使你没有精确定义同步&#xff0c;至少要说服自…...

Java 每日一刊(第2期):搭建开发环境

文章目录 JVM、JRE、JDKJVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;JRE&#xff08;Java Runtime Environment&#xff0c;Java 运行时环境&#xff09;JDK&#xff08;Java Development Kit&#xff0c;Java 开发工具包&#xff09;JVM、JRE、JD…...

探索EasyCVR与AI技术深度融合:视频汇聚平台的新增长点

随着5G、AI、边缘计算、物联网&#xff08;IoT&#xff09;、云计算等技术的快速发展&#xff0c;万物互联已经从概念逐渐转变为现实&#xff0c;AIoT&#xff08;物联网人工智能&#xff09;的新时代正在加速到来。在这一背景下&#xff0c;视频技术作为信息传输和交互的重要手…...

IBM中国研发部调整:全球化与本土化的新平衡

如何看待IBM中国研发部裁员&#xff1f; 近日&#xff0c;IBM中国宣布撤出在华两大研发中心&#xff0c;引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展&#xff0c;也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对…...

C++入门基础篇

引言 说到编程语言常常听到的就是C语言C Java 。C语言是面向过程的&#xff0c;C是和Java是面向对象的&#xff0c;那么什么是面向对象呢&#xff1f;什么又是面向过程呢&#xff1f;C是什么&#xff1f;封装、继承、多态是什么&#xff1f;且听我絮絮叨叨。 C入门基础 1.命名…...

Qt QListWidget 代码范例,以及Qt 天坑:setStyleSheet失效问题

一、坑之所在 1.写了StyleSheet的QString并进行了设置 this->setStyleSheet(styleSheet_M);2.注释后&#xff0c;将StyleSheet换到UI form里去&#xff0c;然后又手动清理了UI form里的StyleSheet 重新使用代码设置&#xff0c;此时代码设置失效了 二、根本解决 1.手动从…...

Unity AnimationClip详解(1)

【动画片段】 前文我们介绍了骨骼动画&#xff0c;在Unity中骨骼动画的部分静态数据存储在SkinedMeshRender中&#xff0c;而另一部分动态的关键帧数据就是存储在AnimationClip中的。 关键帧数据来自与FBX、OBJ等动画模型文件&#xff0c;可以在动画导入后的Animation选项卡中…...

在这12种场景下会使Spring事务失效--注意防范

在某些业务场景下&#xff0c;如果一个请求中&#xff0c;需要同事写入多张表的数据&#xff0c;但为了保证操作的原子性&#xff08;要么同事插入数据成功&#xff0c;要么同事插入失败&#xff09;&#xff0c;例如&#xff0c;当我们创建用户的时候&#xff0c;往往会给用户…...

SOPC:Nios II Processor -> Vectors

Reset Vector——复位向量 Exception Vector——执行向量 两个向量地址都存储着程序 1.Reset Vector 当FPGA进行复位时&#xff0c;FPGA就重新开始执行程序&#xff0c;这时就需要从EPCS中读取程序。由于FPGA的程序存放在EPC…...

golang学习笔记11——Go 语言的并发与同步实现详解

推荐学习文档 基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学习笔记04——如何真正写好Golang代码&…...

关于汽车加油是加200还是加满的思考

车子快开了1万公里了&#xff0c;每个月保险会送一个200-15的加油优惠券&#xff0c;所以之前一直是每次加200的习惯&#xff0c; 最近突然觉得经常去加油很麻烦&#xff0c;而且很浪费时间&#xff0c; 需要重新评估一下&#xff0c; 一次加200 or 一次加300 or 一次加满&am…...

C# 去掉字符串最后一个字符的5种方法

C# 去掉字符串最后一个字符的 5 种方法 &#xff08;1&#xff09;Substring string original "Hello!"; string result original.Substring(0, original.Length - 1); Console.WriteLine(result); // 输出: Hello &#xff08;2&#xff09;Remove string o…...

[Redis] Redis中的String类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

Transiting from CUDA to HIP(三)

一、Workarounds 1. memcpyToSymbol 在 HIP (Heterogeneous-compute Interface for Portability) 中&#xff0c;hipMemcpyToSymbol 函数用于将数据从主机内存复制到设备上的全局内存或常量内存中&#xff0c;这样可以在设备端的内核中访问这些数据。这个功能特别有用&#x…...

基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统

系统展示 用户界面 管理员界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的传播速度…...

游戏的3C,Al

在游戏开发中&#xff0c;“3C”通常指的是三个重要的组成部分&#xff1a;Character&#xff08;角色&#xff09;、Camera&#xff08;摄像机&#xff09;和Control&#xff08;控制&#xff09;。这三者对于创建沉浸式和流畅的游戏体验至关重要。而AI&#xff08;人工智能&a…...

深度学习基础案例4--运用动态学习率构建CNN卷积神经网络实现的运动鞋识别(测试集的准确率84%)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 前几天一直很忙&#xff0c;一直在数学建模中&#xff0c;没有来得及更新&#xff0c;接下来将恢复正常这一次的案例很有意思&#xff1a;在学习动态调整…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

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

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

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...