Unreal Engine, from C++ spawn Blueprint inherited from C++ class, very small example: Difference between revisions

From Andreida
Line 64: Line 64:
AMiniActor::AMiniActor()
AMiniActor::AMiniActor()
{
{
m_pScRoot = CreateDefaultSubobject<USceneComponent>("Root");
m_pScRoot = CreateDefaultSubobject<USceneComponent>("Root");
RootComponent = m_pScRoot;
RootComponent = m_pScRoot;


m_pSmcRoot = CreateDefaultSubobject<UStaticMeshComponent>("SmcRoot");
m_pSmcRoot = CreateDefaultSubobject<UStaticMeshComponent>("SmcRoot");


FAttachmentTransformRules transformRule = FAttachmentTransformRules::SnapToTargetIncludingScale;
FAttachmentTransformRules transformRule = FAttachmentTransformRules::SnapToTargetIncludingScale;
m_pSmcRoot->AttachToComponent(RootComponent, transformRule);
m_pSmcRoot->AttachToComponent(RootComponent, transformRule);


PrimaryActorTick.bCanEverTick = false;
PrimaryActorTick.bCanEverTick = false;
}
}


void AMiniActor::BeginPlay()
void AMiniActor::BeginPlay()
{
{
Super::BeginPlay();
Super::BeginPlay();


if (m_pMesh != nullptr)
if (m_pMesh != nullptr)
{
{
m_pSmcRoot->SetStaticMesh(m_pMesh);
m_pSmcRoot->SetStaticMesh(m_pMesh);
}
}
}
}



Revision as of 13:27, 6 May 2024

Prepare Project

Create Project

  • Games / Blank
    • C++
    • Desktop
    • Maximum
    • Starter Content: no
    • Raytracing: no
    • Location: your choice
    • Project Name: ShowActor
  • Create

Change Map to Basic

When the UE-Editor is open:

  • File / New Level / Basic / Create
  • File / Save Current Level as ... / Basic01
  • Edit / Project Settings / Maps & Modes / Editor Startup Map: Basic01
  • Edit / Project Settings / Maps & Modes / Editor Game Default Map: Basic01

Create Classes

Actor

  • Tools / New C++ Class
    • Parent Class: Actor
    • Name MiniActor
    • Create Class
Header File: MiniActor.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MiniActor.generated.h"

UCLASS(Blueprintable)
class SHOWACTOR_API AMiniActor : public AActor
{
  GENERATED_BODY()
	
public:	

	AMiniActor();

protected:

  virtual void BeginPlay() override;

  UPROPERTY(EditAnywhere, Category = "Structure", meta = (DisplayName = "Mesh"))
  UStaticMesh* m_pMesh;

  UPROPERTY(EditAnywhere, Category = "Structure", meta = (DisplayName = "Scene Component Root"))
  USceneComponent* m_pScRoot;

  UPROPERTY(EditAnywhere, Category = "Structure", meta = (DisplayName = "Static Mesh Component of Root"))
  UStaticMeshComponent* m_pSmcRoot;
};
Source File
#include "MiniActor.h"

AMiniActor::AMiniActor()
{
  m_pScRoot = CreateDefaultSubobject<USceneComponent>("Root");
  RootComponent = m_pScRoot;

  m_pSmcRoot = CreateDefaultSubobject<UStaticMeshComponent>("SmcRoot");

  FAttachmentTransformRules transformRule = FAttachmentTransformRules::SnapToTargetIncludingScale;
  m_pSmcRoot->AttachToComponent(RootComponent, transformRule);

  PrimaryActorTick.bCanEverTick = false;
}

void AMiniActor::BeginPlay()
{
  Super::BeginPlay();

  if (m_pMesh != nullptr)
  {
    m_pSmcRoot->SetStaticMesh(m_pMesh);
  }
}

Build

Now build the project. Nothing works so don't even try to test it in the UE-Editor, but the code should compile and link. This is a class that is complete as it is.