Instanced Static Mesh
You can make a new class, InstancedStaticMeshActor
and add a Instanced Static Mesh Component
Then you spawn that actor
and to add additional instances you use this function in the Instanced Static Mesh Component Class
- UFUNCTION(BlueprintCallable, Category=“Components|InstancedStaticMesh”)
- virtual void AddInstance(const FTransform& InstanceTransform);
-
-
That’s pretty much all you need to do!
Here’s my code from the beta, that I used for my own tests, here’s a pic of my tests
In my case I extended a regular SMA so I would see the actor when it spawned :)
Spawning
- //Spawninfo
- FActorSpawnParameters SpawnInfo;
-
- //SET NO COLLISION FAIL TO TRUE
- SpawnInfo.bNoCollisionFail = true;
-
- SpawnInfo.Owner = VictoryEngine->VSelectedActor;
-
- AVictoryVertex3D NewVertex =
- GetWorld()->SpawnActor<AVictoryVertex3D>(
- AVictoryVertex3D::StaticClass(),
- Pos,
- FRotator::ZeroRotator,
- SpawnInfo
- );
- if(!NewVertex) return NULL;
- if(!NewVertex->InstancedStaticMeshComponent) return NULL;
- //
~~~~~~
-
- //Mesh
- NewVertex->InstancedStaticMeshComponent->SetStaticMesh(VictoryEngine->AssetSM_EngineCube);
-
- //Add Core Instance
- FTransform newT = NewVertex->GetTransform();
- newT.SetLocation(FVector(0,0,0));
- NewVertex->InstancedStaticMeshComponent->AddInstance(newT);
-
- //Scale
- NewVertex->SetActorRelativeScale3D(CurrentVerticiesScale);
-
-
.h
- // Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
-
- //Power
-
- #pragma once
-
- #include “VictoryVertex3D.generated.h”
-
-
- /**
- An instance of a StaticMesh in a level
- Note that PostInitializeComponents() is not called for StaticMeshActors
- /
- UCLASS()
- class AVictoryVertex3D : public AStaticMeshActor
- {
- GENERATED_UCLASS_BODY()
-
- UPROPERTY()
- TSubobjectPtr<UInstancedStaticMeshComponent> InstancedStaticMeshComponent;
-
-
- UPROPERTY()
- UStaticMesh* SMAsset_Cube;
-
- };
-
.cpp
- // Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
-
- #include “VictoryGame.h”
-
- //
- // VictoryVertex3D
-
- //MAKE SEPARATE CLASSES OF THIS IF YOU WANT TO CHANGE THE MESH
- //
- AVictoryVertex3D::AVictoryVertex3D(const class FPostConstructInitializeProperties& PCIP)
- : Super(PCIP)
- {
- //Mesh
- static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMeshOb_torus(TEXT(“StaticMesh’/Engine/EngineMeshes/Cube.Cube’”));
- SMAsset_Cube = StaticMeshOb_torus.Object;
-
- //create new object
- InstancedStaticMeshComponent = PCIP.CreateDefaultSubobject < UInstancedStaticMeshComponent > (this, TEXT(“InstancedStaticMeshComponentCOMP”));
- InstancedStaticMeshComponent.AttachTo(RootComponent);
-
- //Not Made some reason?
- if (!InstancedStaticMeshComponent) return;
- //
~~~~~~
-
- //Set to Asset
- InstancedStaticMeshComponent->SetStaticMesh(SMAsset_Cube);
-
- InstancedStaticMeshComponent->bOwnerNoSee = false;
- InstancedStaticMeshComponent->bCastDynamicShadow = false;
- InstancedStaticMeshComponent->CastShadow = false;
- InstancedStaticMeshComponent->BodyInstance.SetObjectType(ECC_WorldDynamic);
-
- //Visibility
- InstancedStaticMeshComponent->SetHiddenInGame(false);
-
- //Mobility
- InstancedStaticMeshComponent->SetMobility(EComponentMobility::Movable);
-
- //Collision
- InstancedStaticMeshComponent->BodyInstance.SetCollisionEnabled(ECollisionEnabled::QueryOnly);
- InstancedStaticMeshComponent->BodyInstance.SetObjectType(ECC_WorldDynamic);
- InstancedStaticMeshComponent->BodyInstance.SetResponseToAllChannels(ECR_Ignore);
- InstancedStaticMeshComponent->BodyInstance.SetResponseToChannel(ECC_WorldStatic, ECR_Block);
- InstancedStaticMeshComponent->BodyInstance.SetResponseToChannel(ECC_WorldDynamic, ECR_Block);
-
- //
~~~~~~~~~~
-
-
- if (!StaticMeshComponent) return;
-
- //Mobility
- StaticMeshComponent->SetMobility(EComponentMobility::Movable);
-
- //Collision
- StaticMeshComponent->BodyInstance.SetCollisionEnabled(ECollisionEnabled::QueryOnly);
- StaticMeshComponent->BodyInstance.SetObjectType(ECC_WorldDynamic);
- StaticMeshComponent->BodyInstance.SetResponseToAllChannels(ECR_Ignore);
- StaticMeshComponent->BodyInstance.SetResponseToChannel(ECC_WorldStatic, ECR_Block);
- StaticMeshComponent->BodyInstance.SetResponseToChannel(ECC_WorldDynamic, ECR_Block);
- }
-
-
-
-
-
-
-
还没有评论,来说两句吧...