UE5多人MOBA+GAS 18、用對象池來設置小兵的隊伍的生成,為小兵設置一個目標從己方出生點攻打對方出生點,優化小兵的血條UI

文章目錄

  • 根據小兵隊伍更換小兵的皮膚
  • 管理小兵的生成
    • 使用對象池來管理小兵的生成
  • 為小兵設置一個目標
  • 小兵生成完整代碼
  • 調整一下小兵的UI


根據小兵隊伍更換小兵的皮膚

懶得開UE了,增加一個Minion類繼承基類角色CCharacter
在這里插入圖片描述

// 幻雨喜歡小貓咪#pragma once#include "CoreMinimal.h"
#include "Character/CCharacter.h"
#include "Minion.generated.h"/*** 小兵AI角色類,繼承自ACCharacter* 負責小兵的隊伍分配、激活狀態、目標設置、皮膚切換等功能*/
UCLASS()
class CRUNCH_API AMinion : public ACCharacter
{GENERATED_BODY()public:virtual void SetGenericTeamId(const FGenericTeamId& NewTeamId) override;
private:// 根據隊伍ID切換小兵皮膚void PickSkinBasedOnTeamID();// 隊伍ID同步時回調(用于網絡同步后自動切換皮膚等)virtual void OnRep_TeamID() override;// 隊伍ID到對應皮膚的映射表UPROPERTY(EditDefaultsOnly, Category = "Visual")TMap<FGenericTeamId, TObjectPtr<USkeletalMesh>> SkinMap;
};
// 幻雨喜歡小貓咪#include "Minion.h"void AMinion::SetGenericTeamId(const FGenericTeamId& NewTeamId)
{Super::SetGenericTeamId(NewTeamId);PickSkinBasedOnTeamID();
}void AMinion::PickSkinBasedOnTeamID()
{TObjectPtr<USkeletalMesh>* Skin = SkinMap.Find(GetGenericTeamId());if (Skin){GetMesh()->SetSkeletalMesh(*Skin);}
}void AMinion::OnRep_TeamID()
{PickSkinBasedOnTeamID();
}

打開小兵角色藍圖,修改父類
在這里插入圖片描述
設置一下皮膚
在這里插入圖片描述
換一個原始皮膚
在這里插入圖片描述

管理小兵的生成

繼承Actor,命名為MinionBarrack,用來管理小兵的生成
在這里插入圖片描述
在這里插入圖片描述

// 幻雨喜歡小貓咪#pragma once#include "CoreMinimal.h"
#include "GenericTeamAgentInterface.h"
#include "Minion.h"
#include "GameFramework/Actor.h"
#include "MinionBarrack.generated.h"/*** 小兵兵營類,負責批量生成和管理小兵* 支持隊伍分配、目標設置、定時批量生成等功能*/
UCLASS()
class AMinionBarrack : public AActor
{GENERATED_BODY()public:	AMinionBarrack();protected:virtual void BeginPlay() override;public:	virtual void Tick(float DeltaTime) override;private:// 兵營所屬隊伍IDUPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "隊伍ID"))FGenericTeamId BarrackTeamId;// 每組小兵生成的數量UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "每組小兵生成的數量"))int32 MinionPerGroup = 3;// 兵營的生成間隔UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "小兵生成間隔"))float GroupSpawnInterval = 5.f;// 小兵對象池UPROPERTY()TArray<TObjectPtr<AMinion>> MinionPool;// 小兵的目標點(如推進目標)UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "小兵的目標點"))TObjectPtr<AActor> Goal;// 小兵的類(用于生成小兵實例)UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "小兵的類"))TSubclassOf<AMinion> MinionClass;// 生成小兵的出生點列表UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "生成小兵的出生點列表"))TArray<APlayerStart*> SpawnSpots;// 下一個出生點索引int32 NextSpawnSpotIndex = -1;// 獲取下一個出生點(輪流分配)const APlayerStart* GetNextSpawnSpot();// 生成指定數量新小兵void SpawnNewMinions(int Amt);};

void AMinionBarrack::BeginPlay()
{Super::BeginPlay();// 測試用SpawnNewMinions(5);
}const APlayerStart* AMinionBarrack::GetNextSpawnSpot()
{if (SpawnSpots.Num() == 0) return nullptr;++NextSpawnSpotIndex;if (NextSpawnSpotIndex >= SpawnSpots.Num()){NextSpawnSpotIndex = 0;}// 返回出生點return SpawnSpots[NextSpawnSpotIndex];
}void AMinionBarrack::SpawnNewMinions(int Amt)
{if (Amt <= 0) return;for (int32 i = 0; i < Amt; ++i){// 獲取出生點變換FTransform SpawnTransform = GetActorTransform();// 獲取下一個出生點if (const APlayerStart* NextSpawnSpot = GetNextSpawnSpot()){SpawnTransform = NextSpawnSpot->GetActorTransform();}// 生成小兵AMinion* NewMinion = GetWorld()->SpawnActorDeferred<AMinion>(MinionClass, SpawnTransform, this, nullptr, ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn);// 設置小兵的隊伍IDNewMinion->SetGenericTeamId(BarrackTeamId);// 完成小兵的生成NewMinion->FinishSpawning(SpawnTransform);// NewMinion->SetGoal(Goal);// 添加小兵到小兵池中MinionPool.Add(NewMinion);}
}

在這里插入圖片描述

放到場景中點擊吸管再點擊這個場景的出生點,來出生
在這里插入圖片描述
然后你會發現怪疊了兩層,應該是服務器和客戶端都生成了,在生成處加個權威
在這里插入圖片描述

使用對象池來管理小兵的生成

在角色基類CCharacter中添加判斷死亡函數和移除死亡標簽函數

#pragma region 死亡和復活 (Death and Respawn)
public:bool IsDead() const;void RespawnImmediately();
private:
#pragma endregion
bool ACCharacter::IsDead() const
{return GetAbilitySystemComponent()->HasMatchingGameplayTag(TGameplayTags::Stats_Dead);
}void ACCharacter::RespawnImmediately()
{// 僅在服務器上執行:移除所有帶有“死亡”標簽的激活效果,實現立即復活if (HasAuthority()){GetAbilitySystemComponent()->RemoveActiveEffectsWithGrantedTags(FGameplayTagContainer(TGameplayTags::Stats_Dead));}
}void ACCharacter::DeathMontageFinished()
{if (IsDead()){SetRagdollEnabled(true);}
}

到小兵角色類中添加判斷小兵是否激活的函數

public:// 判斷小兵是否處于激活狀態bool IsActive() const;// 激活小兵(如復活、生成時調用)void Activate();
bool AMinion::IsActive() const
{return !IsDead();
}void AMinion::Activate()
{// 移除死亡標簽,復活RespawnImmediately();
}
UCLASS()
class AMinionBarrack : public AActor
{GENERATED_BODY()
private:// 生成一組小兵(優先用對象池)void SpawnNewGroup();// 從池中獲取可用小兵AMinion* GetNextAvailableMinion() const;// 生成組的定時器句柄FTimerHandle SpawnIntervalTimerHandle;
};
void AMinionBarrack::BeginPlay()
{Super::BeginPlay();// 僅在服務器上定時生成小兵if (HasAuthority()){// 設置定時器,定時批量生成小兵GetWorldTimerManager().SetTimer(SpawnIntervalTimerHandle, this, &AMinionBarrack::SpawnNewGroup, GroupSpawnInterval, true);}
}void AMinionBarrack::SpawnNewGroup()
{// 需要生成的小兵數量int32 i = MinionPerGroup;while (i > 0){// 獲取出生點變換FTransform SpawnTransform = GetActorTransform();// 獲取下一個出生點if (const APlayerStart* NextSpawnSpot = GetNextSpawnSpot()){SpawnTransform = NextSpawnSpot->GetActorTransform();}// 優先復用對象池中的非激活小兵AMinion* NextAvailableMinion = GetNextAvailableMinion();// 對象池內沒有可以用的小兵了就退出循環,生成一個新的小兵if (!NextAvailableMinion) break;NextAvailableMinion->SetActorTransform(SpawnTransform);NextAvailableMinion->Activate();--i;}// 如果對象池不夠,則新建剩余數量的小兵SpawnNewMinions(i);
}AMinion* AMinionBarrack::GetNextAvailableMinion() const
{for (AMinion* Minion : MinionPool){if (!Minion->IsActive()){return Minion;}}return nullptr;
}

想必以及發現了AI小兵的顏色跟自己設置的隊伍顏色有點不對勁了吧,在AI控制器那里,已經強行設置了一個隊伍ID.

void ACAIController::OnPossess(APawn* InPawn)
{Super::OnPossess(InPawn);IGenericTeamAgentInterface* PawnTeamInterface = Cast<IGenericTeamAgentInterface>(InPawn);if (PawnTeamInterface){SetGenericTeamId(PawnTeamInterface->GetGenericTeamId());ClearAndDisableAllSenses();EnableAllSenses();}UAbilitySystemComponent* PawnASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(InPawn);if (PawnASC){PawnASC->RegisterGameplayTagEvent(TGameplayTags::Stats_Dead, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &ACAIController::PawnDeadTagUpdated);}
}

創建一個持續時間為無限的死亡GE
在這里插入圖片描述
把他給小兵用上
在這里插入圖片描述
打死小兵之后的尸體消失,就是在對象池中復活了。

為小兵設置一個目標

public:// 設置小兵的目標(如推進目標、攻擊目標等)void SetGoal(AActor* Goal);
private:// 黑板中用于存儲目標的Key名UPROPERTY(EditDefaultsOnly, Category = "AI")FName GoalBlackboardKeyName = "Goal";
void AMinion::SetGoal(AActor* Goal)
{if (AAIController* AIController = GetController<AAIController>()){if (UBlackboardComponent* BlackboardComponent = AIController->GetBlackboardComponent()){// 修改黑板組件中對應鍵目標的值BlackboardComponent->SetValueAsObject(GoalBlackboardKeyName, Goal);}}
}

創建小兵的時候為其設置該鍵的值

void AMinionBarrack::SpawnNewMinions(int Amt)
{if (Amt <= 0) return;for (int32 i = 0; i < Amt; ++i){// 獲取出生點變換FTransform SpawnTransform = GetActorTransform();// 獲取下一個出生點if (const APlayerStart* NextSpawnSpot = GetNextSpawnSpot()){SpawnTransform = NextSpawnSpot->GetActorTransform();}// 生成小兵AMinion* NewMinion = GetWorld()->SpawnActorDeferred<AMinion>(MinionClass, SpawnTransform, this, nullptr, ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn);// 設置小兵的隊伍IDNewMinion->SetGenericTeamId(BarrackTeamId);// 完成小兵的生成NewMinion->FinishSpawning(SpawnTransform);// 設置小兵的目標NewMinion->SetGoal(Goal);// 添加小兵到小兵池中MinionPool.Add(NewMinion);}
}

到黑板中創建該健
在這里插入圖片描述
可以讓AI走向設定的目標
在這里插入圖片描述
添加黑板裝飾器
在這里插入圖片描述
在值改變的時候就會重啟行為樹,不去追擊設定的目標,轉來打發現的敵人
在這里插入圖片描述

目標跟小兵出生點一點,通過吸管吸取場景的物品
在這里插入圖片描述
小兵發現你后就會來打你了
在這里插入圖片描述

小兵生成完整代碼

// 幻雨喜歡小貓咪#pragma once#include "CoreMinimal.h"
#include "GenericTeamAgentInterface.h"
#include "Minion.h"
#include "GameFramework/Actor.h"
#include "MinionBarrack.generated.h"/*** 小兵兵營類,負責批量生成和管理小兵* 支持隊伍分配、目標設置、定時批量生成等功能*/
UCLASS()
class AMinionBarrack : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesAMinionBarrack();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;private:// 兵營所屬隊伍IDUPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "隊伍ID"))FGenericTeamId BarrackTeamId;// 每組小兵生成的數量UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "每組小兵生成的數量"))int32 MinionPerGroup = 5;// 兵營的生成間隔UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "小兵生成間隔"))float GroupSpawnInterval = 15.f;// 小兵對象池UPROPERTY()TArray<TObjectPtr<AMinion>> MinionPool;// 小兵的目標點(如推進目標)UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "小兵的目標點"))TObjectPtr<AActor> Goal;// 小兵的類(用于生成小兵實例)UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "小兵的類"))TSubclassOf<AMinion> MinionClass;// 生成小兵的出生點列表UPROPERTY(EditAnywhere, Category = "Spawn", meta = (DisplayName = "生成小兵的出生點列表"))TArray<APlayerStart*> SpawnSpots;// 下一個出生點索引int32 NextSpawnSpotIndex = -1;// 獲取下一個出生點(輪流分配)const APlayerStart* GetNextSpawnSpot();// 生成一組小兵(優先用對象池)void SpawnNewGroup();// 生成指定數量新小兵void SpawnNewMinions(int Amt);// 從池中獲取可用小兵AMinion* GetNextAvailableMinion() const;// 生成組的定時器句柄FTimerHandle SpawnIntervalTimerHandle;
};
// 幻雨喜歡小貓咪#include "AI/MinionBarrack.h"#include "GameFramework/PlayerStart.h"// Sets default values
AMinionBarrack::AMinionBarrack()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawned
void AMinionBarrack::BeginPlay()
{Super::BeginPlay();// 僅在服務器上定時生成小兵if (HasAuthority()){// 設置定時器,定時批量生成小兵GetWorldTimerManager().SetTimer(SpawnIntervalTimerHandle, this, &AMinionBarrack::SpawnNewGroup, GroupSpawnInterval, true);}
}// Called every frame
void AMinionBarrack::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}const APlayerStart* AMinionBarrack::GetNextSpawnSpot()
{if (SpawnSpots.Num() == 0) return nullptr;++NextSpawnSpotIndex;if (NextSpawnSpotIndex >= SpawnSpots.Num()){NextSpawnSpotIndex = 0;}// 返回出生點return SpawnSpots[NextSpawnSpotIndex];
}void AMinionBarrack::SpawnNewGroup()
{// 需要生成的小兵數量int32 i = MinionPerGroup;while (i > 0){// 獲取出生點變換FTransform SpawnTransform = GetActorTransform();// 獲取下一個出生點if (const APlayerStart* NextSpawnSpot = GetNextSpawnSpot()){SpawnTransform = NextSpawnSpot->GetActorTransform();}// 優先復用對象池中的非激活小兵AMinion* NextAvailableMinion = GetNextAvailableMinion();// 對象池內沒有可以用的小兵了就退出循環,生成一個新的小兵if (!NextAvailableMinion) break;NextAvailableMinion->SetActorTransform(SpawnTransform);NextAvailableMinion->Activate();--i;}// 如果對象池不夠,則新建剩余數量的小兵SpawnNewMinions(i);
}void AMinionBarrack::SpawnNewMinions(int Amt)
{if (Amt <= 0) return;for (int32 i = 0; i < Amt; ++i){// 獲取出生點變換FTransform SpawnTransform = GetActorTransform();// 獲取下一個出生點if (const APlayerStart* NextSpawnSpot = GetNextSpawnSpot()){SpawnTransform = NextSpawnSpot->GetActorTransform();}// 生成小兵AMinion* NewMinion = GetWorld()->SpawnActorDeferred<AMinion>(MinionClass, SpawnTransform, this, nullptr, ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn);// 設置小兵的隊伍IDNewMinion->SetGenericTeamId(BarrackTeamId);// 完成小兵的生成NewMinion->FinishSpawning(SpawnTransform);// 設置小兵的目標NewMinion->SetGoal(Goal);// 添加小兵到小兵池中MinionPool.Add(NewMinion);}
}AMinion* AMinionBarrack::GetNextAvailableMinion() const
{for (AMinion* Minion : MinionPool){if (!Minion->IsActive()){return Minion;}}return nullptr;
}

調整一下小兵的UI

	// 數值文本字體UPROPERTY(EditAnywhere, Category = "Visual")FSlateFontInfo ValueTextFont;// 是否顯示數值文本UPROPERTY(EditAnywhere, Category = "Visual")bool bValueTextVisible = true;// 是否顯示進度條UPROPERTY(EditAnywhere, Category = "Visual")bool bProgressBarVisible = true;
void UValueGauge::NativePreConstruct()
{Super::NativePreConstruct();// 設置進度條顏色ProgressBar->SetFillColorAndOpacity(BarColor);ValueText->SetFont(ValueTextFont);ValueText->SetVisibility(bValueTextVisible ? ESlateVisibility::Visible : ESlateVisibility::Hidden);ProgressBar->SetVisibility(bProgressBarVisible ? ESlateVisibility::Visible : ESlateVisibility::Hidden);
}

設置字體
在這里插入圖片描述
復制原本的頭部ui,關閉藍條的字體和進度條顯示
在這里插入圖片描述
關于大小的調整
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

Clojure持久化數據結構的底層實現

文章目錄一、Clojure的持久化數據結構二、向量(Vector)/Map的底層結構?1. HAMT 哈希數組映射字典樹&#xff08;1&#xff09;簡介&#xff08;2&#xff09;HAMT 的核心思想&#xff08;3&#xff09;HAMT 的結構?a. 基本組成?b. 樹的分支因子?&#xff08;4&#xff09;H…

面試150 二叉樹展開為鏈表

思路 思路:使用列表存儲先序遍歷的相關節點。然后遍歷列表&#xff0c;分別獲取前驅節點和當前節點,將前驅節點的左指針指向空&#xff0c;前驅節點的右指針指向當前節點。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, …

代碼隨想錄算法訓練營第十七天

目錄 LeetCode.654 最大二叉樹 題目鏈接 最大二叉樹 題解 解題思路 LeetCode.617 合并二叉樹 題目鏈接 合并二叉樹 題解 解題思路 LeetCode.700 二叉搜索樹中的搜索 題目鏈接 二叉搜索樹中的搜索 題解 解題思路 解題思路 LeetCode.98 驗證二叉搜索樹 題目鏈接 驗…

pycharm無法識別pip安裝的包

在使用conda創建一個新的環境后&#xff0c;有些包通過pip的方式安裝更方便有效&#xff0c;若在pip安裝后&#xff0c;遇到該環境沒有此包&#xff0c;或pycharm監測不到此包&#xff0c;通常是pip的環境指向有問題。 解決措施&#xff1a; # 首先檢查當前pip的指向 which pip…

Elasticsearch 的 `modules` 目錄

Elasticsearch 的 modules 目錄是存放**核心功能模塊**的目錄&#xff0c;這些模塊是 Elasticsearch 運行所必需的基礎組件&#xff0c;**隨官方發行版一起提供**&#xff0c;但設計上允許通過移除或替換模塊來**定制化部署**&#xff08;比如構建一個最小化的 Elasticsearch 實…

https——TCP+TLS

https——TCPTLS主題&#xff1a;基于mbedtls-2.16.0&#xff0c;驗證TLS會話復用功能驗證環境&#xff1a;1.TLS服務端2.TLS客戶端2.1 基于Sesssion ID2.1.1mbedtls-2.16.0庫的宏配置2.1.2 初始化配置2.1.3 TCP連接2.1.4 首次TLS連接2.1.4.1 發送加密算法列表2.1.4.2 選擇加密…

uni-app uni-push 2.0推送圖標不展示問題

問題現象&#xff1a;我在uni-app的配置文件&#xff0c;配置了推送的大圖標小圖標發現在真機測試無法展示配置的推送圖標問題 官網文檔&#xff1a;開通 | uni-app官網 解決方法&#xff1a; 在uni-app官網中說的并不是很清楚只給了一個簡單的示例&#xff0c;配置并沒有告訴我…

scp:上傳大型數據集到實驗室服務器

我通過百度網盤下載了大概200GB的LUNA-2016的肺結節CT數據。實驗是在實驗室服務器上進行的&#xff0c;我現在需要將本地的數據集傳輸到實驗室的服務器上。我已經通過remote-ssh連接上了實驗室的服務器&#xff0c;但是如果通過這個插件上傳數據的話&#xff0c;一方面不支持上…

量子計算突破:8比特擴散模型實現指數級加速

目錄 一、量子擴散模型&#xff08;Quantum Diffusion&#xff09; 二、DNA存儲生成&#xff08;Biological-GAN&#xff09; 三、光子計算加速 四、神經形態生成 五、引力場渲染 六、分子級生成 七、星際生成網絡 八、元生成系統 極限挑戰方向 一、量子擴散模型&…

Flask3.1打造極簡CMS系統

基于Flask 3.1和Python 3.13的簡易CMS以下是一個基于Flask 3.1和Python 3.13的簡易CMS管理系統實現方案&#xff0c;包含核心功能和可運行代碼示例。環境準備安裝Flask和其他依賴庫&#xff1a;pip install flask3.1.0 flask-sqlalchemy flask-login配置數據庫在config.py中設置…

用 Node.js 構建模塊化的 CLI 腳手架工具,從 GitHub 下載遠程模板

本文將手把手帶你構建一個支持遠程模板下載、自定義項目名稱&#xff0c;并完成模塊化拆分的 CLI 腳手架工具&#xff0c;適用于初創項目、團隊內部工具或者開源項目快速初始化。&#x1f9e9; 為什么要自己造一個 CLI 腳手架&#xff1f; 在日常開發中&#xff0c;我們常用腳手…

08.如何正確關閉文件

如何正確關閉文件(File Handling Best Practices) 文件操作是日常開發中非常常見的任務,正確關閉文件對于避免資源泄漏尤為關鍵。錯誤的文件關閉方式可能導致文件未保存、鎖定或其他異常。 1. 常見的錯誤方式:手動 close() 許多初學者會手動調用 close() 關閉文件,這在異…

算法入門--動態規劃(C++)

深入淺出掌握動態規劃核心思想&#xff0c;圖文并茂實戰代碼 什么是動態規劃&#xff1f; 動態規劃&#xff08;Dynamic Programming, DP&#xff09; 是一種高效解決多階段決策問題的方法。它通過將復雜問題分解為重疊子問題&#xff0c;并存儲子問題的解&#xff08;避免重…

[2025CVPR]GNN-ViTCap:用于病理圖像分類與描述模型

論文結構解析? 本文采用經典學術論文結構: ?引言?:闡述病理圖像分析的挑戰與現有方法局限性?相關工作?:系統梳理MIL、視覺語言預訓練和生物醫學語言模型三大領域?方法?:詳細闡述GNN-ViTCap四階段架構?實驗?:在BreakHis和PatchGastric數據集驗證性能?討論?:通…

Java SE--圖書管理系統模擬實現

一.設計思路首先這個系統可以由倆種用戶使用&#xff0c;分別為管理者用戶和普通者用戶&#xff0c;根據不同的用戶有不同的界面&#xff0c;每個界面有不同的功能。二.代碼實現創建三個包和一個類book包&#xff1a;包括Book類和Booklist類Book類&#xff1a;package book; pu…

[RPA] 批量數據抓取指定商品名稱信息

影刀RPA案例&#xff1a;批量數據抓取指定商品名稱信息流程圖&#xff1a;操作步驟&#xff1a;涉及的影刀RPA大致指令&#xff1a; 1. 打開影刀商城頁面 2. 使用【填寫輸入框(web)】指令輸入用戶名和密碼&#xff0c;并點擊"登錄"按鈕 3. 切換到"訂單管理"…

我的世界Java版1.21.4的Fabric模組開發教程(十四)方塊實體

這是適用于Minecraft Java版1.21.4的Fabric模組開發系列教程專欄第十四章——方塊實體。想要閱讀其他內容&#xff0c;請查看或訂閱上面的專欄。 方塊實體(Block Entity) 指的是一種用于存儲方塊額外數據的方法。但這種數據和為了控制方塊狀態而在自定義方塊類中創建的屬性不太…

【UE教程/進階】UE中的指針與引用

目錄直接屬性引用共享指針 TSharedPtr實現原理共享引用 TSharedRef弱引用指針 TWeakPtrObject弱指針 FWeakPtr實現原理Object軟指針 FSoftObjectPtr原理直接屬性引用 在c通過UPROPERTY()宏將屬性公開&#xff0c;藍圖中屬性類型中的Object Reference。 對一個類型及其子類型的…

早期 CNN 的經典模型—卷積神經網絡(LeNet)

目錄 LeNet 的設計背景與目標 LeNet 的網絡結構&#xff08;經典 LeNet-5&#xff09; 局部感受野詳解 一、局部感受野和全連接網絡的區別 1. 傳統全連接網絡的問題 2. 局部感受野的解決方案 二、局部感受野的優勢 1. 參數大幅減少 2. 提取局部特征 3. 平移不變性 參數…

RabbitMQ 高級特性之延遲隊列

1. 簡介 在某些場景下&#xff0c;當生產者發送消息后&#xff0c;可能不需要讓消費者立即接收到&#xff0c;而是讓消息延遲一段時間后再發送給消費者。 2. 實現方式 2.1 TTL 死信隊列 給消息設置過期時間后&#xff0c;若消息在這段時間內沒有被消費&#xff0c;就會將消…