c++中获取蓝图组件_C++和蓝图
C++和藍圖
概述
藍圖可以繼承C++類,從而使得程序員可以在代碼中創建新的游戲性類,而關卡設計人員可以使用藍圖來繼承該類并對其進行修改。
有很多種修飾符可以改變C++類和藍圖系統間交互方式,其中某些修飾符會在本示例中突出介紹。
類設置
在類設置的第一部分中,使用C++類向導
創建一個名稱為LightSwitchBoth 的類。
LightSwitchBoth類中的大部分代碼設置都和 僅使用C++的LightSwitch示例
類似。盡管您可以讓一個藍圖繼承LightSwitchCodeOnly類,
但藍圖圖表并不能訪問該類中創建的組件、屬性及函數。該示例將使用 UPROPERTY() 和 UFUNCTION() 修飾符,這兩個修飾符使得LightSwitchBoth作為繼承它的藍圖的模板。
您會發現首先參考下 僅使用C++的LightSwitch示例
是有用的,這樣您可以看下如何設置頭文件及源文件
來創建LightSwitchComponent、SphereComponent、DesiredBrightness屬性及OnOverlap函數。
這個頭文件是從 僅使用C++的LightSwitch示例
改編而來,添加了以下功能:PointLightComponent和SphereComponent是BlueprintReadOnly(僅藍圖可讀的),并且將顯示在 我的藍圖 選卡中的 Switch Components(切換組件) 類目中。
OnOverlap現在是一個BlueprintNativeEvent,將會顯示在 我的藍圖 選卡中的 Switch Functions(切換函數) 類目中。
DesiredBrightness是BlueprintReadWrite(藍圖可讀寫的),將顯示在 我的藍圖 選卡中的 Switch Properties(切換屬性) 類目中。
DesiredBrightness現在是EditAnywhere(隨處可編輯的),而不是VisibleAnywhere(隨處可見的)。
UCLASS() 宏有個 Blueprintable 修飾符。在這個示例中,該修飾符不是必須的,因為LightSwitchBoth直接繼承Actor,而Actor是Blueprintable(可藍圖化的),所以LightSwitchBoth會繼承該修飾符。
加上 UPROPERTY() 和 UFUNCTION() 宏中的額外修飾符,LightSwitchBoth類的頭文件如下所示:
LightSwitchBoth.h
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "LightSwitchBoth.generated.h"
/**
*
*/
UCLASS()
class ALightSwitchBoth : public AActor
{
GENERATED_UCLASS_BODY()
/** point light component */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")
TSubobjectPtr PointLight1;
/** sphere component */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")
TSubobjectPtr Sphere1;
/** called when something overlaps the sphere component */
UFUNCTION(BlueprintNativeEvent, Category="Switch Functions")
void OnOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
/** the desired brightness for the light */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Switch Properties")
float DesiredBrightness;
};
在LightSwitchBoth的源文件中,構造器仍然是一樣的。但是,需要對 OnOverlap 函數做一點修改。這個函數現在是一個BlueprintNativeEvent。這意味著
在繼承這個類的藍圖中,可以放置一個覆蓋 OnOverlap 的事件,當正常調用該函數時會執行此事件。如果該事件不存在,那么則是執行那個函數的
C++實現。要想使這個設置正常工作,該C++函數需要重命名為 OnOverlap_Implementation 。稍后在本示例中將介紹這個藍圖設置。對 OnOverlap 函數
進行了修改后,LightSwitchBoth 的源文件如下所示:
LightSwitchBoth.cpp
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#include "BasicClasses.h"
#include "LightSwitchBoth.h"
ALightSwitchBoth::ALightSwitchBoth(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
DesiredBrightness = 15.0f;
PointLight1 = ObjectInitializer.CreateDefaultSubobject(this, "PointLight1");
PointLight1->Brightness = DesiredBrightness;
PointLight1->bVisible = true;
RootComponent = PointLight1;
Components.Add(PointLight1);
Sphere1 = ObjectInitializer.CreateDefaultSubobject(this, TEXT("Sphere1"));
Sphere1->InitSphereRadius(250.0f);
Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something
Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something
Sphere1->AttachParent = RootComponent;
Components.Add(Sphere1);
}
void ALightSwitchBoth::OnOverlap_Implementation(AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
if ( OtherActor && (OtherActor != this) && OtherComp )
{
PointLight1->ToggleVisibility();
}
}
當創建類時,新的 UCLASS() 、UFUNCTION() 和/或 UPROPERTY() 宏意味著該代碼必須在Visual Studio 或Xcode中進行編譯,然后使用虛幻編輯器重新加載它們。
關閉虛幻編輯器,在Visual Studio 或Xcode中編譯該項目,然后打開編輯器并重新加載該項目,以確保正確地重新加載該游戲模塊。同時,需要注意的一點是,
要確保 Build Configuration(版本配置) 和您打開該項目使用的虛幻編輯器可執行文件的版本一致。 請在
編譯游戲項目
文檔中閱讀關于編譯配置及編譯項目的更多信息。
當重新打開虛幻編輯器并重新打開您的項目后,便可以創建
一個新的類藍圖
了。
在本示例中,選擇LightSwitchBoth作為該藍圖的父類,藍圖名稱為 LightSwitchBoth_BP 。
在 C++代碼中添加的PointLightComponent和SphereComponent 也會顯示在 Blueprint Editor(藍圖編輯器) 的 組件模式
中的 Components(組件) 選卡內。
它們的圖標是深藍色,表示它們是從父類LightSwitchBoth類繼承而來的原生組件。而剛剛添加到 LightSwitchBoth_BP 藍圖中的新組件的圖標
是淺藍色的。關于使用 Components(組件) 選卡添加及排列組件的更多信息,請參照 組件
選卡文檔。
Blueprint Editor(藍圖編輯器) 的 圖表模式
是藍圖編輯的核心。在 Graph Mode(圖表) 模式中,您可以在我的藍圖
選卡中添加新變量
、
函數
及宏
。您也可以訪問該類藍圖中包含的
所有 圖表
。在這些圖表中,各種節點
連接到一起,來創建由類屬性、游戲事件、甚至Actor的周邊環境
驅動的設計及游戲功能。
在 Graph Mode(圖標模式) 中, My Blueprint(我的藍圖) 選卡顯示了在C++中添加到LightSwitchBoth類中的 PointLightComponent 和SphereComponent 。這是因為 BlueprintReadOnly 修飾符存在的緣故。
通過在 我的藍圖 選卡中點擊并拖拽這些組件的名稱到圖表中,可以將這些組件的節點添加到圖表中。然后,您可以把這些節點連接到改變像可見性
或光源顏色這樣屬性的節點上。DesiredBrightness 屬性也會出現在 我的藍圖 選卡中。因為它是一個屬性,而不是一個組件,所以可以使用 BlueprintReadWrite
修飾符。這意味著在藍圖圖表中可以創建節點來獲取及設置 DesiredBrightness 的值。請參照 我的藍圖
文檔來獲得一般的應用信息。
默認情況下,可能不會顯示父類LightSwitchBoth的組件和屬性。因為當選中 我的藍圖 選卡底部的 Show user-created variables only(僅顯示用戶創建的變量) 復選框時,
會隱藏從父類繼承的屬性。顯示所有變量
僅顯示用戶創建的變量
有兩個圖表用于設置 LightSwitchBoth_BP 類的行為。第一個是構造腳本
圖表,它包含了一個專用的 Construction Script(構建腳本)
事件。如果沒有該 Construction Script 設置,那么新的 LightSwitchBoth_BP Actor 將僅使用LightSwitchBoth的構造函數。然而,當Actor在關卡中移動時,及當
Desired Brightness 發生改變時,都會執行 Construction Script 。使用 Construction Script 意味著,可以輕松地改變暴露給藍圖的Actor屬性,
并且可以快速地看到這些修改的效果。
在 LightSwitchBoth_BP 類中, Construction Script 事件連接到了 Set Brightness 節點上,以便當在關卡中添加或移動Actor時或者 Desired Brightness 發生改變時,將 Point Light 1 (PointLightComponent) 的亮度設置為
Desired Brightness 的值。
LightSwitch_BPOnly 類中設置的另一個圖表是 事件圖表
。EventGraph的執行是由事件觸發的。在這個示例中,
任何時候當調用C++函數 OnOverlap 時, OnOverlap 就會執行。在LightSwitchBoth的源文件中,設置了代理,以便當一個Actor進入或離開SphereComponent時會執行 OnOverlap 。
Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something
Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something
OnOverlap 事件節點連接到了 Set Light Color 節點上。任何時候當執行該事件時,它都將會把PointLightComponent的光源顏色設置為一個隨機顏色。這覆蓋了
源碼文件中用于切換的PointLightComponent可見性的 OnOverlap_Implementation 函數。
關于事件及處理圖表的更多信息,請參照事件
、 事件圖表
和事件模式
文檔。
在變量的設置中, DesiredBrightness 變量設置為 EditAnywhere (隨處可編輯) ,所以在 藍圖編輯器 的默認模式
中它是可見的,并且可以進行編輯。
這意味著對于類的每個實例,這個變量是可以變化的,所以每個Actor可以有其自己的 DesiredBrightness 。因為 DesiredBrightness 也是 BlueprintReadWrite(藍圖可讀寫) 的,且
Construction Script 中使用了它,所以更新它還會導致再次執行 Construction Script 。
其他Class Blueprints(類藍圖)可以繼承由藍圖創建的類,通過以下兩種方式實現:使用 Class Viewer(類別查看器) 中的類附近的下拉列表按鈕來創建一個新藍圖,
或者通過右擊該藍圖并選擇 Create New Blueprint Based on This(基于此藍圖創建一個新藍圖) 。
類藍圖 LightSwitchBoth_BP 位于 內容瀏覽器
中,您可以從那里將其拖拽到關卡內。它也存在于 類別查看器
中。
關于使用 內容瀏覽器 或 類別查看器 在關卡放置Actor的更多信息,請參照放置Actor
文檔。
總結
以上是生活随笔為你收集整理的c++中获取蓝图组件_C++和蓝图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.1.3 毫米波雷达
- 下一篇: C/C++中的函数参数传递机制 作者:杨