色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Rust在虛幻引擎5中的使用

jf_wN0SrCdH ? 來源:Rust語言中文社區 ? 作者:Rust語言中文社區 ? 2022-12-21 11:05 ? 次閱讀

前言

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

開工

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

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

創建 UE 項目

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

創建 UE 插件

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

我們創建一個空白插件,插件名隨意,我這邊就叫 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);

}

創建 Rust 項目

我們 Rust 項目要創建在 UE 插件項目目錄下。找到插件源碼目錄,與 C++ 源碼同級運行以下命令創建項目。

cargo new --lib html2md-dylib

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

Cargo.toml

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

# 將庫打包成動態鏈接庫
[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

在這里我們實現一個從 HTTP 請求拉取 HTML 并轉為 Markdown 的實現。

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

將函數導出,這樣在動態鏈接庫中就可以調用這個函數了。

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 認到我們的動態鏈接庫。相關文檔

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 的規范,所以我們要將 html2md-dylib 目錄更改為 Html2mdDyLibhtml2md-dylib.build.cs 也需要更為 Html2mdDyLib.build.cs

將動態鏈接庫添加到依賴

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

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

插件加載動態鏈接庫

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

插件加載動態鏈接庫

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

// 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 調用 Rust

終于來到了最后要實現的目標,我們將調用 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();

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

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

運行游戲!我們會發現 Text Render 展示了 Rust 官網的內容。

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

總結

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

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

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


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3845

    瀏覽量

    64596
  • 編程語言
    +關注

    關注

    10

    文章

    1950

    瀏覽量

    34906
  • Rust
    +關注

    關注

    1

    文章

    230

    瀏覽量

    6641

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

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

收藏 人收藏

    評論

    相關推薦

    JavaScript與Rust和WebAssembly集成

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

    容器引擎是什么意思

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

    如何用Rust編寫一個ChatGPT桌面應用(保姆級教程)

    用IDEA開發的java仔) 安裝 Rust 語言工具鏈:首先,請確保你已安裝了 Rust 編程語言工具鏈,包括 Rust 編譯器 (rustc) 和包管理工具 (cargo)。可以通過訪問
    的頭像 發表于 09-25 11:19 ?394次閱讀
    如何用<b class='flag-5'>Rust</b>編寫一個ChatGPT桌面應用(保姆級教程)

    C2000?器件的CRC引擎

    電子發燒友網站提供《C2000?器件的CRC引擎.pdf》資料免費下載
    發表于 08-30 10:38 ?1次下載
    C2000?器件<b class='flag-5'>中</b>的CRC<b class='flag-5'>引擎</b>

    未來嵌入式系統的黃金搭檔 MCX N947遇上Rust

    基于 Rust 的安全性和性能引入了 RustRust 有很多優勢,內存安全、并發安全、生態系統、包管理與構建管理,同時也有與 C/C++ 相同等級的性能。Rust 通過強化所有權
    的頭像 發表于 07-25 09:14 ?1392次閱讀
    未來嵌入式系統的黃金搭檔 MCX N947遇上<b class='flag-5'>Rust</b>

    Vector和HighTec推出基于Rust和AUTOSAR Classic實現安全應用的解決方案

    Vector和HighTec兩家公司成功展示了Rust應用程序與基于C語言的AUTOSAR Classic基礎軟件的集成,這在行業內還屬首次。這樣一來,Rust及其優勢可以被應用在有最高功能安全要求的汽車ECU
    的頭像 發表于 07-17 14:42 ?838次閱讀
    Vector和HighTec推出基于<b class='flag-5'>Rust</b>和AUTOSAR Classic實現安全應用的解決方案

    esp32s3開發時,每次改動,rust編譯的時間都很長為什么?

    esp32s3 開發時,每次改動,rust編譯時間太長
    發表于 06-05 06:36

    Linux 6.10集成RISC-V更新,支持Rust編程語言

    本次補丁升級,Linux內核進一步擴展了對應于RISC-V架構的Rust編程語言支持。在此之前,Rust已可應用在x86_64、龍芯LoongArch以及ARM64等多種架構之上。
    的頭像 發表于 05-23 17:16 ?1009次閱讀

    Aurix Tc375Lk上使用Rust編程語言可以嗎?

    您好,如果我想在 Aurix Tc375Lk 上使用 Rust 編程語言,可以嗎?如果是,鏈接 rust 編譯器 ADS 和 freetoolchain 的步驟是什么?你有 ADS 或 freetoolchian
    發表于 05-17 13:42

    嵌入式系統中集成Rust和Qt的實踐

    Rust 擁有豐富的庫生態系統,用于序列化和反序列化、異步操作、解析不安全輸入、線程、靜態分析等,而 Qt 是一個 C++ 工具包,支持跨各種平臺的豐富的、基于 GUI 的應用程序,從 iOS 到嵌入式Linux。Qt 應用程序包括表示業務邏輯的 C++ 插件
    發表于 05-03 10:26 ?1875次閱讀
    <b class='flag-5'>在</b>嵌入式系統中集成<b class='flag-5'>Rust</b>和Qt的實踐

    Rust效率領先C++兩倍,內存安全成國家安全議題

    這項發現由谷歌安卓平臺工具及庫的工程總監Lars Bergstrom日前召開的Rust Nation英國峰會揭示。盡管此前業內對Rust的安全性和穩定性存在一定爭議,特別是其‘unsafe’關鍵字的存在令人擔憂。
    的頭像 發表于 04-01 15:37 ?976次閱讀

    Flat2VR Studios成立,專注于開發和移植商業化VR游戲

    據了解,Flat2VR也研發出開源UEVR工具,以便為使用虛幻4/5引擎的游戲設計VR Mod。然而,先前社區的游戲項目未獲官方授權。
    的頭像 發表于 03-18 15:07 ?774次閱讀

    [鴻蒙]OpenHarmony4.0的Rust開發

    背景 Rust 是一門靜態強類型語言,具有更安全的內存管理、更好的運行性能、原生支持多線程開發等優勢。Rust 官方也使用 Cargo 工具來專門為 Rust 代碼創建工程和構建編譯
    的頭像 發表于 02-26 17:28 ?947次閱讀
    [鴻蒙]OpenHarmony4.0的<b class='flag-5'>Rust</b>開發

    谷歌捐款100萬美元給Rust基金會,以增強C++與Rust的交互性

    如今,谷歌多項核心業務仍以 C++為主要編程語言,雖然無法直接使用Rust替代現有的C++程序,但谷歌依然選擇支持Rust基金會的“Interop Initiative”計劃,幫助那些選用C++的機構更為順暢地過渡至Rust上。
    的頭像 發表于 02-19 15:41 ?693次閱讀

    鴻蒙OS之Rust開發

    Rust是一門靜態強類型語言,具有更安全的內存管理、更好的運行性能、原生支持多線程開發等優勢。
    的頭像 發表于 01-29 17:19 ?1019次閱讀
    主站蜘蛛池模板: 97精品国偷拍自产在线 | 在野外被男人躁了一夜动图 | 免费精品国偷自产在线在线 | 免费精品国产日韩热久久 | 精品久久伦理中文字幕 | 性欧美xxxxporn | 国产精品A久久久久久久久 国产精品A久久777777 | 国产久青青青青在线观看 | 国产精品嫩草影院一区二区三区 | 亚洲一区高清 | 日本妈妈在线观看中文字幕 | 白丝女仆被啪到深夜漫画 | 欧美日韩一级黄色片 | 窝窝色资源站 | 十八禁久久成人一区二区 | 手机看片国产免费 | 亚洲人视频在线 | 九色PORNY真实丨国产大胸 | 免费看的一级毛片 | 一起洗澡的老师免费播放 | 香蕉eeww99国产精选播放 | 亚洲免费视频日本一区二区 | 免费国产网站 | 日本一卡二卡三卡四卡无卡免费播放 | 久久视热频国产这里只有精品23 | 久久亚洲精品中文字幕60分钟 | 激情办公室 | 伦理片秋霞免费影院 | 97精品在线 | 蜜柚视频在线观看全集免费观看 | 涩涩电影网 | 相声flash| 被同桌摸出水来了好爽的视频 | 国产 在线 亚洲 欧美 动漫 | 天美传媒在线完整免费观看网站 | 拍床戏被肉高H纯肉H在水 | 欧美麻豆一精品一AV一免费 | 嗯别插太快好深再深点 | 757一本到午夜宫 | 97欧美精品大香伊蕉在人线 | 狠狠色综合7777久夜色撩人 |