Ответ 1
Проблема, с которой вы сталкиваетесь, касается нереста сетки или получения правильной ориентации? (то есть ортогональной проекции, обращенной к камере)
Спасти сетку достаточно просто, можно сделать либо с помощью чертежей, либо с помощью кода.
В "Чертежах" вы должны установить определенные предварительные условия, а затем выбрать, чтобы создавать игроков на основе условий. Фактическое решение для кодирования будет выглядеть примерно одинаково.
Если это касается ориентации, то этот ответ поможет вам, найденному на форумах UnrealEngine:
https://answers.unrealengine.com/info/62126/how-do-i-render-a-dynamic-mesh-with-orthographic-p.html
EDIT:
После многократного вытягивания волос и просмотра серфинга, здесь код, который заставлял работать.
ADynamicMeshSpawner::ADynamicMeshSpawner()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
// Using a SphereComponent is not particularly necessary or relevant, but the cube refused to spawn without a root component to attach to, or so I surmise. Yay Unreal. =/
USphereComponent* CubeComponent = CreateDefaultSubobject<USphereComponent>(TEXT("RootComponent"));
RootComponent = CubeComponent;
CubeComponent->InitSphereRadius(40.0f);
CubeComponent->SetCollisionProfileName(TEXT("Pawn"));
// Create and position a mesh component so we can see where our cube is
UStaticMeshComponent* CubeVisual = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation"));
CubeVisual->AttachTo(RootComponent);
static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube'"));
if (SphereVisualAsset.Succeeded())
{
CubeVisual->SetStaticMesh(SphereVisualAsset.Object);
CubeVisual->SetRelativeLocation(FVector(-200.0f, 0.0f, 100.0f));
CubeVisual->SetWorldScale3D(FVector(2.0f));
}
// Create a material to be applied on the StaticMeshComponent
static ConstructorHelpers::FObjectFinder<UMaterial> Material(TEXT("Material'/Game/StarterContent/Materials/M_Tech_Hex_Tile_Pulse.M_Tech_Hex_Tile_Pulse'"));
if (Material.Object != NULL)
{
TheMaterial = (UMaterial*)Material.Object;
}
CubeVisual->SetMaterial(0, TheMaterial);
}
Заголовочный файл выглядит следующим образом:
UCLASS()
class MYPROJECT_API ADynamicMeshSpawner : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor properties
ADynamicMeshSpawner();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
// Pointer to the material that needs to be used
UMaterial* TheMaterial;
};
Окончательный вывод в редакторе выглядит так:
Я установил его так, чтобы экземпляр моего класса "DynamicMeshSpawner" появлялся каждый раз, когда я нажимал "P" на клавиатуре. Когда экземпляр этого класса создается, он вызывает конструктор, который порождает куб с применяемым материалом. Я использовал экземпляр экземпляра класса в BluePrints, используя SpawnActor node.
Условия, которые вам требуются для нерестилища, очевидно, будут зависеть от приложения.
Этот метод работает для обычных материалов, но не для экземпляров материалов. Я считаю, что вам нужно будет внести изменения в тип TheMaterial, вызов ConstructorHelper и литье из ссылки на материал в TheMaterial, чтобы заставить его функционировать.
Я уверен, что это будет работать и с анимированными материалами, а это значит, что 2D-анимацию нужно будет преобразовать в какой-то материал.
Возможно, ссылка ниже поможет.
https://forums.unrealengine.com/showthread.php?6744-Flipbook-material-to-recreate-an-animated-gif
ИЗМЕНИТЬ 2:
Ниже приведено очень хорошее множество примеров того, как процедурно создавать объекты в Unreal. Оставляя его здесь для потомков и в случае, если кто-нибудь придет посмотреть.