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++混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: gc日志一般关注什么_GC日志说明
 - 下一篇: python元组赋值给变量,Python