18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuà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++ 去寫關于數(shù)據(jù)庫操作、加密操作等容易引發(fā)安全漏洞的代碼。所以我在昨天開始了這個計劃,使用了 Rust 的 html2md 的庫在 UE 中使用,效果圖如下。

開工

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

我們要實現(xiàn)的功能就是在 Level 放置一個 Text Render。
游戲開始階段,這個
Text Render 就會拉取 Rust 官網(wǎng)頁面,并將它轉為 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,并修改它的顏色、旋轉、縮放等屬性。

#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++ 源碼同級運行以下命令創(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 轉為 Markdown
html2md = "0.2.14"
# 用于進行 HTTP 請求
reqwest = { version = "0.11.13", features = ["blocking"] }

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

src/md_loader.rs

在這里我們實現(xiàn)一個從 HTTP 請求拉取 HTML 并轉為 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ù)導出,這樣在動態(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

我們需要使用到構建腳本來幫我們生成 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 認到我們的動態(tài)鏈接庫。相關文檔

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 文件復制到這邊
RuntimeDependencies.Add("$(PluginDir)/Binaries/Win64/html2md_dylib.dll");
}
}
}

構建 Rust 項目

我們先運行構建命令

cargo build --release

然后將 html2md_dylib.dll 復制一份到 插件目錄/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,也就是插件的構建腳本。在 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)的目標,我們將調(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)); // 設置 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

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

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

總結

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

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

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


審核編輯 :李倩


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

    關注

    7

    文章

    3984

    瀏覽量

    67546
  • 編程語言
    +關注

    關注

    10

    文章

    1957

    瀏覽量

    38606
  • Rust
    +關注

    關注

    1

    文章

    237

    瀏覽量

    7454

原文標題:Rust 在虛幻引擎 5 中的使用

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

    信而泰×DeepSeek:AI推理引擎驅動網(wǎng)絡智能診斷邁向 “自愈”時代

    定位到出口路由器端口存在大量物理層錯誤計數(shù),更換光模塊后,故障立即排除,業(yè)務完全恢復正常。此案例充分驗證了AI推理引擎復雜網(wǎng)絡故障診斷精準定位根因、大幅提升排障效率的核心價值。
    發(fā)表于 07-16 15:29

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

    無法確定OpenVINO?是否支持 Rust 綁定。
    發(fā)表于 06-25 07:45

    ?Diffusion生成式動作引擎技術解析

    Diffusion生成式動作引擎 Diffusion生成式動作引擎是一種基于擴散模型(Diffusion Models)的生成式人工智能技術,專注于生成連續(xù)、逼真的人類動作或動畫序列。這類引擎
    的頭像 發(fā)表于 03-17 15:14 ?2554次閱讀

    基于SEGGER的Ozone調(diào)試器和J-Trace工具跟蹤Ferrocene的Rust應用

    2025年3月,SEGGER和Ferrous Systems合作,確保使用Ferrous Systems的Ferrocene工具鏈編譯的Rust應用程序可以通過SEGGER的J-Trace工具實時下載分析。
    的頭像 發(fā)表于 03-14 11:27 ?1059次閱讀

    vivo打造最具影響力Rust賽事,點亮基礎軟件事業(yè)的“藍河時代”

    藍河操作系統(tǒng)創(chuàng)新賽,看見中國Rust生態(tài)的匯聚與發(fā)展
    的頭像 發(fā)表于 02-27 15:08 ?2050次閱讀
    vivo打造最具影響力<b class='flag-5'>Rust</b>賽事,點亮基礎軟件事業(yè)的“藍河時代”

    二維影像掃描引擎可以應用于哪些行業(yè)?

    二維影像掃描引擎,作為自動識別技術的重要組成部分,以其高效、精準的掃描能力,多個行業(yè)領域內(nèi)展現(xiàn)出廣泛的應用前景。這些引擎不僅提升了數(shù)據(jù)采集的效率和準確性,還推動了各行業(yè)的數(shù)字化轉型進程。零售業(yè):
    的頭像 發(fā)表于 02-14 14:59 ?776次閱讀
    二維影像掃描<b class='flag-5'>引擎</b>可以應用于哪些行業(yè)?

    JavaScript與Rust和WebAssembly集成

    偶然一次機會,接觸了Rust的代碼。當時想給團隊小伙伴做演示,發(fā)現(xiàn)自己并不能在移動端按照文檔生成演示demo。我就想,要是Rust代碼能轉化成JavaScript就好了。結果一搜,還真有。
    的頭像 發(fā)表于 01-24 15:43 ?703次閱讀
    JavaScript與<b class='flag-5'>Rust</b>和WebAssembly集成

    什么是AI查詢引擎

    AI 查詢引擎可高效處理、存儲和檢索大量數(shù)據(jù),以增強生成式 AI 模型的輸入。
    的頭像 發(fā)表于 01-10 10:00 ?1990次閱讀

    容器引擎是什么意思

    容器引擎是一種虛擬化技術,它利用操作系統(tǒng)的內(nèi)核來實現(xiàn)對應用程序的隔離和打包,使得應用程序可以不同的環(huán)境運行而無需修改代碼。主機推薦小編為您整理發(fā)布容器引擎是什么意思,以下是關于容器
    的頭像 發(fā)表于 01-09 09:49 ?581次閱讀

    常見的容器云服務引擎有哪些?

    常見的容器云服務引擎有哪些?云服務引擎涵蓋數(shù)據(jù)庫、數(shù)據(jù)存儲、數(shù)據(jù)處理、數(shù)據(jù)分析、容器云、機器學習及數(shù)據(jù)集成等多個領域,提供一站式解決方案。云服務引擎是云計算領域的重要組成部分,它們提供了各種服務來幫助用戶構建、部署和管理應用程序
    的頭像 發(fā)表于 01-07 09:49 ?571次閱讀

    使用 AMD Versal AI 引擎釋放 DSP 計算的潛力

    “Versal AI 引擎可以降低功耗預算的情況下提高 DSP 計算密度,”高級產(chǎn)品營銷經(jīng)理 Udayan Sinha 表示。這種效率使 Versal AI 引擎能夠嚴格的功耗預算
    的頭像 發(fā)表于 11-29 14:07 ?1581次閱讀

    普源示波器5G通信技術的應用

    、信噪比等,對于確保5G系統(tǒng)的穩(wěn)定運行和性能優(yōu)化至關重要。普源示波器作為一款國產(chǎn)示波器,憑借其不斷提升的性能和功能,5G通信測試領域展現(xiàn)出強大的競爭力,成為眾多研發(fā)機構和運營商的首選設備之一。 普源示波器
    的頭像 發(fā)表于 11-27 16:42 ?964次閱讀
    普源示波器<b class='flag-5'>在</b><b class='flag-5'>5</b>G通信技術<b class='flag-5'>中</b>的應用