日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中获取蓝图组件_蓝图C++混合编程

發布時間:2025/3/12 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中获取蓝图组件_蓝图C++混合编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注意事項

1)模塊接口(API):對于一些需要被模塊外部訪問的函數和類,需要通過 *_API 的宏標記出來。每個被暴露在外的單項都會帶來編譯時間的額外消耗,因此請務必僅暴露出必須暴露的接口。如果外部只需要訪問一個類中的某個函數,那么比起暴露整個類而言,僅暴露出這個函數能夠節省出相當可觀的編譯時間。

2)在最最基本的層面上,任意可以被放置到關卡中的游戲物體都是一個 Actor。所有的 Actor 都是繼承于 AActor 類,該類是所有可生成的游戲對象的基類。

3)Actor類里,PrimaryActorTick.bCanEverTick = true;// 將該Actor設置為每幀調用一次Tick()。如果您沒有這個需要,可以將其關閉來改善性能。

在vc里定義一個能在編輯器下直接訪問的屬性

新建一個c++的Actor類

構造函數中設置上面兩個變量的默認值

在vc里定義一個能被藍圖調用的函數

注:UFUNCTION里的函數不支持重載;

將藍圖里的參數傳遞到C++

name,text,string之間的相互轉換

藍圖中的類型轉換

C++中的類型轉換

C++里調用藍圖里的函數

在C++創建一個能被藍圖調用的算數節點

藍圖里調用C++函數

注:只能在繼承自本C++類的藍圖里調用;

調用時,如果函數里的參數里有結構體,該結構體在定義時需要加上BlueprintType關鍵字,且本函數需要有函數體

自定義枚舉

UE4實例的獲取

創建C++基礎類

選擇gameMode,并保存關卡

gameMode下需要加載的類

gameMode中加載上面創建的類

上圖中的6個類,再加上gameInstance總共7個類,每個類文件里加一個打印函數

獲取到實例后的運行效果如下圖

代碼如下

//?Fill?out?your?copyright?notice?in?the?Description?page?of?Project?Settings.

#include?"TestActor001.h"

#include?"testvcGameModeBase.h"

#include?"PikaPlayerState.h"

#include?"PikaPawn.h"

#include?"PikaGameStateBase.h"

#include?"PikaPlayerController.h"

#include?"PikaHUD.h"

#include?"PikaGameInstance.h"

//?Sets?default?values

ATestActor001::ATestActor001()

{

//?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?ATestActor001::BeginPlay()

{

Super::BeginPlay();

EventCurrent();

//通過GetWorld來獲取實例

if?(GetWorld())

{

//GameMode

AtestvcGameModeBase?*pikaqiuGameMode?=?Cast(GetWorld()->GetAuthGameMode());

if?(pikaqiuGameMode)

{

pikaqiuGameMode->pikaPrint("pikaqiuGameMode");

}

//PikaPlayerState

APikaPlayerState?*pikaPlayerStateVar?=?Cast(GetWorld()->GetFirstPlayerController()->PlayerState);

if?(pikaPlayerStateVar)

{

pikaPlayerStateVar->pikaPrint("pikaPlayerState");

}

//PikaPlayerController

APikaPlayerController?*pikaPlayerControllerVar?=?Cast(GetWorld()->GetFirstPlayerController());

if?(pikaPlayerControllerVar)

{

pikaPlayerControllerVar->pikaPrint("pikaPlayerController");

}

//pikaPawn

APikaPawn?*pikaPawnVar?=?Cast(GetWorld()->GetFirstPlayerController()->GetPawn());

if?(pikaPawnVar)

{

pikaPawnVar->pikaPrint("pikaPawn");

}

//pikaHUD

APikaHUD?*pikaHUDVar?=?Cast(GetWorld()->GetFirstPlayerController()->GetHUD());

if?(pikaHUDVar)

{

pikaHUDVar->pikaPrint("pikaHUD");

}

//pikaGameStateBase

APikaGameStateBase?*pikaGameStateBaseVar?=?Cast(GetWorld()->GetGameState());

if?(pikaGameStateBaseVar)

{

pikaGameStateBaseVar->pikaPrint("pikaGameStateBase");

}

//pikaGameInstance

UPikaGameInstance?*pikaGameInstanceVar?=?Cast(GetWorld()->GetGameInstance());

if?(pikaGameInstanceVar)

{

pikaGameInstanceVar->pikaPrint("pikaGameInstance");

}

}

}

//?Called?every?frame

void?ATestActor001::Tick(float?DeltaTime)

{

Super::Tick(DeltaTime);

}

float?ATestActor001::pikaFloat(float?pika1,?float?pika2)

{

return?false;

}

actor實例之間的相互獲取

從PikaActorA里獲取PikaActorB和PikaActorC的實例

創建三個c++的actor類,并為每個acotr創建一個基于本類的藍圖類

PikaActorB和PikaActorC里各加兩個打印函數

注:GEngine需要包含Engine.h頭文件;

藍圖的加載方式里,需要在藍圖里指定要獲取的實例

運行效果如下:

加了迭代后的效果如下:

PikaActorA里的代碼如下:

//?Fill?out?your?copyright?notice?in?the?Description?page?of?Project?Settings.

#pragma?once

#include?"CoreMinimal.h"

#include?"GameFramework/Actor.h"

#include?"PikaActorB.h"

#include?"PikaActorC.h"

#include?"PikaActorA.generated.h"

UCLASS()

class?PIKAQIUTEST_API?APikaActorA?:?public?AActor

{

GENERATED_BODY()

public:

//?Sets?default?values?for?this?actor's?properties

APikaActorA();

protected:

//?Called?when?the?game?starts?or?when?spawned

virtual?void?BeginPlay()?override;

public:

//?Called?every?frame

virtual?void?Tick(float?DeltaTime)?override;

//從pikaActorA中獲取pikaActorB和pikaActorC的實例

//方法一

UPROPERTY(EditAnywhere,?BlueprintReadWrite,?Category?=?UI)

APikaActorB?*pikaActorBvar;

//方法二

TSubclassOf?getInstanceForC;

//APikaActorC?*pikaActorCvar;

//通過迭代來獲取場景中的實例

void?GetInstanceFor();

void?pikaPrint(FString?pikaStr);

void?pikaPrintSelf();

};

-------------------上面的PikaActorA.h文件,下面的PikaActorA.cpp文件

//?Fill?out?your?copyright?notice?in?the?Description?page?of?Project?Settings.

#include?"PikaActorA.h"

#include?"Engine.h"

//?Sets?default?values

APikaActorA::APikaActorA()

{

//?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;

static?ConstructorHelpers::FClassFinder?pikaActorCTemp(TEXT("/Game/MyPikaActorC"));

getInstanceForC?=?pikaActorCTemp.Class;

}

//?Called?when?the?game?starts?or?when?spawned

void?APikaActorA::BeginPlay()

{

Super::BeginPlay();

if?(GetWorld())

{

//從pikaActorA中獲取pikaActorB的實例,該方法需要在藍圖下指定要獲取的實例

if?(pikaActorBvar)

{

APikaActorB?*pikaActorBInstance?=?Cast(pikaActorBvar);

if?(pikaActorBInstance)

{

pikaActorBInstance->pikaPrintSelf();

}

}

//從pikaActorA中獲取pikaActorC的實例,需要在上面的構造函數里獲取pikaActorC實例的路徑

AActor?*pikaActorCvar?=?GetWorld()->SpawnActor(getInstanceForC,?FVector::ZeroVector,?FRotator::ZeroRotator);

if?(pikaActorCvar)

{

APikaActorC?*pikaActorCInstance?=?Cast(pikaActorCvar);

if?(pikaActorCInstance)

{

pikaActorCInstance->pikaPrintSelf();

}

}

}

//調用迭代獲取實例的函數

GetInstanceFor();

}

//?Called?every?frame

void?APikaActorA::Tick(float?DeltaTime)

{

Super::Tick(DeltaTime);

}

void?APikaActorA::GetInstanceFor()

{

AActor?*tempPointer?=?NULL;

//TObjectIterator它可以獲取的到我們場景里面的Object實例

int?pikaInt?=?0;

for?(TObjectIteratorIt;It;++It)

{

tempPointer?=?*It;

if?(tempPointer)

{

APikaActorA?*pikaActorAInstance?=?Cast(tempPointer);

if?(pikaActorAInstance)

{

pikaActorAInstance->pikaPrintSelf();

}

APikaActorB?*pikaActorBInstance?=?Cast(tempPointer);

if?(pikaActorBInstance)

{

pikaActorBInstance->pikaPrintSelf();

}

APikaActorC?*pikaActorCInstance?=?Cast(tempPointer);

if?(pikaActorCInstance)

{

pikaActorCInstance->pikaPrintSelf();

}

}

++pikaInt;

}

pikaPrint(FString::FromInt(pikaInt));

};

void?APikaActorA::pikaPrint(FString?pikaStr)

{

if?(GEngine)

{

GEngine->AddOnScreenDebugMessage(-1,?10.0f,?FColor::Red,?pikaStr);

}

};

void?APikaActorA::pikaPrintSelf()

{

pikaPrint("PikaActorA");

}

寫一個能被藍圖調用的C++類

1)創建一個藍圖函數類

總結

以上是生活随笔為你收集整理的c++中获取蓝图组件_蓝图C++混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。