Construction Script based on C++

c++
Каждый раз, когда вы делаете изменения по отношении к Blueprint actor (например, перетаскиваете его в другое место на вашей карте), в этот момент запускается Construction Script. Этот скрипт содержит код, которые отвечает за определенные операции инициализации. Использование Construction Script может ускорить некоторые операции, например, вы можете создать актора, который генерирует случайную листву на вашей карте, тем самым помогая вам или вашему дизайнеру уровня.
В этом посте я буду создавать Construction Script в С++ который будет создавать модели вокруг помещенного актора на основе заданных значений. Вот конечный результат:(видео на оригинальной странице)

Preparing an Actor
Добавьте новый С++ класс, основанный на классе Actor и внутри заголовочного файла (.h), введите следующий код:

Code


/*The static mesh of our actor*/
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* SM;

/*The random location of our component will get generated based on
a given X and Y from within our editor.*/

/*The max x of the location vector that the static mesh will be spawned*/
UPROPERTY(EditAnywhere, Category="Construction")
float XThreshold;

/*The max y of the location vector that the static mesh will be spawned*/
UPROPERTY(EditAnywhere, Category = "Construction")
float YThreshold;

/*The number of meshes/components that will get spawned*/
UPROPERTY(EditAnywhere, Category = "Construction")
int32 NumToSpawn;

/*A random seed. Editing this, the editor will generate
new random locations*/
UPROPERTY(EditAnywhere, Category = "Construction")
int32 RandomSeed;

/*An array containing references of the spawned components
This will be used in order to delete old components in case we decide to
tinker with the NumToSpawn parameter*/
TArray SMArray;

[свернуть]
Теперь перейдите в sourse файлу, и внутри вашего типа конструктора добавьте следующий код:
Code


//Create a Static Mesh for our Actor
SM = CreateDefaultSubobject(TEXT("StaticMesh"));
SetRootComponent(SM);

[свернуть]
Скомпилируйте код, и теперь можете создавать Blueprint, основанный на вашем классе который мы добавили выше. Теперь не забудьте назначить статический меш для параметра SM. Теперь мы готовы к созданию сценария построения.

Creating a construction script

Вернемся в заголовочный файл вашего С++ класса и добавим следующие строки:

Code


virtual void OnConstruction(const FTransform& Transform) override;

[свернуть]
После этого, переключаемся на исходный файл (sourse file) и вводим следующие реализации вышеупомянутой функции:
Code


void AConstructionActor::OnConstruction(const FTransform & Transform)
{
//Empty the array and delete all it's components
for (auto It = SMArray.CreateIterator(); It; It++)
{
(*It)->DestroyComponent();
}

SMArray.Empty();

//Register all the components
RegisterAllComponents();
//The base name for all our components
FName InitialName = FName("MyCompName");

for (int32 i = 0; i < NumToSpawn; i++) { //Create a new Component //The first parameter is the "parent" of the our new component UStaticMeshComponent* NewComp = NewObject(this, InitialName);

//Add a reference to our array
SMArray.Add(NewComp);

//Change the name for the next possible item
FString Str = "MyCompName" + FString::FromInt(i+1);

//Convert the FString to FName
InitialName = (*Str);

//If the component is valid, set it's static mesh, relative location and attach it to our parent
if (NewComp)
{
GLog->Log("Registering comp...");

//Register the new component
NewComp->RegisterComponent();

//Set the static mesh of our component
NewComp->StaticMesh = SM->StaticMesh;

//Set a random location based on the values we enter through the editor
FVector Location;
//Set the random seed in case we need to change our random values
FMath::SRandInit(RandomSeed);

Location.X += FMath::RandRange(-FMath::Abs(XThreshold), FMath::Abs(XThreshold));
Location.Y += FMath::RandRange(-FMath::Abs(YThreshold), FMath::Abs(YThreshold));

NewComp->SetWorldLocation(Location);

//Attach the component to the root component
NewComp->AttachTo(GetRootComponent(), NAME_None, EAttachLocation::KeepRelativeOffset);
}
}
}

[свернуть]
Обратите внимание, что вам, возможно, придется изменить имя класса, в противном случае вы получите ошибку компиляции.
Перейдите в UE4 редактор, поместите вашего актора на сцену и укажите параметры. Конечно же вы можете создать более лучшую версию алгоритма, так что статические меши не будут пересекаться друг с другом. Этот алгоритм мы использовали просто в качестве примера.


Читайте также: