UE5多人MOBA+GAS 21、給升龍添加連段攻擊,從角色的按下事件中傳遞事件給GA

文章目錄

  • 給升龍制作可連段
    • 緩存下一連段
    • 用普攻鍵來觸發升龍后續的連段
      • 在角色中發送按下普攻標簽事件
      • 在升龍中接收按下事件,觸發連段以及傷害和力量的傳遞
    • 最后在藍圖中設置一下
  • 升龍技能的完整代碼


給升龍制作可連段

給升龍技能添加一些連段
在這里插入圖片描述

緩存下一連段

緩存下一連段的名稱

	// 處理連招階段切換事件UFUNCTION()void HandleComboChangeEvent(FGameplayEventData EventData);// 下一個連招階段的名稱FName NextComboName;
UUpperCut::UUpperCut()
{// 阻止帶有Ability_BasicAttack標簽的技能激活BlockAbilitiesWithTag.AddTag(TGameplayTags::Ability_BasicAttack);
}void UUpperCut::StartLaunching(FGameplayEventData EventData)
{if (K2_HasAuthority()){// 推動自己向上PushTarget(GetAvatarActorFromActorInfo(), FVector::UpVector * UpperCutLaunchSpeed);// 獲取命中目標的數量int HitResultCount = UAbilitySystemBlueprintLibrary::GetDataCountFromTargetData(EventData.TargetData);// 對所有命中的目標執行擊飛和傷害for (int i = 0; i < HitResultCount; i++){FHitResult HitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(EventData.TargetData, i);PushTarget(HitResult.GetActor(), FVector::UpVector * UpperCutLaunchSpeed);ApplyGameplayEffectToHitResultActor(HitResult, LaunchDamageEffect, GetAbilityLevel(CurrentSpecHandle, CurrentActorInfo));}}// 監聽連招切換、提交、傷害等事件UAbilityTask_WaitGameplayEvent* WaitComboChangeEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Combo_Change, nullptr, false, false);WaitComboChangeEvent->EventReceived.AddDynamic(this, &UUpperCut::HandleComboChangeEvent);WaitComboChangeEvent->ReadyForActivation();
}
void UUpperCut::HandleComboChangeEvent(FGameplayEventData EventData)
{// 獲取事件標簽FGameplayTag EventTag = EventData.EventTag;if (EventTag == TGameplayTags::Ability_Combo_Change_End){// 下一個連招名稱置空NextComboName = NAME_None;UE_LOG(LogTemp, Warning, TEXT("清除連招"))return;}// 獲取下一個連段的名稱TArray<FName> TagNames;UGameplayTagsManager::Get().SplitGameplayTagFName(EventTag, TagNames);// Tag最后一段的名稱比如Combo02,03,04等NextComboName = TagNames.Last();UE_LOG(LogTemp, Warning, TEXT("下一個Combo:%s"), *NextComboName.ToString())
}

用普攻鍵來觸發升龍后續的連段

主要就是升龍期間,阻止普通技能的觸發,在升龍添加阻擋標簽的目的就是這個,然后需要在角色中發送按鍵按下事件,讓升龍GA接收,然后觸發切換到下一個蒙太奇。

在角色中發送按下普攻標簽事件

添加兩個Tag,用來將普攻按下和抬起的信息發送出去

	// 按下普通攻擊CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_BasicAttack_Pressed)// 抬起CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_BasicAttack_Released)
	UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_BasicAttack_Pressed, "Ability.BasicAttack.Pressed", "按下普通攻擊")UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_BasicAttack_Released, "Ability.BasicAttack.Released", "釋放普通攻擊鍵")	

因為角色的輸入只是發生在客戶端,服務器并不知道角色的輸入,因此在CCharacter中創建服務器發送事件

#pragma region GAS組件相關
public:virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;// 在服務器端向自身發送游戲事件UFUNCTION(Server, Reliable, WithValidation)void Server_SendGameplayEventToSelf(const FGameplayTag& EventTag, const FGameplayEventData& EventData);
void ACCharacter::Server_SendGameplayEventToSelf_Implementation(const FGameplayTag& EventTag,const FGameplayEventData& EventData)
{UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(this, EventTag, EventData);
}/*** @brief 驗證在服務器端向自身發送游戲事件的操作是否有效*/
bool ACCharacter::Server_SendGameplayEventToSelf_Validate(const FGameplayTag& EventTag,const FGameplayEventData& EventData)
{// 返回 true,表示操作有效return true;
}

在玩家角色CPlayerCharacter輸入中檢測按鍵的按下,發送游戲事件

void ACPlayerCharacter::HandleAbilityInput(const FInputActionValue& InputActionValue, ECAbilityInputID InputID)
{bool bPressed = InputActionValue.Get<bool>();// 按下if (bPressed){GetAbilitySystemComponent()->AbilityLocalInputPressed(static_cast<int32>(InputID));}else{GetAbilitySystemComponent()->AbilityLocalInputReleased(static_cast<int32>(InputID));}// 按下的是普攻鍵if (InputID == ECAbilityInputID::BasicAttack){FGameplayTag BasicAttackTag = bPressed ? TGameplayTags::Ability_BasicAttack_Pressed : TGameplayTags::Ability_BasicAttack_Released;// 1. 本地直接廣播(觸發客戶端即時反饋)// 2. 服務器RPC廣播(確保權威狀態同步)UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(this, BasicAttackTag, FGameplayEventData());Server_SendGameplayEventToSelf(BasicAttackTag, FGameplayEventData());}
}

在升龍中接收按下事件,觸發連段以及傷害和力量的傳遞

CGameplayAbilityTypes創建一個傷害效果的結構體,用來存儲GE以及觸發的力度大小

// 傷害效果定義
USTRUCT(BlueprintType)
struct FGenericDamageEffectDef
{GENERATED_BODY()public:FGenericDamageEffectDef();UPROPERTY(EditAnywhere)TSubclassOf<UGameplayEffect> DamageEffect;UPROPERTY(EditAnywhere)FVector PushVelocity;
};
FGenericDamageEffectDef::FGenericDamageEffectDef():DamageEffect{nullptr},PushVelocity{0.f}
{
}

回到升龍函數中補全代碼,像之前做Combo一樣,設置下一個蒙太奇片段,獲取當前片段的傷害,在應用傷害的時候,保持一下自己也在空中,對方也在空中,所有創建了上面的這個結構體。

private:// 連招階段對應的傷害效果定義表UPROPERTY(EditDefaultsOnly, Category = "Combo")TMap<FName, FGenericDamageEffectDef> ComboDamageMap;// 空中連招的力UPROPERTY(EditDefaultsOnly, Category = "Launch")float UpperComboHoldSpeed = 100.f;// 獲取當前連招階段的傷害效果定義const FGenericDamageEffectDef* GetDamageEffectDefForCurrentCombo() const;// 處理連招提交事件UFUNCTION()void HandleComboCommitEvent(FGameplayEventData EventData);// 處理連招傷害事件UFUNCTION()void HandleComboDamageEvent(FGameplayEventData EventData);
const FGenericDamageEffectDef* UUpperCut::GetDamageEffectDefForCurrentCombo() const
{UAnimInstance* OwnerAnimInstance = GetOwnerAnimInstance();if (OwnerAnimInstance){// 獲取當前片段名稱FName CurrentComboName = OwnerAnimInstance->Montage_GetCurrentSection(UpperCutMontage);// 獲取當前片段對應的傷害效果const FGenericDamageEffectDef* EffectDef = ComboDamageMap.Find(CurrentComboName);if (EffectDef){return EffectDef;}}// 沒找到返回一個空結構return nullptr;
}void UUpperCut::StartLaunching(FGameplayEventData EventData)
{if (K2_HasAuthority()){// 推動自己向上PushTarget(GetAvatarActorFromActorInfo(), FVector::UpVector * UpperCutLaunchSpeed);// 獲取命中目標的數量int HitResultCount = UAbilitySystemBlueprintLibrary::GetDataCountFromTargetData(EventData.TargetData);// 對所有命中的目標執行擊飛和傷害for (int i = 0; i < HitResultCount; i++){FHitResult HitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(EventData.TargetData, i);PushTarget(HitResult.GetActor(), FVector::UpVector * UpperCutLaunchSpeed);ApplyGameplayEffectToHitResultActor(HitResult, LaunchDamageEffect, GetAbilityLevel(CurrentSpecHandle, CurrentActorInfo));}}// 監聽連招切換、提交、傷害等事件UAbilityTask_WaitGameplayEvent* WaitComboChangeEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Combo_Change, nullptr, false, false);WaitComboChangeEvent->EventReceived.AddDynamic(this, &UUpperCut::HandleComboChangeEvent);WaitComboChangeEvent->ReadyForActivation();UAbilityTask_WaitGameplayEvent* WaitComboCommitEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_BasicAttack_Pressed);WaitComboCommitEvent->EventReceived.AddDynamic(this, &UUpperCut::HandleComboCommitEvent);WaitComboCommitEvent->ReadyForActivation();UAbilityTask_WaitGameplayEvent* WaitComboDamageEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Combo_Damage);WaitComboDamageEvent->EventReceived.AddDynamic(this, &UUpperCut::HandleComboDamageEvent);WaitComboDamageEvent->ReadyForActivation();
}void UUpperCut::HandleComboCommitEvent(FGameplayEventData EventData)
{// 按晚了if (NextComboName == NAME_None) return;UAnimInstance* OwnerAnimInstance = GetOwnerAnimInstance();if (!OwnerAnimInstance) return;OwnerAnimInstance->Montage_SetNextSection(OwnerAnimInstance->Montage_GetCurrentSection(UpperCutMontage), NextComboName, UpperCutMontage);
}void UUpperCut::HandleComboDamageEvent(FGameplayEventData EventData)
{if (K2_HasAuthority()){// 擊飛一下自己,免得掉下去了PushTarget(GetAvatarActorFromActorInfo(), FVector::UpVector * UpperComboHoldSpeed);// 獲取當前片段對應的傷害效果const FGenericDamageEffectDef* EffectDef = GetDamageEffectDefForCurrentCombo();if (!EffectDef){return;}int HitResultCount = UAbilitySystemBlueprintLibrary::GetDataCountFromTargetData(EventData.TargetData);for (int32 i = 0; i < HitResultCount; i++){FHitResult HitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(EventData.TargetData, i);// 計算推力方向(根據自身朝向變換推力向量)FVector PushVel = GetAvatarActorFromActorInfo()->GetActorTransform().TransformVector(EffectDef->PushVelocity);// 推動目標PushTarget(HitResult.GetActor(), PushVel);// 對目標應用傷害效果ApplyGameplayEffectToHitResultActor(HitResult, EffectDef->DamageEffect, GetAbilityLevel(CurrentSpecHandle, CurrentActorInfo));}}
}

最后在藍圖中設置一下

修正一下
在這里插入圖片描述
添加一些Combo以及End,還有傷害的傳遞
在這里插入圖片描述
創建Combo的GE,復制GE_UpperCut_Launch_Damage改一下數字
在這里插入圖片描述
以及最后擊的GE
在這里插入圖片描述
最后放進GA的Map里
在這里插入圖片描述
注釋掉這兩個,關閉運動似乎會讓尸體在空中滯留(不確定,反正這個也沒啥用了)
在這里插入圖片描述

升龍技能的完整代碼

// 幻雨喜歡小貓咪#pragma once#include "CoreMinimal.h"
#include "GAS/Core/CGameplayAbility.h"
#include "GAS/Core/CGameplayAbilityTypes.h"
#include "UpperCut.generated.h"/*** */
UCLASS()
class CRUNCH_API UUpperCut : public UCGameplayAbility
{GENERATED_BODY()
public:	UUpperCut();// TODO: 可能在這里添加手動結束任務的邏輯// virtual void K2_EndAbility() override;// 激活技能時調用virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
private:// 連招階段對應的傷害效果定義表UPROPERTY(EditDefaultsOnly, Category = "Combo")TMap<FName, FGenericDamageEffectDef> ComboDamageMap;// 上勾拳擊飛階段的傷害效果UPROPERTY(EditDefaultsOnly, Category = "Launch")TSubclassOf<UGameplayEffect> LaunchDamageEffect;// 上勾拳擊飛速度UPROPERTY(EditDefaultsOnly, Category = "Launch", meta = (DisplayName = "擊飛力的大小"))float UpperCutLaunchSpeed = 1000.f;// 空中連招的力UPROPERTY(EditDefaultsOnly, Category = "Launch")float UpperComboHoldSpeed = 100.f;// 上勾拳動畫MontageUPROPERTY(EditDefaultsOnly, Category = "Animation")TObjectPtr<UAnimMontage> UpperCutMontage;// 獲取當前連招階段的傷害效果定義const FGenericDamageEffectDef* GetDamageEffectDefForCurrentCombo() const;// 啟動擊飛效果UFUNCTION()void StartLaunching(FGameplayEventData EventData);// 處理連招階段切換事件UFUNCTION()void HandleComboChangeEvent(FGameplayEventData EventData);// 處理連招提交事件UFUNCTION()void HandleComboCommitEvent(FGameplayEventData EventData);// 處理連招傷害事件UFUNCTION()void HandleComboDamageEvent(FGameplayEventData EventData);// 下一個連招階段的名稱FName NextComboName;
};
// 幻雨喜歡小貓咪#include "UpperCut.h"#include "AbilitySystemBlueprintLibrary.h"
#include "Abilities/Tasks/AbilityTask_PlayMontageAndWait.h"
#include "Abilities/Tasks/AbilityTask_WaitGameplayEvent.h"
#include "GAS/Core/TGameplayTags.h"UUpperCut::UUpperCut()
{// 阻止帶有Ability_BasicAttack標簽的技能激活BlockAbilitiesWithTag.AddTag(TGameplayTags::Ability_BasicAttack);
}void UUpperCut::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{if (!K2_CommitAbility()){K2_EndAbility();return;}// 服務器執行if (HasAuthorityOrPredictionKey(ActorInfo, &ActivationInfo)){UAbilityTask_PlayMontageAndWait* PlayUpperCutMontageTask = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, NAME_None, UpperCutMontage);PlayUpperCutMontageTask->OnBlendOut.AddDynamic(this, &UUpperCut::K2_EndAbility);PlayUpperCutMontageTask->OnCancelled.AddDynamic(this, &UUpperCut::K2_EndAbility);PlayUpperCutMontageTask->OnCompleted.AddDynamic(this, &UUpperCut::K2_EndAbility);PlayUpperCutMontageTask->OnInterrupted.AddDynamic(this, &UUpperCut::K2_EndAbility);PlayUpperCutMontageTask->ReadyForActivation();UAbilityTask_WaitGameplayEvent* WaitLaunchEventTask = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Uppercut_Launch);WaitLaunchEventTask->EventReceived.AddDynamic(this, &UUpperCut::StartLaunching);WaitLaunchEventTask->ReadyForActivation();}NextComboName = NAME_None;
}const FGenericDamageEffectDef* UUpperCut::GetDamageEffectDefForCurrentCombo() const
{UAnimInstance* OwnerAnimInstance = GetOwnerAnimInstance();if (OwnerAnimInstance){// 獲取當前片段名稱FName CurrentComboName = OwnerAnimInstance->Montage_GetCurrentSection(UpperCutMontage);// 獲取當前片段對應的傷害效果const FGenericDamageEffectDef* EffectDef = ComboDamageMap.Find(CurrentComboName);if (EffectDef){return EffectDef;}}// 沒找到返回一個空結構return nullptr;
}void UUpperCut::StartLaunching(FGameplayEventData EventData)
{if (K2_HasAuthority()){// 推動自己向上PushTarget(GetAvatarActorFromActorInfo(), FVector::UpVector * UpperCutLaunchSpeed);// 獲取命中目標的數量int HitResultCount = UAbilitySystemBlueprintLibrary::GetDataCountFromTargetData(EventData.TargetData);// 對所有命中的目標執行擊飛和傷害for (int i = 0; i < HitResultCount; i++){FHitResult HitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(EventData.TargetData, i);PushTarget(HitResult.GetActor(), FVector::UpVector * UpperCutLaunchSpeed);ApplyGameplayEffectToHitResultActor(HitResult, LaunchDamageEffect, GetAbilityLevel(CurrentSpecHandle, CurrentActorInfo));}}// 監聽連招切換、提交、傷害等事件UAbilityTask_WaitGameplayEvent* WaitComboChangeEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Combo_Change, nullptr, false, false);WaitComboChangeEvent->EventReceived.AddDynamic(this, &UUpperCut::HandleComboChangeEvent);WaitComboChangeEvent->ReadyForActivation();UAbilityTask_WaitGameplayEvent* WaitComboCommitEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_BasicAttack_Pressed);WaitComboCommitEvent->EventReceived.AddDynamic(this, &UUpperCut::HandleComboCommitEvent);WaitComboCommitEvent->ReadyForActivation();UAbilityTask_WaitGameplayEvent* WaitComboDamageEvent = UAbilityTask_WaitGameplayEvent::WaitGameplayEvent(this, TGameplayTags::Ability_Combo_Damage);WaitComboDamageEvent->EventReceived.AddDynamic(this, &UUpperCut::HandleComboDamageEvent);WaitComboDamageEvent->ReadyForActivation();
}void UUpperCut::HandleComboChangeEvent(FGameplayEventData EventData)
{// 獲取事件標簽FGameplayTag EventTag = EventData.EventTag;if (EventTag == TGameplayTags::Ability_Combo_Change_End){// 下一個連招名稱置空NextComboName = NAME_None;UE_LOG(LogTemp, Warning, TEXT("清除連招"))return;}// 獲取下一個連段的名稱TArray<FName> TagNames;UGameplayTagsManager::Get().SplitGameplayTagFName(EventTag, TagNames);// Tag最后一段的名稱比如Combo02,03,04等NextComboName = TagNames.Last();UE_LOG(LogTemp, Warning, TEXT("下一個Combo:%s"), *NextComboName.ToString())
}void UUpperCut::HandleComboCommitEvent(FGameplayEventData EventData)
{// 按晚了if (NextComboName == NAME_None) return;UAnimInstance* OwnerAnimInstance = GetOwnerAnimInstance();if (!OwnerAnimInstance) return;OwnerAnimInstance->Montage_SetNextSection(OwnerAnimInstance->Montage_GetCurrentSection(UpperCutMontage), NextComboName, UpperCutMontage);UE_LOG(LogTemp, Warning, TEXT("觸發連招:%s"), *NextComboName.ToString())
}void UUpperCut::HandleComboDamageEvent(FGameplayEventData EventData)
{if (K2_HasAuthority()){// 擊飛一下自己,免得掉下去了PushTarget(GetAvatarActorFromActorInfo(), FVector::UpVector * UpperComboHoldSpeed);// 獲取當前片段對應的傷害效果const FGenericDamageEffectDef* EffectDef = GetDamageEffectDefForCurrentCombo();if (!EffectDef){return;}int HitResultCount = UAbilitySystemBlueprintLibrary::GetDataCountFromTargetData(EventData.TargetData);for (int32 i = 0; i < HitResultCount; i++){FHitResult HitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(EventData.TargetData, i);// 計算推力方向(根據自身朝向變換推力向量)FVector PushVel = GetAvatarActorFromActorInfo()->GetActorTransform().TransformVector(EffectDef->PushVelocity);// 推動目標PushTarget(HitResult.GetActor(), PushVel);// 對目標應用傷害效果ApplyGameplayEffectToHitResultActor(HitResult, EffectDef->DamageEffect, GetAbilityLevel(CurrentSpecHandle, CurrentActorInfo));}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88878.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于光柵傳感器+FPGA+ARM的測量控制解決方案

基于光柵傳感器結合FPGA與ARM的測量控制解決方案&#xff0c;通過硬件協同分工實現高精度、實時性及多場景適應性&#xff1a;?? ?一、系統架構分工??傳感層&#xff08;光柵傳感器&#xff09;?采用光柵尺輸出正交脈沖信號&#xff0c;分辨率達0.5μm&#xff0c;精度1μ…

NW831NW910美光固態閃存NW887NW888

美光固態閃存深度解析&#xff1a;NW831、NW910、NW887、NW888系列全方位評測一、技術根基與架構創新美光NW系列固態閃存的技術突破源于其先進的G9 NAND架構&#xff0c;該架構采用5納米制程工藝和多層3D堆疊技術&#xff0c;在單位面積內實現了高達256層的存儲單元堆疊&#x…

reasense api 文檔

API 架構 英特爾實感&#xff08;Intel RealSense?&#xff09;API 提供對深度攝像頭流數據的配置、控制和訪問功能。該 API 支持通過高層級 API 快速啟用攝像頭基礎功能&#xff0c;或通過底層級 API 全面控制所有攝像頭設置。請根據需求選擇合適的 API&#xff1a; 高層級 P…

ArkTs實現骰子布局

Entry Component struct workA {// 定義6種顏色數組&#xff0c;使用ResourceColor類型確保顏色值合法性State color: ResourceColor[] [#ef2816, #f0a200, #6ab002, #005868, #41192e, #141411]// 定義公共樣式裝飾器&#xff0c;避免重復樣式代碼Stylesys() {// 白色圓形基礎…

c語言內存函數以及數據在內存中的存儲

代碼見&#xff1a;登錄 - Gitee.com 1. memcpy使用和模擬實現 strcpy&#xff0c;strncpy是拷貝字符串的&#xff0c;有局限性 函數原型&#xff1a; void * memcpy ( void * destination, const void * source, size_t num ); 功能&#xff1a; memcpy 是完成內存塊拷?的…

Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)

Codeforces Round 787 (Div. 3) - Codeforces A. Food for Animals 題意 有a袋狗糧,b袋貓糧,c袋通用糧食&#xff0c;問現在有x只狗y只貓,每一個動物都要吃一袋糧食,問糧食夠不夠吃 思路 首先肯定考慮貓吃貓糧&#xff0c;狗吃狗糧。然后再考慮如果不夠吃的話才會去吃通用…

LLaMA-Factory的webui快速入門

一、webui的啟動方式 LLaMA-Factory 支持通過 WebUI 零代碼微調大語言模型。 在完成安裝 后&#xff0c;您可以通過以下指令進入 WebUI: llamafactory-cli webui 使用上面命令啟動服務后&#xff0c;即可使用默認7860端口進行訪問。訪問地址&#xff1a;http://ip:7860,截止…

【第四節】ubuntu server安裝docker

首先更新軟件源 sudo apt update sudo apt upgrade安裝docker 下載 Docker 官方 GPG 密鑰 # 1. 下載 Docker 官方 GPG 密鑰 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg再次更新軟件源…

Kubernetes的微服務

用控制器來完成集群的工作負載&#xff0c;那么應用如何暴漏出去&#xff1f;需要通過微服務暴漏出去后才能被訪問Service是一組提供相同服務的Pod對外開放的接口。借助Service&#xff0c;應用可以實現服務發現和負載均衡。service默認只支持4層負載均衡能力&#xff0c;沒有7…

退出登錄后頭像還在?這個緩存問題坑過多少前端!

目錄 1. 為什么退出登錄后頭像還在&#xff1f; ① 緩存沒清理干凈 ② 頭像URL沒更新 ③ 后端會話失效&#xff0c;但靜態資源可訪問 2. 怎么解決&#xff1f;5種常見方案 ? 方案1&#xff1a;強制刷新頁面&#xff08;簡單粗暴&#xff09; ? 方案2&#xff1a;給頭像…

Windows下白嫖ClaudeCode

我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 兄弟們&#xff0c;交個朋友啊&#xff01;一定要用我的呀&#xff0…

windows在anaconda中下載安裝fasttext

windows在anaconda中下載安裝fasttext 1.訪問fasttext-wheel&#xff0c;點擊對應鏈接&#xff0c;下載對應Python版本、操作系統類型 的.whl文件&#xff1a; 鏈接地址&#xff1a;https://pypi.org/project/fasttext-wheel/#files 打開anaconda終端&#xff0c;切換到上面的…

mysql5.7系列-索引下推(cover_index)

什么是索引下推 ICP&#xff08;Index Condition Pushdown&#xff09;是在MySQL 5.6版本上推出的查詢優化策略&#xff0c;把本來由Server層做的索引條件檢查下推給存儲引擎層來做&#xff0c;以降低回表和訪問存儲引擎的次數&#xff0c;提高查詢效率。 回顧下mysql的架構分…

計算機網絡(基礎概念)

計算機網絡&#xff08;基礎概念&#xff09;1 初識協議1.1 協議分層2 OSI七層模型2.1 物理層2.2 數據鏈路層2.3 網絡層2.4 傳輸層2.5 應用層3 TCP/IP協議族3.1 什么是TCP/IP協議?3.1.1 OS與網絡關系4 網絡傳輸的基本流程4.1 局域網4.2 MAC地址5 跨網絡傳輸5.1 IP地址6 Socket…

專題 JavaScript 函數基礎

你將知道&#xff1a;函數聲明和表達式函數聲明和表達式之間的區別什么是匿名函數什么是 IIFE命名函數表達式this 關鍵字函數是調用該函數時執行的代碼塊 。函數聲明和表達式讓我們回顧一下它的語法&#xff1a;functionfunctionName(param1, param2, ..., paramN) {// Functio…

數據結構——優先隊列(priority_queue)的巧妙運用

優先隊列是一種相對高級的數據結構&#xff0c;它的底層原理是二叉堆。然而本篇不會執著于深挖其背后的原理&#xff0c;更主要的是理一下它在題目中的一些實用方法&#xff0c;幫助你更快的上手使用。 優先隊列(priority_queue) 優先隊列的特別之處就在于它可以自動進行排序&…

Java:繼承和多態(必會知識點整理)

主要內容繼承多態向上轉型向下轉型方法重寫方法重載super關鍵字動態綁定封裝訪問控制構造方法規則一、繼承 1. 概念&#xff1a; 一句話說就是&#xff1a;“共性抽取&#xff0c;代碼復用”子類會將父類中的成員變量或者成員方法繼承到子類中子類繼承父類之后&#xff0c;必須…

基于esp32系列的開源無線dap-link項目使用介紹

基于esp32系列的開源無線dap-link項目使用介紹&#x1f516;有關esp32/8266相關項目&#xff1a;需要自己搭建編譯環境&#xff1a; https://github.com/windowsair/wireless-esp8266-dap/tree/master&#x1f33f;支持esp32/c3/s3,支持在線固件燒錄&#xff0c;支持AP配網&…

深入了解linux系統—— 進程信號的產生

前言 進程在收到信號之后&#xff0c;可以立即處理&#xff0c;也可以在合適的時間再處理&#xff08;1-31號普通信號可以不被立即處理&#xff09; 信號不是被立即處理&#xff0c;信號就要被保存下來&#xff0c;讓進程在合適的時間再去處理。 相關概念 在了解進程是如何保存…

【Bluedroid】藍牙協議棧enable流程深度解析

本文詳細剖析 Bluedroid 藍牙功能啟用的核心流程&#xff0c;從enable()函數觸發開始&#xff0c;深入解析藍牙協議棧的異步啟動機制、核心協議模塊初始化、硬件控制器綁定及狀態同步全流程。重點闡述接口就緒性檢查、異步線程管理、配置文件回調機制等關鍵環節&#xff0c;揭示…