UnrealEngine5游戲引擎實踐(C++)

目錄

目錄

目錄

Unreal Engine 是什么?

Unreal Engine 5 簡介

核心技術特性

應用場景擴展

兼容性與生態系統

Unreal Engine安裝

下載 Epic Games Launcher

啟動 Unreal Engine

選擇安裝版本和路徑

選擇組件

開始安裝

驗證安裝

配置項目模板(可選)

更新和插件管理

UE游戲引擎

動作捕捉與動畫系統

程序化生成與AI技術

物理與破壞系統

音頻與本地化技術

性能優化

導入靜態網格體

材質實例創建與批量調整

材質參數動態控制技巧

性能優化策略

基礎框架與對象管理

游戲邏輯系統

物理與碰撞

UI與交互

高渲染技術

網絡與多人游戲

性能優化

C++與Unreal Engine 5結合

基礎框架與對象管理

游戲邏輯系統

物理與碰撞

UI與交互

高級渲染技術

網絡與多人游戲

性能優化

動態光源布置基礎

批量生成動態光源

光源動態更新與控制

性能優化策略

調試與驗證

參考資源

C++ 角色移動控制實例

基礎2D角色移動

使用鍵盤輸入控制移動

帶邊界檢測的移動

基于時間的平滑移動

使用SDL庫的2D角色控制

基于網格的移動系統

帶加速度的運動

使用狀態模式的移動控制

基于組件的移動系統

基于路徑點的移動

Unreal Engine 5

基礎門類實現

開關門實例

自動門實例

密碼門實例

定時門實例

多重驗證門實例

聲控門實例

網絡控制門實例

生物識別門實例

物品拾取系統核心實現

物體交互邏輯實現

完整工作流程示例

性能優化技巧

庫存UI展示方法

物品類型枚舉

事件驅動拾取方案

數據持久化實現

網絡同步方案

基于C++設計簡易UI血量條

使用ASCII字符繪制血量條(終端)

使用Windows API(GDI)

使用SFML庫

使用OpenGL(現代)

使用Qt框架

使用Unreal Engine(UMG)

使用ImGUI庫

使用SDL2庫

使用文本文件持久化

使用Curses庫(跨平臺終端)

敵人AI巡邏邏輯實例

基礎巡邏邏輯

帶隨機路徑的巡邏

帶視覺檢測的巡邏

帶休息時間的巡邏

帶環境交互的巡邏

動態調整路徑的巡邏

帶速度變化的巡邏

帶警戒狀態的巡邏

帶時間限制的巡邏

帶分組協調的巡邏

基于C++動態水面材質

基礎正弦波水面

多正弦波疊加

基于距離的波浪衰減

法線擾動增強

頂點著色器動態計算

基于C++開發玻璃折射材質

光線追蹤基礎玻璃材質

OpenGL著色器實現

DirectX 12玻璃材質管線

基于物理的渲染(PBR)玻璃

Unreal Engine玻璃材質藍圖

Unity HDRP玻璃著色器

Vulkan光線追蹤玻璃

C++ 玻璃折射材質開發基礎

光線追蹤中的玻璃材質實現

實時渲染中的玻璃效果(OpenGL/DirectX)

基于物理的玻璃材質優化

常見引擎集成

溶解效果材質基礎原理

噪聲生成算法實現

材質著色器中的Clip操作

動態控制溶解進度

進階溶解效果實現

多噪聲層混合

對象空間溶解效果

溶解方向控制

粒子系統配合

溶解動畫曲線

材質實例管理

實現Parallax Occlusion Mapping (POM)的基礎概念

基礎代碼框架

關鍵參數優化

實例的批量渲染優化

動態LOD控制

性能對比數據

高級變體:陡峭視差映射

錯誤處理與邊界情況

混合材質支持

跨平臺兼容性

配置材質實例參數動態調整

創建材質實例動態對象

批量設置ScalarParameter

優化性能

動態更新參數

參數名稱管理

異步加載材質

在C++中控制Metahuman角色的面部表情

控制面部骨骼旋轉

使用變形目標(Morph Target)

動畫藍圖控制

表情混合系統

實時面部捕捉集成

情緒系統驅動

基于C++實現角色八方向移動的混合空間

基礎八方向鍵盤輸入

四向與八向混合模式

角度閾值分段

動畫狀態機控制

物理引擎驅動

移動預測與插值

網絡同步實現

觸摸屏虛擬搖桿

基于行為的AI移動

3D空間八方向投影

動畫蒙太奇與攻擊連招系統基礎

基礎三連擊實現(C++)

動態動畫切換(根據敵人距離)

連招分支系統

連招傷害判定集成

取消連招后搖

擴展設計思路

C++中模擬布料動態

基礎質點彈簧模型

使用Bullet Physics引擎

性能優化技巧

高級效果實現方向

可視化工具集成

自定義骨骼控制器基礎

創建基礎骨骼控制器

基于曲線的動態縮放

IK目標跟隨

物理驅動的擺動效果

進階開發建議

開放世界技術

基于C++的World Partition系統自動流送大場景

啟用World Partition系統

創建World Partition配置

實現自動流送邏輯

動態加載和卸載實例

優化性能

調試和測試

處理邊界情況

異步加載支持

實例管理

多線程支持

動態調整流送參數

實例分組管理

加載優先級設置

內存管理

實例狀態查詢

事件通知

場景保存和恢復

網絡同步

動態實例生成

實例卸載策略

基于C++的PCG植被分布規則

使用Perlin噪聲生成植被密度

基于生物群落的植被分布

植被生長條件模擬

基于距離的植被分布

隨機植被分布

基于高度的植被分布

植被種群擴散算法

基于資源競爭的植被分布

季節性植被變化

植被年齡模擬

C++與Houdini引擎結合創建動態地形侵蝕的常用方法

基于Hydra的實時侵蝕模擬實現

程序化侵蝕掩模生成技術

多通道侵蝕效果混合方案

動態侵蝕緩存與迭代優化

實現C++ Runtime Virtual Texture混合地面細節

基礎設置與初始化

動態紋理混合技術

實例化渲染優化

性能優化技巧

高級混合效果

多通道渲染技術

動態更新策略

調試與可視化

跨平臺兼容性

擴展與定制

性能監控與調整

C++ Data Layer管理光照配置基礎框架

JSON配置文件讀寫實現

區域分組管理策略

光照配置動態切換機制

性能優化方案

多線程安全訪問控制

配置差異分析工具

光照配置驗證系統

配置版本控制系統

混合光照配置方案

模擬破碎建筑物的C++ Chaos物理系統實現

建筑物網格劃分算法

物理材質參數設置

碰撞檢測與響應處理

性能優化策略

視覺效果增強

使用C++和Niagara制作火焰粒子軌跡(GPU Sprite)

創建Niagara系統

添加GPU Sprite渲染器

設置粒子生成參數

控制粒子運動

調整粒子外觀

添加噪聲和擾動

粒子顏色漸變

粒子數量控制

動態調整參數

優化性能

粒子碰撞

粒子事件

材質設置

粒子縮放

粒子旋轉

粒子子UV

粒子拖尾

粒子光照

基于Navier-Stokes方程的流體模擬

粒子系統與SPH方法

著色器渲染技術

開源庫快速實現方案

性能優化技巧

實現樹葉動態搖擺

更新樹葉搖擺角度

渲染搖擺樹葉

風力變化模擬

物理引擎集成

性能優化技巧

著色器實現

3D樹葉搖擺擴展

基于C++實現的破壞性武器沖擊波效果

基礎沖擊波實現

 圓形沖擊波基礎計算

帶衰減的二次方沖擊波

3D空間球狀沖擊波

脈沖式沖擊波(隨時間衰減)

多段傷害區域劃分

沖擊波物理材質響應

隨機擾動增強真實感

 基于距離的傷害曲線

沖擊波傳播延遲模擬

能量守恒計算

高級效果實現

 沖擊波空氣擾動(2D偽流體)

地形破壞檢測

沖擊波音效動態計算

物體撕裂效果

 沖擊波視覺后效(屏幕扭曲)

沖擊波熱力學模擬

 多層沖擊波疊加

基于物理材質的穿透力

沖擊波反射模擬

 沖擊波衍射計算

動態阻力模擬

沖擊波壓力波模擬

精確能量傳播

 沖擊波粒子系統

物體層級破壞系統

電磁脈沖模擬

沖擊波視覺殘影

沖擊波氣浪效果

動態破壞閾值計算

沖擊波AI感知系統

性能優化方案

音頻設計

平臺特性開發

性能優化

網絡與多人游戲


Unreal Engine 是什么?

Unreal Engine 5 簡介

Unreal Engine 5(UE5)是由Epic Games開發的實時3D創作工具,專為游戲開發、影視制作、建筑可視化等領域設計。它通過突破性的圖形渲染技術和工作流程優化,降低了高保真內容創作的門檻。

核心技術特性

Nanite虛擬幾何體

  • 允許直接導入電影級高模資產(如數百萬多邊形模型),無需手動優化。
  • 動態調整細節級別(LOD),實現無縫縮放和實時渲染。

Lumen全局動態光照

  • 全動態光照系統,實時響應場景變化(如光源移動、材質調整)。
  • 支持間接光照反射和漫反射,減少烘焙時間。

World Partition大場景管理

  • 自動分區加載大型開放世界,支持多開發者協同編輯。
  • 消除傳統流送技術的加載卡頓問題。

MetaHuman創作者工具

  • 提供高保真數字人類創建系統,包含預設庫和自定義功能。
  • 結合動畫工具鏈(如Control Rig),快速生成逼真角色。

應用場景擴展

  • 游戲開發:支持次世代主機與PC平臺,《黑客帝國:覺醒》Demo展示其潛力。
  • 虛擬制片:LED墻實時渲染技術被用于《曼達洛人》等影視作品。
  • 工業設計:汽車、建筑行業用于原型可視化和交互式演示。

兼容性與生態系統

  • 向后兼容UE4項目,提供遷移工具。
  • 集成Quixel Megascans資產庫,免費使用數千種掃描資源。
  • 支持Python腳本和藍圖可視化編程,兼顧程序化與美術工作流。

Unreal Engine安裝

下載 Epic Games Launcher

訪問 Epic Games 官方網站(https://www.epicgames.com/store/),下載并安裝 Epic Games Launcher。注冊或登錄 Epic Games 賬戶。

啟動 Unreal Engine

打開 Epic Games Launcher,在左側導航欄中選擇“Unreal Engine”選項卡。進入 Unreal Engine 頁面后,點擊“安裝引擎”按鈕。

選擇安裝版本和路徑

在安裝界面中,選擇 Unreal Engine 5 的最新版本(如 5.3 或其他穩定版本)。自定義安裝路徑或使用默認路徑,確保磁盤空間充足(至少需 30GB 以上)。

選擇組件

根據項目需求勾選額外組件,例如平臺支持(Android、iOS)、示例內容或模板。初學者建議保留默認選項。

開始安裝

點擊“安裝”按鈕,等待下載和安裝完成。安裝時間取決于網絡速度和硬件性能。

驗證安裝

安裝完成后,在 Epic Games Launcher 的“Unreal Engine”選項卡中會顯示已安裝的版本。點擊“啟動”按鈕打開 Unreal Engine 編輯器,確認運行正常。

配置項目模板(可選)

首次啟動時,可選擇創建新項目或學習模板。建議初學者從“Games”類別中選擇“Third Person”模板進行測試。

更新和插件管理

定期通過 Epic Games Launcher 檢查更新,確保使用最新版本。在編輯器內可通過“Edit” > “Plugins”管理插件。

UE游戲引擎

《黑神話:悟空》采用虛幻引擎5(Unreal Engine 5)開發。該引擎的Nanite虛擬幾何技術和Lumen全局動態光照技術顯著提升了游戲的畫面表現力,尤其是高精度模型和實時光影效果。

動作捕捉與動畫系統

游戲通過高精度動作捕捉技術(如慣性動捕和光學動捕)記錄真實演員的動作數據,結合虛幻引擎的動畫藍圖系統實現流暢的角色動作。戰斗中“棍勢”系統和精準的打擊感反饋依賴物理引擎與動畫狀態機的深度協作。

程序化生成與AI技術

部分場景和植被可能使用程序化生成工具(如PCG)快速構建,提升開發效率。敵人AI采用行為樹和狀態機設計,Boss戰的多階段行為變化體現了動態難度調整機制。

物理與破壞系統

虛幻引擎5的Chaos物理系統用于實現武器碰撞、布料模擬和場景破壞效果。游戲中金箍棒的伸縮變形、建筑坍塌等交互效果均依賴物理引擎的實時計算。

音頻與本地化技術

3D空間音頻技術(如虛幻引擎的MetaSounds)增強環境沉浸感。方言配音和動態配樂系統通過音頻中間件(如Wwise)實現,根據戰斗節奏切換音樂段落。

性能優化

采用虛擬紋理、層級細節(LOD)和動態分辨率技術平衡畫面與性能。光線追蹤反射和陰影效果通過硬件加速(如DLSS/FSR)實現高效渲染。

導入靜態網格體

將FBX或OBJ文件導入UE時,需確保文件路徑無中文,網格體拓撲結構合理。在內容瀏覽器中右鍵選擇“導入”,指定文件后勾選“生成光照UV”和“自動生成碰撞”。導入后檢查材質和紋理是否自動關聯,若無需手動指定。

靜態網格體導入后,可在細節面板調整縮放比例、旋轉方向。啟用“合并材質”選項可減少材質數量,優化性能。復雜模型建議分批次導入,避免因頂點數過多導致崩潰。

材質實例創建與批量調整

材質實例基于父材質創建,允許非程序員快速調整參數。在內容瀏覽器中右鍵父材質,選擇“創建材質實例”。命名規則建議使用“MI_”前綴,便于搜索管理。

批量修改材質實例可通過內容瀏覽器篩選“MaterialInstanceConstant”,全選后右鍵“批量編輯”。調整基礎顏色、金屬度、粗糙度等參數,所有選中實例同步更新。使用“參數集合”可實現跨實例聯動控制。

通過藍圖或Python腳本可自動化處理實例。以下代碼片段批量設置 emissive 強度:

import unreal
instances = unreal.EditorAssetLibrary.list_assets('/Game/Materials/Instances')
for path in instances:mi = unreal.load_asset(path)if mi.is_a(unreal.MaterialInstanceConstant):mi.set_scalar_parameter_value('Emissive_Strength', 2.0)

材質參數動態控制技巧

在實例中暴露“動態參數”可實現運行時調整。常見參數包括:

  • 向量參數(VectorParameter):控制顏色變化
  • 標量參數(ScalarParameter):調節數值型屬性
  • 紋理參數(TextureParameter):動態替換紋理

動態參數通過MaterialParameterCollection或藍圖控制。創建參數集合后,在材質圖表中引用CollectionParameter節點。以下藍圖節點序列實現漸變動畫:

Timeline -> Lerp (0-1) -> Set Scalar Parameter Value

材質函數庫可封裝復用邏輯。將常用效果如“濕表面”、“積雪”制作成函數,拖拽到不同父材質中。實例化時僅需調整函數輸入參數,保持效果一致性。

性能優化策略

實例化材質比動態材質節省資源。檢查Shader復雜度視圖(快捷鍵Ctrl+Shift+.),過度復雜的材質應拆分或簡化。靜態批量處理規則:

  • 相同父材質的實例自動合并繪制調用
  • 避免單個材質超過100個紋理采樣
  • 使用材質質量開關(Quality Switch)適配不同平臺

紋理流送池大小需匹配項目需求。4K紋理建議壓縮為BC7格式,蒙版類紋理使用BC4/BC5。啟用虛擬紋理(VT)時,需在材質中勾選“Runtime Virtual Texture Output”選項。

通過材質統計視圖(Material Statistics)分析內存占用。典型優化手段包括:

  • 共享紋理采樣器
  • 移除未使用的材質插槽
  • 烘焙靜態屬性到紋理

以下是Unreal Engine 5與C++結合的實用實例分類整理,涵蓋核心功能、游戲機制、優化技巧等方向:

基礎框架與對象管理

  1. 創建自定義Actor類并添加組件
    AMyActor::AMyActor() { PrimaryActorTick.bCanEverTick = true; }
    
  2. 實現UObject派生類的垃圾回收
    UCLASS() class UMyObject : public UObject { GENERATED_BODY() };
    
  3. 動態加載資源使用FSoftObjectPath
    FSoftObjectPath AssetRef(TEXT("/Game/Path/To/Asset.Asset"));
    

游戲邏輯系統

  1. 角色控制器輸入綁定
    PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);
    
  2. 基于時間軸的動態材質參數控制
    Timeline.AddInterpFloat(CurveFloat, FOnTimelineFloat::CreateUObject(this, &AMyActor::UpdateMaterialParam));
    
  3. 傷害計算系統實現
    UGameplayStatics::ApplyDamage(TargetActor, BaseDamage, GetInstigatorController(), this, UDamageType::StaticClass());
    

物理與碰撞

  1. 自定義碰撞通道響應設置
    CollisionComponent->SetCollisionResponseToChannel(ECC_GameTraceChannel1, ECR_Block);
    
  2. 射線檢測實現武器射擊
    GetWorld()->LineTraceSingleByChannel(HitResult, StartLoc, EndLoc, ECC_Visibility);
    
  3. 物理約束組件創建
    UPhysicsConstraintComponent* Constraint = CreateDefaultSubobject<UPhysicsConstraintComponent>(TEXT("PhysConstraint"));
    

UI與交互

  1. UMG Widget動態創建
    UUserWidget* Widget = CreateWidget<UMyWidget>(GetWorld(), WidgetClass);
    
  2. 鼠標懸停交互事件綁定
    ButtonWidget->OnHovered.AddDynamic(this, &AMyController::HandleButtonHover);
    
  3. 多語言本地化系統集成
    FText LocalizedText = NSLOCTEXT("MyNamespace", "Key", "DefaultText");
    

高渲染技術

  • Lumen動態光照調整
  • Nanite網格體編程控制
  • 自定義渲染管線擴展

網絡與多人游戲

  • 復制變量同步實現
  • RPC遠程調用示例
  • 網絡預測補償系統

性能優化

  • 異步資源加載策略
  • 對象池技術實現
  • 事件驅動架構設計

完整代碼實例可參考Unreal官方文檔中的C++編程指南,或訪問GitHub倉庫"UnrealCppExamples"獲取結構化項目文件。每個實例建議結合對應引擎版本(UE5.3+)的API參考手冊使用。

C++與Unreal Engine 5結合

以下是Unreal Engine 5與C++結合的實用實例分類整理,涵蓋核心功能、游戲機制、優化技巧等方向:

基礎框架與對象管理

  1. 創建自定義Actor類并添加組件
    AMyActor::AMyActor() { PrimaryActorTick.bCanEverTick = true; }
    
  2. 實現UObject派生類的垃圾回收
    UCLASS() class UMyObject : public UObject { GENERATED_BODY() };
    
  3. 動態加載資源使用FSoftObjectPath
    FSoftObjectPath AssetRef(TEXT("/Game/Path/To/Asset.Asset"));
    

游戲邏輯系統

  1. 角色控制器輸入綁定
    PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);
    
  2. 基于時間軸的動態材質參數控制
    Timeline.AddInterpFloat(CurveFloat, FOnTimelineFloat::CreateUObject(this, &AMyActor::UpdateMaterialParam));
    
  3. 傷害計算系統實現
    UGameplayStatics::ApplyDamage(TargetActor, BaseDamage, GetInstigatorController(), this, UDamageType::StaticClass());
    

物理與碰撞

  1. 自定義碰撞通道響應設置
    CollisionComponent->SetCollisionResponseToChannel(ECC_GameTraceChannel1, ECR_Block);
    
  2. 射線檢測實現武器射擊
    GetWorld()->LineTraceSingleByChannel(HitResult, StartLoc, EndLoc, ECC_Visibility);
    
  3. 物理約束組件創建
    UPhysicsConstraintComponent* Constraint = CreateDefaultSubobject<UPhysicsConstraintComponent>(TEXT("PhysConstraint"));
    

UI與交互

  1. UMG Widget動態創建
    UUserWidget* Widget = CreateWidget<UMyWidget>(GetWorld(), WidgetClass);
    
  2. 鼠標懸停交互事件綁定
    ButtonWidget->OnHovered.AddDynamic(this, &AMyController::HandleButtonHover);
    
  3. 多語言本地化系統集成
    FText LocalizedText = NSLOCTEXT("MyNamespace", "Key", "DefaultText");
    

高級渲染技術

  • Lumen動態光照調整
  • Nanite網格體編程控制
  • 自定義渲染管線擴展

網絡與多人游戲

  • 復制變量同步實現
  • RPC遠程調用示例
  • 網絡預測補償系統

性能優化

  • 異步資源加載策略
  • 對象池技術實現
  • 事件驅動架構設計

完整代碼實例可參考Unreal官方文檔中的C++編程指南,或訪問GitHub倉庫"UnrealCppExamples"獲取結構化項目文件。每個實例建議結合對應引擎版本(UE5.3+)的API參考手冊使用。

動態光源布置基礎

在C++中實現Lumen全局光照系統的動態光源布置,需結合引擎API與光照數據結構。UE5的Lumen系統支持動態光源實時影響全局光照,核心在于正確初始化光源參數并管理其生命周期。

// 示例:創建單個動態點光源
ALight* Light = GetWorld()->SpawnActor<APointLight>();
Light->SetMobility(EComponentMobility::Movable);
Light->SetIntensity(5000.0f);
Light->SetLightColor(FLinearColor::White);

批量生成動態光源

通過循環結構批量生成光源時,需考慮性能優化。使用對象池或分幀加載避免單幀卡頓,同時設置合理的光照范圍衰減參數。

// 批量生成100個動態光源
for (int i = 0; i < 100; ++i) {FVector Location = FVector(FMath::RandRange(-1000, 1000), FMath::RandRange(-1000, 1000), 300);APointLight* NewLight = GetWorld()->SpawnActor<APointLight>(Location, FRotator::ZeroRotator);NewLight->SetAttenuationRadius(1000.0f);NewLight->SetSourceRadius(FMath::RandRange(10.0f, 50.0f));
}

光源動態更新與控制

動態光源需實時響應場景變化。通過Tick事件或事件驅動機制調整光源屬性,如位置、顏色或強度。Lumen會自動處理這些變化對全局光照的影響。

// 動態調整光源屬性
void ADynamicLightActor::Tick(float DeltaTime) {Super::Tick(DeltaTime);LightComponent->SetIntensity(FMath::Sin(GetWorld()->GetTimeSeconds()) * 5000 + 5000);
}

性能優化策略

大量動態光源會顯著增加計算負擔。采用以下方法優化:

  • Lumen光追降噪設置:在項目設置中調整r.Lumen.Denoiser參數。
  • 光源重要性裁剪:通過FLightSceneInfobAffectDynamicIndirectLighting控制次要光源影響。
  • 實例化渲染:對同類型光源使用Instanced Static Mesh組件。
// 光源重要性判斷
if (LightComponent->GetLightType() == LightType_Point && LightComponent->Intensity < Threshold) {LightComponent->SetAffectGlobalIllumination(false);
}

調試與驗證

使用UE5的Visualize Lighting工具檢查光源是否被Lumen正確捕獲。命令行工具stat lumen可實時監控光照計算開銷。

參考資源

  • UE5官方文檔:Lumen Technical Details
  • Epic Games示例項目:Lyra Starter Game中的動態光照實現
  • 源碼參考:Engine/Source/Runtime/Renderer/Private/Lumen/LumenScene.cpp

通過合理配置光源屬性和優化策略,可在C++中高效實現Lumen支持的動態全局光照效果。

C++ 角色移動控制實例

以下是一些基于C++實現角色移動控制的示例代碼片段,涵蓋不同場景和需求。

基礎2D角色移動

#include <iostream>
using namespace std;class Character {
public:float x, y;void move(float dx, float dy) {x += dx;y += dy;}
};int main() {Character player;player.x = 0;player.y = 0;player.move(1.5f, 2.0f);cout << "New position: (" << player.x << ", " << player.y << ")" << endl;return 0;
}

使用鍵盤輸入控制移動

#include <iostream>
#include <conio.h>class Player {
public:int x, y;Player() : x(0), y(0) {}void update(char input) {switch(input) {case 'w': y++; break;case 's': y--; break;case 'a': x--; break;case 'd': x++; break;}}
};int main() {Player p;while(true) {cout << "Position: (" << p.x << "," << p.y << ")" << endl;cout << "Move with WASD: ";char input = _getch();p.update(input);}
}

帶邊界檢測的移動

#include <iostream>
using namespace std;class GameCharacter {int x, y;const int maxX = 10, maxY = 10;
public:GameCharacter() : x(0), y(0) {}bool move(int dx, int dy) {int newX = x + dx;int newY = y + dy;if(newX >= 0 && newX < maxX && newY >= 0 && newY < maxY) {x = newX;y = newY;return true;}return false;}void printPosition() {cout << "Current position: (" << x << ", " << y << ")" << endl;}
};int main() {GameCharacter c;c.move(3, 4);c.printPosition();if(!c.move(10, 0)) {cout << "Cannot move beyond boundary!" << endl;}return 0;
}

基于時間的平滑移動

#include <iostream>
#include <chrono>
using namespace std;class SmoothCharacter {float x, y;float speed;
public:SmoothCharacter(float s = 1.0f) : x(0), y(0), speed(s) {}void update(float dx, float dy, float deltaTime) {x += dx * speed * deltaTime;y += dy * speed * deltaTime;}void printPos() {cout << "Position: (" << x << ", " << y << ")" << endl;}
};int main() {SmoothCharacter player(2.0f);auto lastTime = chrono::high_resolution_clock::now();while(true) {auto now = chrono::high_resolution_clock::now();float deltaTime = chrono::duration<float>(now - lastTime).count();lastTime = now;player.update(1.0f, 0.5f, deltaTime);player.printPos();}return 0;
}

使用SDL庫的2D角色控制

上下左右控制

#include <SDL.h>class SDLCharacter {SDL_Rect rect;int speed;
public:SDLCharacter(int x, int y, int w, int h, int s) : rect{x, y, w, h}, speed(s) {}void handleEvent(SDL_Event& e) {if(e.type == SDL_KEYDOWN) {switch(e.key.keysym.sym) {case SDLK_UP: rect.y -= speed; break;case SDLK_DOWN: rect.y += speed; break;case SDLK_LEFT: rect.x -= speed; break;case SDLK_RIGHT: rect.x += speed; break;}}}void render(SDL_Renderer* renderer) {SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);SDL_RenderFillRect(renderer, &rect);}
};

基于網格的移動系統

#include <iostream>
#include <vector>
using namespace std;class GridCharacter {int gridX, gridY;vector<vector<bool>> grid;
public:GridCharacter(int width, int height) : gridX(0), gridY(0), grid(height, vector<bool>(width, false)) {}bool moveTo(int x, int y) {if(x >= 0 && x < grid[0].size() && y >= 0 && y < grid.size() && !grid[y][x]) {gridX = x;gridY = y;grid[y][x] = true;return true;}return false;}void printPosition() {cout << "Grid position: [" << gridX << "," << gridY << "]" << endl;}
};

帶加速度的運動

#include <iostream>
using namespace std;class PhysicsCharacter {float x, y;float vx, vy;float ax, ay;
public:PhysicsCharacter() : x(0), y(0), vx(0), vy(0), ax(0), ay(0) {}void applyForce(float fx, float fy) {ax += fx;ay += fy;}void update(float dt) {vx += ax * dt;vy += ay * dt;x += vx * dt;y += vy * dt;ax = ay = 0;}void printState() {cout << "Pos: (" << x << "," << y << ") ";cout << "Vel: (" << vx << "," << vy << ")" << endl;}
};

使用狀態模式的移動控制

#include <iostream>
using namespace std;class MovementState {
public:virtual void move(float& x, float& y) = 0;
};class WalkingState : public MovementState {
public:void move(float& x, float& y) override {x += 1.0f;cout << "Walking..." << endl;}
};class RunningState : public MovementState {
public:void move(float& x, float& y) override {x += 2.0f;cout << "Running!" << endl;}
};class Character {float x, y;MovementState* state;
public:Character() : x(0), y(0), state(new WalkingState()) {}void setState(MovementState* newState) {delete state;state = newState;}void move() {state->move(x, y);}~Character() {delete state;}
};

基于組件的移動系統

鍵盤的上下左右

#include <iostream>
#include <memory>
using namespace std;class MovementComponent {
public:virtual void move(float& x, float& y) = 0;
};class KeyboardMovement : public MovementComponent {
public:void move(float& x, float& y) override {char input;cin >> input;switch(input) {case 'w': y++; break;case 's': y--; break;case 'a': x--; break;case 'd': x++; break;}}
};class GameObject {float x, y;unique_ptr<MovementComponent> movement;
public:GameObject(float x, float y) : x(x), y(y) {}void setMovement(unique_ptr<MovementComponent> m) {movement = move(m);}void update() {if(movement) {movement->move(x, y);}cout << "Position: (" << x << ", " << y << ")" << endl;}
};

基于路徑點的移動

#include <iostream>
#include <vector>
using namespace std;struct Point {float x, y;Point(float x, float y) : x(x), y(y) {}
};class PathMover {vector<Point> path;int currentIndex;float speed;
public:PathMover(const vector<Point>& p, float s) : path(p), currentIndex(0), speed(s) {}void update(float dt) {if(currentIndex >= path.size()) return;Point& target = path[currentIndex];float dx = target.x - x;float dy = target.y - y;float distance = sqrt(dx*dx + dy*dy);if(distance < speed * dt) {x = target.x;y = target.y;currentIndex++;} else {x += (dx / distance) * speed * dt;y += (dy / distance) * speed * dt;}}float x, y;
};

以上示例展示了不同場景下的角色移動控制實現方法,包括基礎移動、輸入控制、物理運動、組件化設計等。實際應用中可以根據具體需求選擇合適的實現方式或組合多種方法。

Unreal Engine 5

以下是Unreal Engine 5的實用案例分類整理,涵蓋從基礎到進階的開發場景,幫助開發者快速掌握UE5的核心功能。

以下是一些基于C++的可交互門實例的示例代碼和實現方法,涵蓋不同場景和功能。這些例子展示了如何創建、操作和交互不同類型的門(如開關門、自動門、密碼門等)。


基礎門類實現

開門關門控制

class Door {
public:Door() : isOpen(false) {}virtual void open() { isOpen = true; }virtual void close() { isOpen = false; }bool isOpenNow() const { return isOpen; }
protected:bool isOpen;
};

開關門實例

class SimpleDoor : public Door {
public:void toggle() {if (isOpen) close();else open();}
};

自動門實例

class AutomaticDoor : public Door {
public:void senseMotion(bool motionDetected) {if (motionDetected) open();else close();}
};

密碼門實例

輸入密碼,正確密碼開門

class PasswordDoor : public Door {
public:PasswordDoor(const std::string& pass) : password(pass) {}void tryOpen(const std::string& input) {if (input == password) open();}
private:std::string password;
};

定時門實例

#include <chrono>
class TimedDoor : public Door {
public:void openFor(int seconds) {open();auto now = std::chrono::system_clock::now();closeTime = now + std::chrono::seconds(seconds);}void checkTimer() {auto now = std::chrono::system_clock::now();if (now >= closeTime) close();}
private:std::chrono::system_clock::time_point closeTime;
};


多重驗證門實例

class MultiAuthDoor : public Door {
public:void addKey(const std::string& key) {keys.insert(key);}void tryOpen(const std::vector<std::string>& inputs) {for (const auto& input : inputs) {if (keys.find(input) == keys.end()) return;}open();}
private:std::unordered_set<std::string> keys;
};

聲控門實例

類似輸入語音,芝麻開門

class VoiceDoor : public Door {
public:void setVoiceCommand(const std::string& cmd) {voiceCommand = cmd;}void receiveVoice(const std::string& input) {if (input == voiceCommand) toggle();}
private:std::string voiceCommand;
};

網絡控制門實例

#include <curl/curl.h>
class NetworkDoor : public Door {
public:void sendOpenRequest(const std::string& url) {CURL* curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_URL, url.c_str());curl_easy_perform(curl);curl_easy_cleanup(curl);open();}}
};

生物識別門實例

class BiometricDoor : public Door {
public:void enrollUser(const std::string& userId, const std::string& biometricData) {users[userId] = biometricData;}void tryOpen(const std::string& userId, const std::string& inputData) {if (users.count(userId) && users[userId] == inputData) {open();}}
private:std::unordered_map<std::string, std::string> users;
};

以上是部分示例,如果需要更多實例或特定功能的實現,可以進一步擴展這些基礎類。每個示例都展示了不同的交互方式,可以根據實際需求進行組合或修改。

物品拾取系統核心實現

使用C++構建物品拾取系統需要結合碰撞檢測與庫存管理邏輯。以下是實現框架及關鍵代碼示例:

// 碰撞檢測模塊
class CollisionDetector {
public:bool checkCollision(const sf::FloatRect& player, const sf::FloatRect& item) {return player.intersects(item);}
};
// 庫存系統模塊
class Inventory {
private:std::vector<Item*> items;const int MAX_SIZE = 10;
public:bool addItem(Item* newItem) {if(items.size() < MAX_SIZE) {items.push_back(newItem);return true;}return false;}
};

物體交互邏輯實現

// 物品類定義
class Item {
public:sf::Sprite sprite;ItemType type;void draw(sf::RenderWindow& window) {window.draw(sprite);}
};
// 玩家類擴展
class Player {
public:void pickupItem(std::vector<Item*>& worldItems, Inventory& inv) {for(auto it = worldItems.begin(); it != worldItems.end(); ) {if(CollisionDetector::checkCollection(hitbox, (*it)->sprite.getGlobalBounds())) {if(inv.addItem(*it)) {it = worldItems.erase(it);continue;}}++it;}}
};

完整工作流程示例

// 主游戲循環示例
int main() {Player player;Inventory inventory;std::vector<Item*> worldItems;while(gameRunning) {player.update();player.pickupItem(worldItems, inventory);for(auto& item : worldItems) {item->draw(window);}}
}

性能優化技巧

使用空間劃分算法加速碰撞檢測:

class SpatialHash {
public:void insert(const sf::Vector2f& pos, Item* item) {auto cell = getCellCoordinates(pos);grid[cell].push_back(item);}std::vector<Item*> query(const sf::FloatRect& area) {// 返回潛在碰撞物品}
};

庫存UI展示方法

// 庫存渲染示例
void Inventory::render(sf::RenderWindow& window) {for(int i=0; i<items.size(); ++i) {items[i]->sprite.setPosition(100 + i*50, 500);window.draw(items[i]->sprite);}
}

物品類型枚舉

// 物品分類系統
enum class ItemType {WEAPON,CONSUMABLE,QUEST_ITEM,MATERIAL
};

事件驅動拾取方案

// 按鍵觸發拾取
void Player::handleInput() {if(sf::Keyboard::isKeyPressed(sf::Keyboard::E)) {attemptPickup();}
}

數據持久化實現

// 庫存保存/加載
void Inventory::saveToFile(const std::string& filename) {std::ofstream file(filename);for(auto& item : items) {file << static_cast<int>(item->type) << "\n";}
}

網絡同步方案

// 多人游戲物品同步
class NetworkedItem {
public:void syncState(sf::Packet& packet) {packet << position.x << position.y;}
};

基于C++設計簡易UI血量條

以下是基于C++設計簡易UI血量條的多種實現方式,涵蓋不同庫和框架的示例。由于篇幅限制,提供核心代碼片段和實現思路,可根據需求擴展。

使用ASCII字符繪制血量條(終端)

#include <iostream>
#include <string>void drawHealthBar(int current, int max) {const int barWidth = 20;float ratio = static_cast<float>(current) / max;int filled = static_cast<int>(ratio * barWidth);std::string bar(filled, '#');bar.append(barWidth - filled, '-');std::cout << "[" << bar << "] " << current << "/" << max << std::endl;
}

使用Windows API(GDI)

#include <windows.h>void DrawHealthBar(HDC hdc, int x, int y, int width, int current, int max) {float ratio = static_cast<float>(current) / max;int filledWidth = static_cast<int>(ratio * width);// BackgroundHBRUSH bgBrush = CreateSolidBrush(RGB(50, 50, 50));FillRect(hdc, &RECT{x, y, x + width, y + 20}, bgBrush);DeleteObject(bgBrush);// ForegroundHBRUSH fgBrush = CreateSolidBrush(current < max * 0.3 ? RGB(255, 0, 0) : RGB(0, 255, 0));FillRect(hdc, &RECT{x, y, x + filledWidth, y + 20}, fgBrush);DeleteObject(fgBrush);
}

使用SFML庫

#include <SFML/Graphics.hpp>void createSFMLHealthBar(sf::RenderWindow& window, float x, float y, float width, float current, float max) {float ratio = current / max;sf::RectangleShape background(sf::Vector2f(width, 20));background.setPosition(x, y);background.setFillColor(sf::Color::Black);sf::RectangleShape health(sf::Vector2f(width * ratio, 20));health.setPosition(x, y);health.setFillColor(ratio > 0.3f ? sf::Color::Green : sf::Color::Red);window.draw(background);window.draw(health);
}

使用OpenGL(現代)

void renderHealthBarGL(float x, float y, float width, float current, float max) {float ratio = current / max;glBegin(GL_QUADS);// BackgroundglColor3f(0.2f, 0.2f, 0.2f);glVertex2f(x, y);glVertex2f(x + width, y);glVertex2f(x + width, y + 20);glVertex2f(x, y + 20);// Foregroundratio > 0.3f ? glColor3f(0, 1, 0) : glColor3f(1, 0, 0);glVertex2f(x, y);glVertex2f(x + width * ratio, y);glVertex2f(x + width * ratio, y + 20);glVertex2f(x, y + 20);glEnd();
}

使用Qt框架

#include <QPainter>void HealthBar::paintEvent(QPaintEvent*) {QPainter painter(this);float ratio = static_cast<float>(currentHealth) / maxHealth;// Backgroundpainter.fillRect(0, 0, width(), 20, Qt::darkGray);// ForegroundQColor color = ratio > 0.3 ? Qt::green : Qt::red;painter.fillRect(0, 0, static_cast<int>(width() * ratio), 20, color);// Textpainter.drawText(rect(), Qt::AlignCenter, QString("%1/%2").arg(currentHealth).arg(maxHealth));
}

使用Unreal Engine(UMG)

void UHealthBar::NativeTick(const FGeometry& Geometry, float DeltaTime) {Super::NativeTick(Geometry, DeltaTime);if (HealthProgressBar) {HealthProgressBar->SetPercent(CurrentHealth / MaxHealth);HealthProgressBar->SetFillColorAndOpacity((CurrentHealth / MaxHealth < 0.3f) ? FLinearColor::Red : FLinearColor::Green);}
}

使用ImGUI庫

#include <imgui.h>void DrawImGuiHealthBar(float current, float max) {float ratio = current / max;ImVec4 color = ratio > 0.3f ? ImVec4(0, 1, 0, 1) : ImVec4(1, 0, 0, 1);ImGui::ProgressBar(ratio, ImVec2(200, 20), "");ImGui::SameLine();ImGui::Text("%.0f/%.0f", current, max);
}

使用SDL2庫

#include <SDL2/SDL.h>void drawSDLHealthBar(SDL_Renderer* renderer, int x, int y, int width, int current, int max) {float ratio = static_cast<float>(current) / max;// BackgroundSDL_SetRenderDrawColor(renderer, 50, 50, 50, 255);SDL_Rect bgRect = {x, y, width, 20};SDL_RenderFillRect(renderer, &bgRect);// Foregroundratio > 0.3f ? SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255) : SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);SDL_Rect healthRect = {x, y, static_cast<int>(width * ratio), 20};SDL_RenderFillRect(renderer, &healthRect);
}

使用文本文件持久化

#include <fstream>void saveHealthToFile(int current, int max) {std::ofstream file("health.txt");file << current << "\n" << max;file.close();
}void loadHealthFromFile(int& current, int& max) {std::ifstream file("health.txt");file >> current >> max;file.close();
}

使用Curses庫(跨平臺終端)

#include <curses.h>void drawCursesHealthBar(int current, int max) {int max_x = getmaxx(stdscr);float ratio = static_cast<float>(current) / max;int filled = static_cast<int>(ratio * (max_x - 10));attron(COLOR_PAIR(ratio > 0.3 ? 1 : 2));for (int i = 0; i < filled; ++i) mvaddch(0, i, '#');attroff(COLOR_PAIR(ratio > 0.3 ? 1 : 2));for (int i = filled; i < max_x - 10; ++i) mvaddch(0, i, '-');mvprintw(0, max_x - 9, "%d/%d", current, max);
}

以上示例展示了不同技術棧的實現方法,可根據項目需求選擇或組合使用。實際開發中需考慮性能優化、動畫過渡、多平臺兼容性等擴展功能。

敵人AI巡邏邏輯實例

以下是一些基于C++和Behavior Tree的敵人AI巡邏邏輯實例,涵蓋了不同場景和需求。

基礎巡邏邏輯

// 巡邏任務節點
class PatrolTask : public BT::SyncActionNode
{
public:PatrolTask(const std::string& name, const BT::NodeConfiguration& config): BT::SyncActionNode(name, config){}static BT::PortsList providedPorts(){return { BT::InputPort<std::vector<Vector3>>("waypoints") };}BT::NodeStatus tick() override{auto waypoints = getInput<std::vector<Vector3>>("waypoints");if (!waypoints){return BT::NodeStatus::FAILURE;}// 獲取當前巡邏點static size_t currentWaypoint = 0;Vector3 target = waypoints.value()[currentWaypoint];// 移動到目標點if (MoveTo(target)){currentWaypoint = (currentWaypoint + 1) % waypoints.value().size();return BT::NodeStatus::SUCCESS;}return BT::NodeStatus::RUNNING;}
};

帶隨機路徑的巡邏

class RandomPatrolTask : public BT::SyncActionNode
{
public:RandomPatrolTask(const std::string& name, const BT::NodeConfiguration& config): BT::SyncActionNode(name, config){}static BT::PortsList providedPorts(){return { BT::InputPort<std::vector<Vector3>>("waypoints") };}BT::NodeStatus tick() override{auto waypoints = getInput<std::vector<Vector3>>("waypoints");if (!waypoints || waypoints.value().empty()){return BT::NodeStatus::FAILURE;}// 隨機選擇巡邏點static size_t currentWaypoint = rand() % waypoints.value().size();Vector3 target = waypoints.value()[currentWaypoint];if (MoveTo(target)){currentWaypoint = rand() % waypoints.value().size();return BT::NodeStatus::SUCCESS;}return BT::NodeStatus::RUNNING;}
};

帶視覺檢測的巡邏

class PatrolWithDetection : public BT::SyncActionNode
{
public:PatrolWithDetection(const std::string& name, const BT::NodeConfiguration& config): BT::SyncActionNode(name, config){}static BT::PortsList providedPorts(){return { BT::InputPort<std::vector<Vector3>>("waypoints"),BT::OutputPort<bool>("player_detected")};}BT::NodeStatus tick() override{auto waypoints = getInput<std::vector<Vector3>>("waypoints");if (!waypoints){return BT::NodeStatus::FAILURE;}// 檢測玩家if (DetectPlayer()){setOutput("player_detected", true);return BT::NodeStatus::FAILURE;}// 正常巡邏static size_t currentWaypoint = 0;Vector3 target = waypoints.value()[currentWaypoint];if (MoveTo(target)){currentWaypoint = (currentWaypoint + 1) % waypoints.value().size();return BT::NodeStatus::SUCCESS;}return BT::NodeStatus::RUNNING;}
};

帶休息時間的巡邏

class PatrolWithRest : public BT::SyncActionNode
{
public:PatrolWithRest(const std::string& name, const BT::NodeConfiguration& config): BT::SyncActionNode(name, config), restTime(0){}static BT::PortsList providedPorts(){return { BT::InputPort<std::vector<Vector3>>("waypoints"),BT::InputPort<float>("rest_duration")};}BT::NodeStatus tick() override{auto waypoints = getInput<std::vector<Vector3>>("waypoints");auto restDuration = getInput<float>("rest_duration");if (!waypoints || !restDuration){return BT::NodeStatus::FAILURE;}// 休息狀態if (restTime > 0){restTime -= GetDeltaTime();return BT::NodeStatus::RUNNING;}// 移動狀態static size_t currentWaypoint = 0;Vector3 target = waypoints.value()[currentWaypoint];if (MoveTo(target)){currentWaypoint = (currentWaypoint + 1) % waypoints.value().size();restTime = restDuration.value();return BT::NodeStatus::SUCCESS;}return BT::NodeStatus::RUNNING;}private:float restTime;
};

帶環境交互的巡邏

class PatrolWithEnvironmentInteraction : public BT::SyncActionNode
{
public:PatrolWithInteraction(const std::string& name, const BT::NodeConfiguration& config): BT::SyncActionNode(name, config){}static BT::PortsList providedPorts(){return { BT::InputPort<std::vector<Vector3>>("waypoints"),BT::InputPort<std::vector<InteractionPoint>>("interaction_points")};}BT::NodeStatus tick() override{auto waypoints = getInput<std::vector<Vector3>>("waypoints");auto interactionPoints = getInput<std::vector<InteractionPoint>>("interaction_points");if (!waypoints || !interactionPoints){return BT::NodeStatus::FAILURE;}// 檢查是否有交互點for (const auto& point : interactionPoints.value()){if (DistanceTo(point.position) < point.interactionRadius){PerformInteraction(point.interactionType);return BT::NodeStatus::SUCCESS;}}// 正常巡邏static size_t currentWaypoint = 0;Vector3 target = waypoints.value()[currentWaypoint];if (MoveTo(target)){currentWaypoint = (currentWaypoint + 1) % waypoints.value().size();return BT::NodeStatus::SUCCESS;}return BT::NodeStatus::RUNNING;}
};

動態調整路徑的巡邏

class DynamicPatrolTask : public BT::SyncActionNode
{
public:DynamicPatrolTask(const std::string& name, const BT::NodeConfiguration& config): BT::SyncActionNode(name, config){}static BT::PortsList providedPorts(){return { BT::InputPort<std::vector<Vector3>>("waypoints"),BT::InputPort<bool>("path_blocked")};}BT::NodeStatus tick() override{auto waypoints = getInput<std::vector<Vector3>>("waypoints");auto pathBlocked = getInput<bool>("path_blocked");if (!waypoints){return BT::NodeStatus::FAILURE;}// 路徑被阻擋,尋找替代路線if (pathBlocked && pathBlocked.value()){Vector3 alternativePath = FindAlternativePath();if (MoveTo(alternativePath)){return BT::NodeStatus::SUCCESS;}return BT::NodeStatus::FAILURE;}// 正常巡邏static size_t currentWaypoint = 0;Vector3 target = waypoints.value()[currentWaypoint];if (MoveTo(target)){currentWaypoint = (currentWaypoint + 1) % waypoints.value().size();return BT::NodeStatus::SUCCESS;}return BT::NodeStatus::RUNNING;}
};

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

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

相關文章

web滲透sql注入4之PostgreSQL

web滲透sql注入4之PostgreSQLPostgreSQL數據庫特性&#xff1a;基于角色的訪問控制&#xff0c;支持超級用戶&#xff0c;需安裝 plpgsql 擴展方可執行命令&#xff0c;可通過 COPY命令或自定義函數實現權限判斷白盒看代碼&#xff0c;黑盒通過構造特殊查詢語句探測數據庫權限權…

2025年7月:打cs1.5 600元裝機臺式電腦方案A

打cs1.5 600元裝機方案A&#xff1a;有需要的小伙伴可以收藏哈&#xff0c;目前我沒有機會實測效果&#xff0c;理論值是ok無壓力的&#xff0c;大家 有機會配置后的&#xff0c;也可以自行測試下CS1.5的FPS值穩定否哈哈。 打cs1.5 600元裝機方案A&#xff1a; 點擊查看詳細內…

人大金倉下載安裝教程總結

文章目錄前言背景&#xff1a; 工作中進行信創改造&#xff0c;需要把mysql&#xff0c;postgresql數據遷移到人大金倉一、人大金倉是什么&#xff1f;二、使用場景三、下載安裝教程四、優勢五、環境及要求六、工具以及詞匯介紹總結前言 背景&#xff1a; 工作中進行信創改造&…

WebDAV與內網穿透的協同創新:Joplin私有云同步架構深度解析

文章目錄前言1. 檢查群暉Webdav 服務2. 本地局域網IP同步測試3. 群暉安裝Cpolar工具4. 創建Webdav公網地址5. Joplin連接WebDav6. 固定Webdav公網地址7. 公網環境連接測試前言 在遠程辦公場景持續深化的數字化時代&#xff0c;數字筆記工具已從單純的記錄載體進化為知識管理的…

html的outline: none;

outline: none; 是一條 CSS 樣式規則&#xff0c;用來取消元素獲得焦點時的默認輪廓線&#xff08;outline&#xff09;。&#x1f50d; 什么是 outline&#xff1f;outline 是瀏覽器在某些元素&#xff08;例如輸入框 <input>、按鈕 <button>、可編輯元素如 <d…

Java 正則表達式白皮書:語法詳解、工程實踐與常用表達式庫

一、什么是正則表達式&#xff1f;正則表達式&#xff08;Regular Expression&#xff09;是一種文本模式&#xff0c;用于描述、匹配、搜索或替換符合某種規則的字符串。其在日志提取、表單校驗、配置清洗、數據爬取等場景中被廣泛使用。Java 提供了完整的正則表達式支持&…

火山引擎Data Agent全面上線售賣!以企業級數據智能體,重構數據應用范式

資料來源&#xff1a;火山引擎-開發者社區 在火山引擎2025春季FORCE原動力大會現場&#xff0c;火山引擎數智平臺解決方案總經理蕭然宣布&#xff0c; 企業級數據智能體Data Agent即日起正式上線售賣 。該產品旨在通過DataAI的深度融合&#xff0c;助力企業實現數據價值的挖掘與…

uniapp AndroidiOS 定位權限檢查

定位權限檢查 // 檢查定位權限狀態 export const checkPermission () > {const platform uni.getSystemInfoSync().platform;console.log(platform, platform)// #ifdef APP-PLUSif (platform android) {// Androidreturn checkAndroidPermission();} else if (platform …

深入理解Java虛擬機(JVM):從內存管理到性能優化

深入理解Java虛擬機&#xff08;JVM&#xff09;&#xff1a;從內存管理到性能優化 目錄 引言JVM架構概述 1. 類加載器&#xff08;Class Loader&#xff09;2. 運行時數據區&#xff08;Runtime Data Areas&#xff09;3. 執行引擎&#xff08;Execution Engine&#xff09;…

PHP SimpleXML:深入理解與高效使用

PHP SimpleXML:深入理解與高效使用 引言 PHP SimpleXML 是一個用于解析和操作 XML 文檔的庫。它簡化了 XML 的處理過程,使得 PHP 開發者可以更加輕松地與 XML 數據交互。本文將深入探討 PHP SimpleXML 的基本概念、使用方法以及在實際開發中的應用。 SimpleXML 簡介 Simp…

雙模秒切,體驗躍遷!飛利浦EVNIA雙模游戲顯示器27M2N6801M王者降臨!

當沉浸式畫質與電競級流暢無法共存&#xff0c;EVNIA Mini LED雙模游戲顯示器27M2N6801M以破界之姿革新而來&#xff01;全新搭載 4K160Hz / FHD320Hz雙模顯示引擎&#xff0c;將視覺震撼與操作跟手性推向全新高度。心念所動間&#xff0c;即可在電影級3A世界與分秒必爭的電競戰…

Transformer:自注意力驅動的神經網絡革命引擎

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 從語言理解到多模態智能的通用架構基石 ?? 一、核心定義與歷史意義 …

汽車電子電氣架構中的關鍵計算單元解析

汽車電子電氣架構正經歷從分布式到集中式的重大變革&#xff0c;ECU、域控制器、中央計算單元等計算設備在這一演進過程中扮演著不同角色。這些設備按功能層級可分為傳統控制層、域集中層和中央計算層&#xff0c;各自承擔特定計算任務&#xff0c;共同構成智能汽車的"大腦…

Pandas 學習(數學建模篇)

今天學習數學建模2023年C篇&#xff08;228&#xff09;優秀論文 2023高教社杯全國大學生數學建模競賽C題論文展示&#xff08;C228&#xff09; - 2023C題論文 - 中國大學生在線 一.pd.DataFrame pd.DataFrame() 是 pandas 庫中用于創建二維表格數據結構&#xff08;DataFr…

第七講:C++中的string類

目錄 1、認識string類 2、標準庫中的string類 2.1、string類的常見接口 2.1.1、構造與賦值重載 2.1.2、迭代器 2.1.3、容量 2.1.4、訪問 2.1.5、修改 2.1.6、字符串操作 2.1.7、成員常量 2.1.8、非成員函數 2.1.9、轉換函數 2.2、vs和g下的string 2.2.1、vs下的s…

elementUI 前端表格table數據導出(一)

為啥前端導出不在贅述了第一步&#xff1a;安裝xlsxnpm install xlsx第二步&#xff1a;創建js文件html2excelimport * as XLSX from xlsx;const htmlToExcel {getExcel(dom, title temp){var excelTitle title;// const XLSX require("xlsx");var wb XLSX.util…

LabVIEW 波形圖表橫坐標顯示當前日期

LabVIEW 程序如何實現波形圖表橫坐標顯示當前日期一、XY Graph 時間關聯邏輯&#xff08;右上角分支&#xff09;功能本質實時采集當前系統時間&#xff08;秒數形式&#xff0c;基于 1904 基準&#xff09;&#xff0c;直接映射為 XY Graph 的 X 軸時間標識&#xff0c;實現動…

Android Soundtrigger喚醒相關時序學習梳理

本文所寫內容是在高通芯片平臺相關代碼基礎上學習整理匯總&#xff0c;如有描述不當之處&#xff0c;歡迎指正&#xff01;1、SoundTrigger注冊喚醒監聽事件回調流程&#xff08;SoundTrigger HAL層到ADSP層&#xff0c;不包括FWK層&#xff09;//(1)SoundTriggerSession 回調 …

OSPF實驗以及核心原理全解

OSPF&#xff08;Open Shortest Path First&#xff0c;開放式最短路徑優先&#xff09;是一種基于鏈路狀態的內部網關協議&#xff08;IGP&#xff09;&#xff0c;廣泛應用于中大型網絡中。它通過維護網絡拓撲信息&#xff0c;使用 SPF&#xff08;最短路徑優先&#xff09;算…

Using Spring for Apache Pulsar:Transactions

本節介紹Spring for Apache Pulsar如何支持事務。OverviewSpring for Apache Pulsar事務支持是基于Spring Framework提供的事務支持構建的。在高層&#xff0c;事務資源向事務管理器注冊&#xff0c;事務管理器反過來處理注冊資源的事務狀態&#xff08;提交、回滾等&#xff0…