Hi!
I have been tackling this issue, as I am trying to spawn a “grass” in the origin of the map, the build succeeds, the engine launches, but hitting “play” crashes the engine instantly, so I figured the error is somewhere in the constructor, or in the class spawned by the constructor. here is how I have done it:
Grass.h:
#include “GameFramework/Actor.h”
#include “Grass.generated.h”
/**
*
*/
UCLASS()
class THISISMYWORLD_API AGrass : public AActor
{
GENERATED_UCLASS_BODY()
UPROPERTY()
TSubobjectPtr<UStaticMeshComponent> GrassyControl;
UStaticMesh * AssetSM_GrassControl;
FORCEINLINE void SetupSMComponentsWithCollision(UStaticMeshComponent* Comp)
{
if (!Comp) return;
//~~~~~~~~
Comp->bOwnerNoSee = false;
Comp->bCastDynamicShadow = true;
Comp->CastShadow = true;
Comp->BodyInstance.SetObjectType(ECC_WorldDynamic);
Comp->BodyInstance.SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
Comp->BodyInstance.SetResponseToAllChannels(ECR_Ignore);
Comp->BodyInstance.SetResponseToChannel(ECC_WorldStatic, ECR_Block);
Comp->BodyInstance.SetResponseToChannel(ECC_WorldDynamic, ECR_Block);
Comp->BodyInstance.SetResponseToChannel(ECC_Pawn, ECR_Block);
Comp->SetHiddenInGame(false);
}
};
Grass.cpp:
#include “thisIsMyWorld.h”
#include “Grass.h”
AGrass::AGrass(const class FPostConstructInitializeProperties& PCIP)
: Super(PCIP)
{
static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMeshOb_AW2(TEXT(“StaticMesh’/Game/Blocks/grass.grass’”));
AssetSM_GrassControl = StaticMeshOb_AW2.Object;
//Create
GrassyControl = PCIP.CreateDefaultSubobject < UStaticMeshComponent >(this, TEXT("GrassyGrassControl"));
//Set Mesh
GrassyControl->SetStaticMesh(AssetSM_GrassControl);
//Setup (see .h)
SetupSMComponentsWithCollision(GrassyControl);
//Deferred Attachment
GrassyControl->AttachParent = RootComponent;
GrassyControl->AttachSocketName = FName(TEXT("GrassControl"));
}
Class that spawns the grass (the gamemode, as that seemed like a good universal place to put it in, as it in future will be part of procedural terrain generation)
Devmode.h
#pragma once
#include “GameFramework/GameMode.h”
#include “Devmode.generated.h”
/**
*
*/
UCLASS()
class THISISMYWORLD_API ADevmode : public AGameMode
{
GENERATED_UCLASS_BODY()
UPROPERTY()FVector originPoint;
UPROPERTY()FRotator noRot;
};
Devmode.cpp
#include “thisIsMyWorld.h”
#include “Devmode.h”
#include “PlayerChar.h”
#include “Grass.h”
ADevmode::ADevmode(const class FPostConstructInitializeProperties& PCIP)
: Super(PCIP)
{
//Beginning declarations
DefaultPawnClass = APlayerChar::StaticClass();
originPoint = FVector(0.0f, 0.0f, 0.0f);
noRot = FRotator(0.0f, 0.0f, 0.0f);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Terrain generation
AGrass* SpawnedGrass1 = (AGrass*) GetWorld()->SpawnActor(AGrass::StaticClass(), &originPoint, &noRot);
}