Class Tangible can now recreate its Actor
This commit is contained in:
81
Source/Integration/Tangible.cpp
Normal file
81
Source/Integration/Tangible.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "Tangible.h"
|
||||
#include "TangibleManager.h"
|
||||
|
||||
UlxTangible::UlxTangible()
|
||||
{
|
||||
}
|
||||
|
||||
void UlxTangible::Init(UlxTangibleManager* tm, int64 id)
|
||||
{
|
||||
Manager = tm;
|
||||
TangibleId = id;
|
||||
}
|
||||
|
||||
bool UlxTangible::BlueprintIsTangible(TSubclassOf<AActor> bp) {
|
||||
if (bp == nullptr) return true;
|
||||
return bp->ImplementsInterface(UlxTangibleInterface::StaticClass());
|
||||
}
|
||||
|
||||
void UlxTangible::SetActorBlueprintClass(TSubclassOf<AActor> bp) {
|
||||
// If we're already of the right class, do nothing.
|
||||
if (ActorBlueprint == bp) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Sanity check the blueprint. Nullptr is allowed.
|
||||
check(BlueprintIsTangible(bp));
|
||||
|
||||
// If there's already an actor, delete it.
|
||||
if (CurrentActor != nullptr) {
|
||||
// Remove the tangible component. This is probably
|
||||
// unnecessary, but it makes it more likely that we'll
|
||||
// catch bugs early.
|
||||
UlxTangibleComponent* comp = CurrentActor->GetComponentByClass<UlxTangibleComponent>();
|
||||
if (comp != nullptr) {
|
||||
comp->DestroyComponent();
|
||||
}
|
||||
|
||||
// Now destroy the actor itself. According to various
|
||||
// documents I've read online, it may be necessary to take
|
||||
// further steps to delete the object. Not clear.
|
||||
CurrentActor->Destroy();
|
||||
}
|
||||
|
||||
// Update the blueprint reference.
|
||||
ActorBlueprint = bp;
|
||||
|
||||
// Now create a new actor, unless the BP is nullptr.
|
||||
if (ActorBlueprint != nullptr) {
|
||||
// Create the actor.
|
||||
FActorSpawnParameters params;
|
||||
FVector location(0, 0, 0);
|
||||
FRotator rotation(0, 0, 0);
|
||||
UWorld* w = Manager->GetWorld();
|
||||
AActor* a = w->SpawnActor(ActorBlueprint, &location, &rotation, params);
|
||||
|
||||
// Insert a TangibleComponent into the actor.
|
||||
UActorComponent* ac = a->AddComponentByClass(UlxTangibleComponent::StaticClass(), false, FTransform::Identity, false);
|
||||
UlxTangibleComponent* tc = Cast<UlxTangibleComponent>(ac);
|
||||
check(tc != nullptr);
|
||||
|
||||
// Make the tangible point to the actor and vice versa.
|
||||
tc->Tangible = this;
|
||||
CurrentActor = a;
|
||||
}
|
||||
}
|
||||
|
||||
FString UlxTangible::GetTangiblePlane(AActor* actor) {
|
||||
UlxTangibleComponent* comp = actor->GetComponentByClass<UlxTangibleComponent>();
|
||||
check(comp != nullptr);
|
||||
return comp->Tangible->Plane;
|
||||
}
|
||||
|
||||
void UlxTangible::SetTangiblePlane(AActor* actor, const FString& plane) {
|
||||
UlxTangibleComponent* comp = actor->GetComponentByClass<UlxTangibleComponent>();
|
||||
check(comp != nullptr);
|
||||
comp->Tangible->Plane = plane;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user