哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Rust在虛幻引擎5中的使用

jf_wN0SrCdH ? 來源:Rust語言中文社區(qū) ? 作者:Rust語言中文社區(qū) ? 2022-12-21 11:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

前段時間,研究了一套 Rust 接入 Maya Plugin 的玩法,主要原理還是使用 C ABI 去交互。那我想著 UE 是使用 C++ 寫的,肯定也可以使用 C ABI 去交互,如果可以的話在 UE 中就可以使用 Rust 代碼去跑,甚至還可以使用 Rust Crates,免得使用 C++ 去寫關(guān)于數(shù)據(jù)庫操作、加密操作等容易引發(fā)安全漏洞的代碼。所以我在昨天開始了這個計劃,使用了 Rust 的 html2md 的庫在 UE 中使用,效果圖如下。

開工

這個案例就是在 UE 中實現(xiàn) html2md,雖然實際效果可能沒卵用,主要目的還是帶大家跑下這套流程。

我們要實現(xiàn)的功能就是在 Level 放置一個 Text Render。
游戲開始階段,這個
Text Render 就會拉取 Rust 官網(wǎng)頁面,并將它轉(zhuǎn)為 Markdown 格式展示在游戲中。

創(chuàng)建 UE 項目

我這里使用的版本是 5.0.1,大家使用 4.x 也是可以的。
我們創(chuàng)建一個
第三人稱游戲 C++項目,命名為Html2mdExample。
45f90370-807e-11ed-8abf-dac502259ad0.png

創(chuàng)建 UE 插件

我們將 Html2md 的功能封裝成一個插件,這樣就可以在各個項目中去使用它。

我們創(chuàng)建一個空白插件,插件名隨意,我這邊就叫 html2md。

4619586e-807e-11ed-8abf-dac502259ad0.png

在插件中添加 Text Render

我們要在插件中添加一個 Actor,作為處理 HTTP 請求,并渲染 MarkdownText Render。

一定要選擇添加到插件中,而不是項目中。

4638d2fc-807e-11ed-8abf-dac502259ad0.png

TextRender.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Runtime/Engine/Classes/Components/TextRenderComponent.h"
#include "TextRender.generated.h"

UCLASS()
class HTML2MD_API ATextRender : public AActor
{
GENERATED_BODY()

UPROPERTY(VisibleAnywhere)
UTextRenderComponent* Text;

public:
ATextRender();

protected:
virtual void BeginPlay() override;

public:
virtual void Tick(float DeltaTime) override;

};

TextRender.cpp

簡單寫一寫代碼,添加一個 UTextRenderComponent,并修改它的顏色、旋轉(zhuǎn)、縮放等屬性。

#include "TextRender.h"

ATextRender::ATextRender()
{
PrimaryActorTick.bCanEverTick = true;

Text = CreateDefaultSubobject<UTextRenderComponent>(TEXT("Text"));
Text->SetupAttachment(RootComponent);
}

void ATextRender::BeginPlay()
{
Super::BeginPlay();

Text->SetRelativeRotation(FRotator(90.f, 180.f, 0.f));
Text->SetTextRenderColor(FColor(0, 255, 225));
Text->SetRelativeScale3D(FVector(2.f, 2.f, 2.f));
}

void ATextRender::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);

}

創(chuàng)建 Rust 項目

我們 Rust 項目要創(chuàng)建在 UE 插件項目目錄下。找到插件源碼目錄,與 C++ 源碼同級運(yùn)行以下命令創(chuàng)建項目。

cargo new --lib html2md-dylib

464fe384-807e-11ed-8abf-dac502259ad0.png

Cargo.toml

[package]
name = "html2md-dylib"
version = "0.1.0"
edition = "2021"

# 將庫打包成動態(tài)鏈接庫
[lib]
crate-type = ["dylib"]
name = "html2md_dylib"

[dependencies]
# 用于 HTML 轉(zhuǎn)為 Markdown
html2md = "0.2.14"
# 用于進(jìn)行 HTTP 請求
reqwest = { version = "0.11.13", features = ["blocking"] }

[build-dependencies]
# 用于生成 C 頭文件
cbindgen = "0.24.3"

src/md_loader.rs

在這里我們實現(xiàn)一個從 HTTP 請求拉取 HTML 并轉(zhuǎn)為 Markdown 的實現(xiàn)。

pub struct MDLoader;

impl MDLoader {
pub fn load_md_from_url(url: &str) -> String {
let body = if let Ok(res) = reqwest::get(url) {
if let Ok(text) = res.text() {
text
} else {
return format!("Failed get {} text", url);
}
} else {
return format!("Failed get {} body", url);
};

html2md::parse_html(&body)
}
}

src/lib.rs

將函數(shù)導(dǎo)出,這樣在動態(tài)鏈接庫中就可以調(diào)用這個函數(shù)了。

use std::{c_char, CStr, CString};

mod md_loader;

#[no_mangle]
pub extern "C" fn load_md_from_url_ffi(url: *const c_char) -> *const c_char {
let url = unsafe { CStr::from_ptr(url) };
let res = md_loader::load_md_from_url(&url.to_string_lossy());

CString::new(res).unwrap().into_raw()
}

build.rs

我們需要使用到構(gòu)建腳本來幫我們生成 C 頭文件,我們將在 C++ 代碼中使用它。

頭文件生成到 include/UEHtml2md.h

extern crate cbindgen;

use std::env;

fn main() {
let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let mut config: cbindgen::Config = Default::default();
config.language = cbindgen::Cxx;

cbindgen::generate_with_config(&crate_dir, config)
.expect("Unable to generate bindings")
.write_to_file("include/UEHtml2md.h");
}

html2md-dylib.build.cs

我們要添加一個 Rust 項目名.build.cs,讓 UE 認(rèn)到我們的動態(tài)鏈接庫。相關(guān)文檔

using System;
using System.IO;
using UnrealBuildTool;
public class Html2mdDyLib : ModuleRules
{
public Html2mdDyLib(ReadOnlyTargetRules Target) : base(Target)
{
Type = ModuleType.External;
if (Target.Platform == UnrealTargetPlatform.Win64)
{
// 添加頭文件目錄
PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));
// 添加 .lib
PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "target", "release", "html2md_dylib.dll.lib"));
// 添加 .dll
PublicDelayLoadDLLs.Add("html2md_dylib.dll");
// 我們需要將 .dll 文件復(fù)制到這邊
RuntimeDependencies.Add("$(PluginDir)/Binaries/Win64/html2md_dylib.dll");
}
}
}

構(gòu)建 Rust 項目

我們先運(yùn)行構(gòu)建命令

cargo build --release

然后將 html2md_dylib.dll 復(fù)制一份到 插件目錄/Binaries/Win64/html2md_dylib.dll。

這一步可以使用腳本去完成,我這邊就不寫了。

連接 Rust & UE

因為我們 Rust 項目目錄名不符合 UE 的規(guī)范,所以我們要將 html2md-dylib 目錄更改為 Html2mdDyLib,html2md-dylib.build.cs 也需要更為 Html2mdDyLib.build.cs。

將動態(tài)鏈接庫添加到依賴

我們編輯 html2md.build.cs,也就是插件的構(gòu)建腳本。在 PublicDependencyModuleNames 添加 Html2mdDyLibProjects

PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"Html2mdDyLib",
"Projects",
// ... add other public dependencies that you statically link with here ...
}
);

插件加載動態(tài)鏈接庫

html2md.h

插件頭文件中聲明 DLL 句柄

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"

class Fhtml2mdModule : public IModuleInterface
{
void* Html2mdLibraryHandle;

public:

/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};

html2md.cpp

插件加載動態(tài)鏈接庫

如果與本案例命名不同,記得替換代碼中的路徑

// Copyright Epic Games, Inc. All Rights Reserved.

#include "html2md.h"
#include "Core.h"
#include "Modules/ModuleManager.h"
#include "Interfaces/IPluginManager.h"

#define LOCTEXT_NAMESPACE "Fhtml2mdModule"

void Fhtml2mdModule::StartupModule()
{
FString BaseDir = IPluginManager::Get().FindPlugin("html2md")->GetBaseDir();
FString Html2mdLibraryPath = FPaths::Combine(*BaseDir, TEXT("Binaries/Win64/html2md_dylib.dll"));
Html2mdLibraryHandle = !Html2mdLibraryPath.IsEmpty() ? FPlatformProcess::GetDllHandle(*Html2mdLibraryPath) : nullptr;

if (Html2mdLibraryHandle == nullptr)
{
FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("ThirdPartyLibraryError", "Failed to load Html2mdLibrary"));
}
}

void Fhtml2mdModule::ShutdownModule()
{
FPlatformProcess::FreeDllHandle(Html2mdLibraryHandle);
Html2mdLibraryHandle = nullptr;
}

#undef LOCTEXT_NAMESPACE

IMPLEMENT_MODULE(Fhtml2mdModule, html2md)

Text Render 調(diào)用 Rust

終于來到了最后要實現(xiàn)的目標(biāo),我們將調(diào)用 Rust 接口,將返回值顯示在 Text Render 中。

TextRender.cpp

#include "TextRender.h"
#include "Html2mdDyLib/include/UEHtml2md.h"

ATextRender::ATextRender()
{
PrimaryActorTick.bCanEverTick = true;

Text = CreateDefaultSubobject<UTextRenderComponent>(TEXT("Text"));
Text->SetupAttachment(RootComponent);
}

void ATextRender::BeginPlay()
{
Super::BeginPlay();

// 在這里調(diào)用 Rust 接口
const char* text = "https://www.rust-lang.org/";
FString result = FString(load_md_from_url_ffi(text));
Text->SetText(FText::FromString(result)); // 設(shè)置 Text 內(nèi)容

Text->SetRelativeRotation(FRotator(90.f, 180.f, 0.f));
Text->SetTextRenderColor(FColor(0, 255, 225));
Text->SetRelativeScale3D(FVector(2.f, 2.f, 2.f));
}
void ATextRender::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);

}

編譯項目

Visual Studio虛幻引擎 中編譯都可以。

在 UE 中查看效果

我們將 TextRender 拖入場景。

465ca560-807e-11ed-8abf-dac502259ad0.png

運(yùn)行游戲!我們會發(fā)現(xiàn) Text Render 展示了 Rust 官網(wǎng)的內(nèi)容。

46719b64-807e-11ed-8abf-dac502259ad0.png

總結(jié)

通過這次案例,我發(fā)現(xiàn) Rust 可以在 UE 中做很多事情,我只是使用了 html2md 庫作為案例來演示,大家感興趣的話也可以去使用 ws,mysql 等,關(guān)于網(wǎng)絡(luò)通訊、數(shù)據(jù)庫、甚至可以在 Rust 中實現(xiàn)游戲功能的算法、狀態(tài)機(jī)等接入到虛幻引擎中使用。
能用少量并安全的代碼去編寫這些復(fù)雜的功能,何樂而不為呢?

用洛佳大佬的話來說:“如果996了一整天,每個開發(fā)者都無法避免疲憊的自己忘記釋放指針或者釋放了兩次,很有可能一個漏洞就埋下來了。

能用編程語言理論檢查出來漏洞還是好事情。這也不意味著我可以做一個強(qiáng)行檢查 C++ 的編譯器來達(dá)到一樣的效果,因為這種理論要求整個語言要重新設(shè)計,Rust 就是重新設(shè)計的結(jié)果”


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    4083

    瀏覽量

    68540
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1965

    瀏覽量

    39870
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    241

    瀏覽量

    7649

原文標(biāo)題:Rust 在虛幻引擎 5 中的使用

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Perforce 靜態(tài)分析現(xiàn)已正式支持 Rust語言!

    您是否正計劃通過 Rust 編程來提升內(nèi)存安全性,卻又擔(dān)心它無法覆蓋所有的安全漏洞?Perforce QAC 和 Klocwork 現(xiàn)在已支持分析 Rust 代碼,填補(bǔ)了開源代碼檢查工具質(zhì)量和治理工具鏈方面的空白。
    的頭像 發(fā)表于 04-08 15:38 ?443次閱讀
    Perforce 靜態(tài)分析現(xiàn)已正式支持 <b class='flag-5'>Rust</b>語言!

    為什么 VisionFive V1 板上的 JH7100 并存 NVDLA 引擎和神經(jīng)網(wǎng)絡(luò)引擎?

    我想知道為什么 VisionFive V1 板上的 JH7100 并存 NVDLA 引擎和神經(jīng)網(wǎng)絡(luò)引擎,請問?您能否舉一些關(guān)于他們的用例的例子?
    發(fā)表于 03-25 06:01

    請問openssl/libressl 是否已經(jīng)使用硬件加密引擎

    雖然我 rsync / scp / SFTP 其中一個 CPU 內(nèi)核將被 100% 使用,但總帶寬也不是很好。(文件 NVMe 上) 那么,正如標(biāo)題一樣,openssl/libressl 是否已經(jīng)使用了硬件加密引擎?
    發(fā)表于 03-16 08:17

    晶振:光模塊的精密時序引擎

    高速光通信系統(tǒng),光模塊作為光電轉(zhuǎn)換的核心組件,其性能高度依賴于內(nèi)部時鐘信號的穩(wěn)定性。晶振(石英晶體振蕩器)憑借其卓越的頻率穩(wěn)定性和抗干擾能力,成為光模塊不可或缺的“時序引擎”,為
    的頭像 發(fā)表于 03-06 08:20 ?674次閱讀
    晶振:光模塊<b class='flag-5'>中</b>的精密時序<b class='flag-5'>引擎</b>

    虛幻引擎5在建筑可視化的應(yīng)用:趨勢、挑戰(zhàn)與基于Perforce P4的工作流程

    UE5正在重塑建筑可視化:實時交互、AI輔助、BIM聯(lián)動......技術(shù)紅利已來,工作流卻拖了后腿?這篇干貨解析了趨勢和痛點(diǎn),更揭秘了如何用Perforce P4打造高效的UE5工作流。
    的頭像 發(fā)表于 02-27 15:26 ?518次閱讀
    <b class='flag-5'>虛幻</b><b class='flag-5'>引擎</b><b class='flag-5'>5</b>在建筑可視化<b class='flag-5'>中</b>的應(yīng)用:趨勢、挑戰(zhàn)與基于Perforce P4的工作流程

    引擎是什么?

    引擎是光通信系統(tǒng)的核心部件,它是一個集成化的光學(xué)子系統(tǒng),負(fù)責(zé)實現(xiàn)光信號的收發(fā)處理,其性能對系統(tǒng)的信號傳輸有直接影響
    的頭像 發(fā)表于 01-22 17:43 ?1760次閱讀
    光<b class='flag-5'>引擎</b>是什么?

    二維影像掃描引擎門禁二維碼刷卡梯控行業(yè)的應(yīng)用

    在當(dāng)今科技日新月異的時代,二維影像掃描引擎以其卓越的識別性能和廣泛的應(yīng)用領(lǐng)域,成為了門禁系統(tǒng)不可或缺的重要組成部分,尤其二維碼刷卡梯控行業(yè)展現(xiàn)出了非凡的價值。本文將深入探討二維影
    的頭像 發(fā)表于 12-17 15:42 ?500次閱讀
    二維影像掃描<b class='flag-5'>引擎</b><b class='flag-5'>在</b>門禁二維碼刷卡梯控行業(yè)<b class='flag-5'>中</b>的應(yīng)用

    2025開放原子開發(fā)者大會旋武開源社區(qū)Rust分論壇成功舉辦

    11月22日,2025開放原子開發(fā)者大會——旋武開源社區(qū)Rust分論壇北京順利召開。論壇以“共建中國Rust生態(tài)”為核心主題,匯聚京東、華為、vivo、阿里、毛豆教育、DORA社區(qū)及南京大學(xué)等企業(yè)與學(xué)術(shù)機(jī)構(gòu)技術(shù)專家,及眾多
    的頭像 發(fā)表于 11-27 14:55 ?801次閱讀

    硬件加密引擎保障數(shù)據(jù)安全方面有哪些優(yōu)勢呢?

    )。 算法可配置性:部分型號支持算法動態(tài)切換,例如在跨境物聯(lián)網(wǎng)場景,設(shè)備可根據(jù)接入網(wǎng)絡(luò)的區(qū)域要求,通過硬件指令切換至當(dāng)?shù)睾弦?guī)算法(如在國內(nèi)用 SM4,歐美用 AES),無需修改軟件架構(gòu)。 5. 簡化上層
    發(fā)表于 11-17 06:47

    2025開放原子開發(fā)者大會旋武社區(qū)Rust分論壇即將啟幕

    在數(shù)字化轉(zhuǎn)型持續(xù)深化、系統(tǒng)安全與性能需求愈發(fā)迫切的當(dāng)下,Rust憑借強(qiáng)大的內(nèi)存安全、高并發(fā)性能和卓越的開發(fā)者體驗,正成為重塑軟件開發(fā)疆界的關(guān)鍵力量,更是構(gòu)建下一代可靠高效基礎(chǔ)設(shè)施的核心選擇。11月
    的頭像 發(fā)表于 11-13 10:00 ?721次閱讀

    RusT-Thread:基于Rust面向資源受限嵌入式設(shè)備的操作系統(tǒng)的實踐 | 技術(shù)集結(jié)

    RT-Thread為基礎(chǔ),使用Rust語言重構(gòu)其內(nèi)核,形成了全新的RusT-Thread系統(tǒng)。系統(tǒng)采用模塊化架構(gòu),涵蓋內(nèi)核服務(wù)、進(jìn)程調(diào)度、內(nèi)存管理、線程通信與時鐘控制等核心
    的頭像 發(fā)表于 11-07 17:37 ?7058次閱讀
    <b class='flag-5'>RusT</b>-Thread:基于<b class='flag-5'>Rust</b>面向資源受限嵌入式設(shè)備的操作系統(tǒng)的實踐 | 技術(shù)集結(jié)

    光庭信息亮相2025上海虛幻引擎技術(shù)開放日

    專家與前沿科技企業(yè),共同解鎖虛幻引擎(UE)技術(shù)的未來邊界。光庭信息智能座艙事業(yè)部技術(shù)總監(jiān)陳治汽車峰會專場發(fā)表《虛幻引擎助力3D智能座艙從
    的頭像 發(fā)表于 08-28 15:30 ?1436次閱讀

    光庭信息邀您相約2025上海虛幻引擎技術(shù)開放日

    8月22日至23日,備受矚目的2025上海虛幻引擎技術(shù)開放日(Unreal Fest Shanghai 2025)將在上海寶華萬豪酒店隆重舉行。Epic Games創(chuàng)始人兼CEO Tim
    的頭像 發(fā)表于 08-21 16:10 ?1294次閱讀

    RT-Thread 遇上 Rust:安全內(nèi)核 RusT-Thread 的誕生

    大家好,我們是中國科學(xué)技術(shù)大學(xué)操作系統(tǒng)原理與設(shè)計(H)課oooooS小組。這個項目是我們的課程大作業(yè):參考RT-Thread架構(gòu),使用Rust搭建一個原生的嵌入式操作系統(tǒng)內(nèi)核。初識Rust是因為xk
    的頭像 發(fā)表于 08-02 11:03 ?3719次閱讀
    RT-Thread 遇上 <b class='flag-5'>Rust</b>:安全內(nèi)核 <b class='flag-5'>RusT</b>-Thread 的誕生

    請問OpenVINO? 是否支持 Rust 綁定?

    無法確定OpenVINO?是否支持 Rust 綁定。
    發(fā)表于 06-25 07:45
    岳西县| 乐山市| 水富县| 陵川县| 扎兰屯市| 黄山市| 呼伦贝尔市| 大姚县| 汕头市| 福建省| 玛曲县| 阳江市| 资溪县| 西城区| 延川县| 竹溪县| 霸州市| 南川市| 岳西县| 轮台县| 武城县| 成安县| 从化市| 科技| 通山县| 顺平县| 洪江市| 连南| 吉水县| 江孜县| 方山县| 宝丰县| 陇川县| 平遥县| 宿州市| 株洲县| 府谷县| 昌黎县| 兴化市| 伊川县| 潼南县|