UE5多人MOBA+GAS 28、創建資產類來管理GAS通用的資產、設置經驗表來升級以及用MMC計算升級添加的屬性值

文章目錄

  • 創建資產類
  • 設置經驗
  • 使用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;需要客戶端和服務端總共發送三次報文確認連接。確保雙方均已做好 收發…