文章目录

  • 创建资产类
  • 设置经验
  • 使用MMC来计算角色升级的属性值
  • 调整生命值和法力值


创建资产类

在这里插入图片描述

// 幻雨喜欢小猫咪#pragma once#include "CoreMinimal.h"
#include "Abilities/GameplayAbility.h"
#include "Engine/DataAsset.h"
#include "PDA_AbilitySystemGenerics.generated.h"/*** 通用能力系统数据资产类* 存储游戏所有角色能力系统的公共配置数据* 包含基础属性、游戏效果、被动技能等配置信息*/
UCLASS()
class CRUNCH_API UPDA_AbilitySystemGenerics : public UPrimaryDataAsset
{GENERATED_BODY()
public:// 获取完整属性效果类// 用于初始化角色基础属性值FORCEINLINE TSubclassOf<UGameplayEffect> GetFullStatEffect() const { return FullStatEffect; }// 获取死亡效果类// 角色死亡时应用的全局游戏效果FORCEINLINE TSubclassOf<UGameplayEffect> GetDeathEffect() const { return DeathEffect; }// 获取初始效果数组// 角色初始化时自动应用的游戏效果集合FORCEINLINE const TArray<TSubclassOf<UGameplayEffect>>& GetInitialEffects() const { return InitialEffects; }// 获取被动技能数组// 角色默认解锁的被动技能列表FORCEINLINE const TArray<TSubclassOf<UGameplayAbility>>& GetPassiveAbilities() const { return PassiveAbilities; }// 获取基础属性数据表// 存储角色基础属性(力量、敏捷等)的DataTable资源FORCEINLINE const UDataTable* GetBaseStatDataTable() const { return BaseStatDataTable; }// 获取经验曲线数据// 用于计算角色升级所需经验值的曲线const FRealCurve* GetExperienceCurve() const;private:// 全局属性效果UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects")TSubclassOf<UGameplayEffect> FullStatEffect;// 死亡惩罚效果UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects")TSubclassOf<UGameplayEffect> DeathEffect;// 初始效果列表UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects")TArray<TSubclassOf<UGameplayEffect>> InitialEffects;// 默认被动技能列表UPROPERTY(EditDefaultsOnly, Category = "Gameplay Ability")TArray<TSubclassOf<UGameplayAbility>> PassiveAbilities;// 基础属性数据表资源UPROPERTY(EditDefaultsOnly, Category = "Base Stats")TObjectPtr<UDataTable> BaseStatDataTable;// 经验等级曲线名称// 指定经验曲线表中使用的行名称UPROPERTY(EditDefaultsOnly, Category = "Level")FName ExperienceRowName = "ExperienceNeededToReachLevel";// 经验曲线资源// 存储等级-经验值对应关系的曲线表UPROPERTY(EditDefaultsOnly, Category = "Level")TObjectPtr<UCurveTable> ExperienceCurveTable;
};
const FRealCurve* UPDA_AbilitySystemGenerics::GetExperienceCurve() const
{return ExperienceCurveTable->FindCurve(ExperienceRowName, "");
}

ASC中去掉被动和基础属性的
在这里插入图片描述

ASC.cpp中需要更改的部分

void UCAbilitySystemComponent::InitializeBaseAttributes()
{if (!AbilitySystemGenerics || !AbilitySystemGenerics->GetBaseStatDataTable() || !GetOwner()){return;}// 获取基础属性数据表和角色对应的配置数据const UDataTable* BaseStatDataTable = AbilitySystemGenerics->GetBaseStatDataTable();const FTHeroBaseStats* BaseStats = nullptr;
}void UCAbilitySystemComponent::ApplyInitialEffects()
{// 检查当前组件是否拥有拥有者,并且拥有者是否具有网络权限(权威性) if (!GetOwner() || !GetOwner()->HasAuthority()) return;if (!AbilitySystemGenerics)return;for (const TSubclassOf<UGameplayEffect>& EffectClass : AbilitySystemGenerics->GetInitialEffects()){// 创建游戏效果规格句柄,用于描述要应用的效果及其上下文FGameplayEffectSpecHandle EffectSpecHandle = MakeOutgoingSpec(EffectClass, 1, MakeEffectContext());// 将游戏效果应用到自身ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());}
}void UCAbilitySystemComponent::ApplyFullStatEffect()
{if (!AbilitySystemGenerics || !AbilitySystemGenerics->GetFullStatEffect())return;AuthApplyGameplayEffect(AbilitySystemGenerics->GetFullStatEffect());
}void UCAbilitySystemComponent::GiveInitialAbilities()
{// 检查当前组件是否拥有拥有者,并且拥有者是否具有网络权限(权威性) if (!GetOwner() || !GetOwner()->HasAuthority()) return;for (const TPair<ECAbilityInputID,TSubclassOf<UGameplayAbility>>& AbilityPair : BasicAbilities){// 赋予技能 等级为 1GiveAbility(FGameplayAbilitySpec(AbilityPair.Value, 1, static_cast<int32>(AbilityPair.Key), nullptr));}for (const TPair<ECAbilityInputID,TSubclassOf<UGameplayAbility>>& AbilityPair : Abilities){GiveAbility(FGameplayAbilitySpec(AbilityPair.Value, 0, static_cast<int32>(AbilityPair.Key), nullptr));}// 需要更改的被动技能地方if (!AbilitySystemGenerics)return;for (const TSubclassOf<UGameplayAbility>& PassiveAbility : AbilitySystemGenerics->GetPassiveAbilities()){GiveAbility(FGameplayAbilitySpec(PassiveAbility, 1, -1, nullptr));}
}
void UCAbilitySystemComponent::HealthUpdated(const FOnAttributeChangeData& ChangeData)
{if (!GetOwner() || !GetOwner()->HasAuthority()) return;// 获取当前最大生命值bool bFound = false;float MaxHealth = GetGameplayAttributeValue(UCAttributeSet::GetMaxHealthAttribute(), bFound);// 如果生命值达到最大值,添加生命值已满标签if (bFound && ChangeData.NewValue >= MaxHealth){if (!HasMatchingGameplayTag(TGameplayTags::Stats_Health_Full)){// 仅本地会添加标签AddLooseGameplayTag(TGameplayTags::Stats_Health_Full);}}else{// 移除生命值已满标签RemoveLooseGameplayTag(TGameplayTags::Stats_Health_Full);}if (ChangeData.NewValue <= 0.0f){if (!HasMatchingGameplayTag(TGameplayTags::Stats_Health_Empty)){// 本地添加生命值清零标签AddLooseGameplayTag(TGameplayTags::Stats_Health_Empty);// 角色死亡if(AbilitySystemGenerics && AbilitySystemGenerics->GetDeathEffect())AuthApplyGameplayEffect(AbilitySystemGenerics->GetDeathEffect());// TODO:这里是由GE直接扣血的时候触发这种的死亡,我使用的是GCC触发的方式是在属性这边发送事件// // 创建需要传给死亡被动技能的事件数据// FGameplayEventData DeadAbilityEventData;// if (ChangeData.GEModData)// {// 	DeadAbilityEventData.ContextHandle = ChangeData.GEModData->EffectSpec.GetContext();// }else// {// 	UE_LOG(LogTemp, Error, TEXT("ChangeData.GEModData is null"))// }// UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(GetOwner(), // 	TGameplayTags::Stats_Dead, // 	DeadAbilityEventData);}}else{RemoveLooseGameplayTag(TGameplayTags::Stats_Health_Empty);}
}

创建一个给英雄一个给小兵
在这里插入图片描述
在这里插入图片描述
分别配置一下
在这里插入图片描述

在这里插入图片描述

设置经验

创建一个曲线表格
在这里插入图片描述
再把表格塞进去
在这里插入图片描述
创建经验值的回调

// 判断是否满级
bool IsAtMaxLevel() const;
void ExperienceUpdated(const FOnAttributeChangeData& ChangeData);
bool UCAbilitySystemComponent::IsAtMaxLevel() const
{bool bFound;float CurrentLevel = GetGameplayAttributeValue(UCHeroAttributeSet::GetLevelAttribute(), bFound);float MaxLevel = GetGameplayAttributeValue(UCHeroAttributeSet::GetMaxLevelAttribute(), bFound);return CurrentLevel >= MaxLevel;
}UCAbilitySystemComponent::UCAbilitySystemComponent()
{GetGameplayAttributeValueChangeDelegate(UCAttributeSet::GetHealthAttribute()).AddUObject(this, &UCAbilitySystemComponent::HealthUpdated);GetGameplayAttributeValueChangeDelegate(UCAttributeSet::GetManaAttribute()).AddUObject(this, &UCAbilitySystemComponent::ManaUpdated);GetGameplayAttributeValueChangeDelegate(UCHeroAttributeSet::GetExperienceAttribute()).AddUObject(this, &UCAbilitySystemComponent::ExperienceUpdated);GenericConfirmInputID = static_cast<int32>(ECAbilityInputID::Confirm);GenericCancelInputID = static_cast<int32>(ECAbilityInputID::Cancel);
}void UCAbilitySystemComponent::InitializeBaseAttributes()
{if (!AbilitySystemGenerics || !AbilitySystemGenerics->GetBaseStatDataTable() || !GetOwner()){return;}// 处理经验系统配置const FRealCurve* ExperienceCurve = AbilitySystemGenerics->GetExperienceCurve();if (ExperienceCurve){int MaxLevel = ExperienceCurve->GetNumKeys(); // 经验曲线中的最大等级SetNumericAttributeBase(UCHeroAttributeSet::GetMaxLevelAttribute(), MaxLevel); // 设置角色最大等级限制float MaxExp = ExperienceCurve->GetKeyValue(ExperienceCurve->GetLastKeyHandle()); // 最高等级所需经验SetNumericAttributeBase(UCHeroAttributeSet::GetMaxLevelExperienceAttribute(), MaxExp); // 设置最高等级经验阈值// 输出调试信息UE_LOG(LogTemp, Warning, TEXT("最大等级为: %d, 最大经验值为: %f"), MaxLevel, MaxExp);}ExperienceUpdated(FOnAttributeChangeData());
}void UCAbilitySystemComponent::ExperienceUpdated(const FOnAttributeChangeData& ChangeData)
{// 仅在拥有者存在且为服务器时执行if (!GetOwner() || !GetOwner()->HasAuthority()) return;// 满级返回if (IsAtMaxLevel()) return;// 检查能力系统通用配置是否有效if (!AbilitySystemGenerics)return;// 获取当前经验值float CurrentExp = ChangeData.NewValue;// 从配置中获取经验曲线数据(等级->所需经验的映射)const FRealCurve* ExperienceCurve = AbilitySystemGenerics->GetExperienceCurve();if (!ExperienceCurve){UE_LOG(LogTemp, Warning, TEXT("无法找到经验数据!"));return;}float PrevLevelExp = 0.f;	// 当前等级的最低经验值float NextLevelExp = 0.f;	// 下一级所需最低经验值float NewLevel = 1.f;		// 新的等级for (auto Iter = ExperienceCurve->GetKeyHandleIterator(); Iter; ++Iter){// 获取当前等级(NewLevel)对应的升级经验阈值float ExperienceToReachLevel = ExperienceCurve->GetKeyValue(*Iter);if (CurrentExp < ExperienceToReachLevel){// 找到第一个大于当前经验的等级阈值NextLevelExp = ExperienceToReachLevel;break;}// 记录当前等级的最低经验值PrevLevelExp = ExperienceToReachLevel;NewLevel = Iter.GetIndex() + 1;	// 等级加一}// 获取当前等级以及可用的升级点数float CurrentLevel = GetNumericAttributeBase(UCHeroAttributeSet::GetLevelAttribute());float CurrentUpgradePoint = GetNumericAttribute(UCHeroAttributeSet::GetUpgradePointAttribute());// 计算等级提升数float LevelUpgraded = NewLevel - CurrentLevel;// 累加升级点数(当前点数+升级的级数)float NewUpgradePoint = CurrentUpgradePoint + LevelUpgraded;// 更新角色的属性值SetNumericAttributeBase(UCHeroAttributeSet::GetLevelAttribute(), NewLevel);					  // 设置新等级SetNumericAttributeBase(UCHeroAttributeSet::GetPrevLevelExperienceAttribute(), PrevLevelExp); // 设置当前等级经验基准SetNumericAttributeBase(UCHeroAttributeSet::GetNextLevelExperienceAttribute(), NextLevelExp); // 设置下等级经验基准SetNumericAttributeBase(UCHeroAttributeSet::GetUpgradePointAttribute(), NewUpgradePoint);     // 更新可分配升级点数
}

在这里插入图片描述
在这里插入图片描述

使用MMC来计算角色升级的属性值

在这里插入图片描述

// 幻雨喜欢小猫咪#pragma once#include "CoreMinimal.h"
#include "GameplayModMagnitudeCalculation.h"
#include "MMC_LevelBased.generated.h"/*** */
UCLASS()
class CRUNCH_API UMMC_LevelBased : public UGameplayModMagnitudeCalculation
{GENERATED_BODY()
public:UMMC_LevelBased();float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override;
private:UPROPERTY(EditDefaultsOnly)FGameplayAttribute RateAttribute;FGameplayEffectAttributeCaptureDefinition LevelCaptureDefinition;
};
// 幻雨喜欢小猫咪#include "GAS/MMC/MMC_LevelBased.h"#include "GAS/Core/CHeroAttributeSet.h"UMMC_LevelBased::UMMC_LevelBased()
{LevelCaptureDefinition.AttributeToCapture = UCHeroAttributeSet::GetLevelAttribute();   // 捕获目标等级属性// 设置捕获对象,这里设置目标还是源都无所谓,因为是自己给自己LevelCaptureDefinition.AttributeSource = EGameplayEffectAttributeCaptureSource::Target;// 注册捕获属性RelevantAttributesToCapture.Add(LevelCaptureDefinition);
}float UMMC_LevelBased::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const
{// 获取ASC,用来获取属性UAbilitySystemComponent* ASC = Spec.GetContext().GetInstigatorAbilitySystemComponent();if (!ASC) return 0.f;float Level = 0.f;// 设置评估参数FAggregatorEvaluateParameters EvalParams;// 绑定源/目标标签EvalParams.SourceTags = Spec.CapturedSourceTags.GetAggregatedTags();EvalParams.TargetTags = Spec.CapturedTargetTags.GetAggregatedTags();// 获取目标对象的等级属性值GetCapturedAttributeMagnitude(LevelCaptureDefinition, Spec, EvalParams, Level);// 获取预设的成长属性值bool bFound;float RateAttributeVal = ASC->GetGameplayAttributeValue(RateAttribute, bFound);if (!bFound)return 0.f;return (Level - 1) * RateAttributeVal;
}

蓝图中继承该mmc,创建需要调用的属性
在这里插入图片描述
再创建一个无限GE配置一下相关项
在这里插入图片描述
在这里插入图片描述

测试一下
在这里插入图片描述

在这里插入图片描述

调整生命值和法力值

这个最大生命增加后,血条并没有发生什么变化,因此需要在最大值更新的时候按照更新前的百分比修正一下

	// 根据缓存的生命百分比和新最大生命值重新计算生命值void RescaleHealth();// 根据缓存的法力百分比和最大法力值重新计算法力值void RescaleMana();// 缓存的生命百分比UPROPERTY()FGameplayAttributeData CachedHealthPercent;ATTRIBUTE_ACCESSORS(UCAttributeSet, CachedHealthPercent)// 缓存的法力百分比UPROPERTY()FGameplayAttributeData CachedManaPercent;ATTRIBUTE_ACCESSORS(UCAttributeSet, CachedManaPercent)

在生命或法力发生变化的时候缓存一下百分比

void UCAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{if (Data.EvaluatedData.Attribute == GetHealthAttribute()){SetHealth(FMath::Clamp(GetHealth(), 0, GetMaxHealth()));SetCachedHealthPercent(GetHealth()/GetMaxHealth());}if (Data.EvaluatedData.Attribute == GetManaAttribute()){SetMana(FMath::Clamp(GetMana(), 0, GetMaxMana()));SetCachedManaPercent(GetMana()/GetMaxMana());}
}void UCAttributeSet::RescaleHealth()
{if (!GetOwningActor()->HasAuthority())return;if (GetCachedHealthPercent() != 0 && GetHealth() != 0){SetHealth(GetMaxHealth() * GetCachedHealthPercent());}
}void UCAttributeSet::RescaleMana()
{if (!GetOwningActor()->HasAuthority())return;if (GetCachedManaPercent() != 0 && GetMana() != 0){SetMana(GetMaxMana() * GetCachedManaPercent());}
}

到角色类中添加最大生命和法力的回调,调用缓存更新值

	// 最大生命值改变回调void MaxHealthUpdated(const FOnAttributeChangeData& Data);// 最大法力值改变回调void MaxManaUpdated(const FOnAttributeChangeData& Data);
void ACCharacter::BindGASChangeDelegates()
{if (CAbilitySystemComponent){CAbilitySystemComponent->RegisterGameplayTagEvent(TGameplayTags::Stats_Dead).AddUObject(this, &ACCharacter::DeathTagUpdated);CAbilitySystemComponent->RegisterGameplayTagEvent(TGameplayTags::Stats_Stun).AddUObject(this, &ACCharacter::StunTagUpdated);CAbilitySystemComponent->RegisterGameplayTagEvent(TGameplayTags::Stats_Aim).AddUObject(this, &ACCharacter::AimTagUpdated);CAbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(CAttributeSet->GetMoveSpeedAttribute()).AddUObject(this, &ACCharacter::MoveSpeedUpdated);CAbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UCAttributeSet::GetMaxHealthAttribute()).AddUObject(this, &ACCharacter::MaxHealthUpdated);CAbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UCAttributeSet::GetMaxManaAttribute()).AddUObject(this, &ACCharacter::MaxManaUpdated);}
}
void ACCharacter::MaxHealthUpdated(const FOnAttributeChangeData& Data)
{if (IsValid(CAttributeSet)){CAttributeSet->RescaleHealth();}
}void ACCharacter::MaxManaUpdated(const FOnAttributeChangeData& Data)
{if (IsValid(CAttributeSet)){CAttributeSet->RescaleMana();}
}

升级的时候血条本来100%升级完也是100%
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916063.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916063.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916063.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隧道代理的动态IP切换机制与实现原理

目录 一、动态IP切换的底层逻辑 1. 统一入口与动态出口的魔法 2. 云端IP池的智能调度 二、协议层的技术突破 1. 传输层隧道&#xff1a;IPsec与WireGuard的较量 2. 应用层隧道&#xff1a;HTTP/SOCKS5的进化 三、动态切换的触发机制 1. 被动触发&#xff1a;封禁检测与应…

时序数据库主流产品概览

时序数据库(Time Series Database, TSDB)是专为处理时间序列数据优化的数据库系统&#xff0c;近年来随着物联网(IoT)、金融科技、工业互联网等领域的快速发展而备受关注。本文将介绍当前主流的时序数据库产品。一、时序数据库概述时序数据是带时间戳记录的数据点序列&#xff…

图机器学习(17)——基于文档语料库构建知识图谱

图机器学习&#xff08;17&#xff09;——基于文档语料库构建知识图谱0. 前言1. 基于文档语料库构建知识图谱2. 知识图谱3. 文档-实体二分图0. 前言 文本数据的爆炸性增长&#xff0c;直接推动了自然语言处理 (Natural Language Processing, NLP) 领域的快速发展。在本节中&a…

【实时Linux实战系列】实时文件系统的特性与优化

在实时系统中&#xff0c;文件系统的性能和可靠性对于系统的整体表现至关重要。实时文件系统需要在严格的时间约束内完成文件的读写操作&#xff0c;以确保系统的实时性。本文将介绍实时文件系统的基本特性和应用场景&#xff0c;并提供相关的实施和优化建议&#xff0c;以满足…

Clickhouse源码分析-副本数据同步

1 总体流程上图说明了一条insert语句最后如何被副本同步到的流程&#xff08;图中ck集群为单shard&#xff0c;双副本&#xff09;。&#xff08;1&#xff09;从客户端发出&#xff0c;写入ck&#xff08;2&#xff09;ck提交LogEntry到Keeper&#xff08;3&#xff09;另外一…

Spring AI 系列之二十四 - ModerationModel

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

在 macOS 上 安装最新 Python 和 pip

文章目录方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09;方法二&#xff1a;使用 pyenv&#xff08;管理多个 Python 版本&#xff09;方法三&#xff1a;从官网下载安装包升级 pip验证安装方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09; 1. 安装…

新能源电池厂自动化应用:Modbus TCP转DeviceNet实践

一、项目背景在新能源电池厂的生产过程中&#xff0c;提升自动化水平对提高生产效率和产品质量至关重要。我们的生产线上&#xff0c;施耐德PLC负责整体的生产流程控制&#xff0c;采用Modbus TCP协议进行数据传输&#xff0c;它基于以太网&#xff0c;传输速度快、稳定性高&am…

Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器

Java集合框架 集合框架被设计成的目标&#xff1a;高性能、高效 允许不同类型的结合&#xff0c;以类似的方式进行工作&#xff0c;有高度的互操作性 对一个集合的扩展和适应必须是简单的两种容器&#xff1a;集合Collection、图Map 集合接口被分为了三种子类型&#xff1a;Lis…

笔记/使用Excel进行财务预测

文章目录金融预测的决策与数据收集决定财务问题收集财务数据清理与合并财务数据解释与应用预测结果使用excel进行财务回归分析回归预测的步骤解释回归结果在 Excel 中执行预测财务分析指标财务分析常用指标一览表财务指标的相关性对竞争对手进行基准测试财务指标的趋势分析持续…

力扣1287:有序数组中出现次数超过25%的元素

力扣1287:有序数组中出现次数超过25%的元素题目思路代码题目 给你一个非递减的 有序 整数数组&#xff0c;已知这个数组中恰好有一个整数&#xff0c;它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 思路 哈希表秒了 代码 class Solution { public:int fi…

如何用 Z.ai 生成PPT,一句话生成整套演示文档

大家好&#xff0c;这里是K姐。 一个帮你追踪最新AI应用的女子。 最近朋友给我分享了一个好玩的页面截图。 一眼看过去&#xff0c;就感觉这PPT的文字排版很有人工味。 我立马就去试了一下&#xff0c;才发现它根本不是传统的 PPT&#xff0c;而是一种网页式的 Slides 。 做…

C/C++ 编程:掌握静态库与动态库的编译

在 C/C 项目开发中&#xff0c;理解并掌握如何编译和使用库文件是至关重要的一环。库允许你将常用的函数和代码模块化&#xff0c;从而提高代码重用性、简化项目管理并缩短编译时间。最常见的两种库类型是静态库 (.a) 和动态库 (.so)。它们各有优缺点&#xff0c;适用于不同的开…

汽车安全 | 汽车安全入门

引言 汽车安全不仅仅是对汽车/车辆进行物理入侵。这只是很小且简单的一部分。当你以攻击者/对手的思维去看待一辆联网汽车时&#xff0c;你关注的是整个车辆生态系统。这不仅包括它如何与外部实体通信&#xff0c;也包括它在车内如何运作。 汽车是主要的交通工具&#xff0c;…

CLIP与SIGLIP对比浅析

CLIP 和 SIGLIP 的核心区别在于损失函数的设计&#xff1a;CLIP 使用基于 softmax 的对比损失&#xff08;InfoNCE&#xff09;&#xff0c;强制正样本在全局对比中压倒所有负样本&#xff0c;计算成本高且受限于负样本数量&#xff1b;SIGLIP 改用基于 sigmoid 的二元分类损失…

移动管家手机控车便捷性如何

移动管家4G手机控车-全面升级一键启动、无钥匙进入、手机启动、手机开关锁、手机开尾箱、手机寻车、车辆诊断、GPS北斗定位、电子围栏、车辆授权、车辆防盗抢、胎压检测、预约启动、车窗控制、车况提醒等功&#xff1b;移动管家手机控车系统&#xff08;以“移动管家控车APP”为…

MySQL 8.4.4详细下载安装配置

1、下载mysql8.4.4文件&#xff0c;取zip文件 mysql8.4.4下载路径 MySQL 5.7.31详细下载安装配置 2、配置环境变量 1.系统—>高级系统设置—>环境变量—>系统变量 在系统变量中点击新建&#xff0c;变量名为量名为&#xff1a;MYSQL_HOME&#xff0c;添加你的mys…

在 Linux 上安装 `pgvector`(这是一个 PostgreSQL 的向量类型扩展,常用于处理嵌入向量,便于进行向量相似度搜索)

全文 4000 字&#xff0c;配图配码&#xff0c;已在多家企业落地验证。阅读完如有收获&#xff0c;文末投票告诉我你最关注的方向&#xff0c;我会在下一篇文章里继续深入。 0. pgvector 简介 pgvector 是一款 PostgreSQL 原生向量数据类型扩展&#xff0c;核心能力&#xff1…

【项目实战】——深度学习.全连接神经网络

目录 1.使用全连接网络训练和验证MNIST数据集 2.使用全连接网络训练和验证CIFAR10数据集 1.使用全连接网络训练和验证MNIST数据集 import torch from torch import nn from torchvision import datasets, transforms from torch.utils.data import DataLoader from torch im…

嵌入式学习的第三十四天-进程间通信-TCP

一、TCPTCP : 传输控制协议 传输层1. TCP特点(1).面向连接,避免部分数据丢失 (2).安全、可靠 (3).面向字节流 (4).占用资源开销大2.TCP安全可靠机制三次握手:指建立tcp连接时&#xff0c;需要客户端和服务端总共发送三次报文确认连接。确保双方均已做好 收发…