2015-04-14 3 views
28

Есть несколько ручных волновых ответов для этого на answer.unrealengine.com, но они, похоже, не имеют никаких подробностей или примеров.Как вы динамически выполняете квадроциклы в UE4?

В частности, если вы хотите реализовать набор динамических текстурированных квадроциклов, которые отображаются в 3D-мире игры, как бы вы это сделали?

Для использования используйте двухскатный скроллер, который использует анимацию Spriter. 2D-анимация загружается из XML достаточно легко, но как вы затем визуализируете этот 2D-набор текстурированных, повернутых и масштабированных квадроциклов на сцене?

+0

Я думаю, вы должны смотреть в процедурную статическую сетку и создание материала. В API UE4 это не очень хорошо обслуживается, но вы можете начать с https://docs.unrealengine.com/latest/INT/API/Plugins/ProceduralMeshComponent/index.html и https: // wiki. unrealengine.com/Procedural_Materials – vipw

+0

@vipw О, я прочитал их ... Я просто не могу заставить их работать. Если у вас есть * пример * из них * на самом деле работает *, вы можете воспользоваться истекшим 200-очковым бонусом по этому вопросу. – Doug

+0

У меня есть что-то работающее на основе этого кода: https://wiki.unrealengine.com/Procedural_Mesh_Component_in_C%2B%2B:Getting_Started Другой, более сложный пример: https://github.com/LaP0573/ue4-fbx -importer/blob/master/ProcedureuralEntity.cpp – vipw

ответ

3

Проблема, с которой вы сталкиваетесь, касается нереста сетки или получения правильной ориентации? (то есть ортогональный проектор, обращенный к камере)

Нерест сетки достаточно прост, может быть выполнен либо через Чертежи, либо в коде.

В «Чертежах» вы должны установить определенные предварительные условия, а затем выбрать, чтобы создавать игроков на основе условий. Фактическое решение для кодирования будет выглядеть примерно одинаково.

Если относительно ориентации, то этот ответ будет вам помочь, найти на UnrealEngine форумах:

https://answers.unrealengine.com/questions/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); 
} 

headerfile выглядит следующим образом:

UCLASS() 
class MYPROJECT_API ADynamicMeshSpawner : public AActor 
{ 
    GENERATED_BODY() 

public: 
    // Sets default values for this actor's 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; 
}; 

Конечный результат выглядит следующим образом в редакторе:

A glorious cube spawned from code!

я поставил его так, что экземпляр моего класса «DynamicMeshSpawner» будет генерироваться каждый раз, когда я нажимаю «P» на клавиатуре. Когда экземпляр этого класса создается, он вызывает конструктор, который порождает куб с применяемым материалом. Я создал экземпляр экземпляра класса в BluePrints, используя узел SpawnActor.

Implemented in the level blueprint

условие, которые требуются для нерестовых вещей, очевидно, будет зависеть от применения.

Этот метод работает для обычных материалов, но не для экземпляров материалов. Я считаю, что вам нужно будет внести изменения в тип TheMaterial, вызов ConstructorHelper и литье из справочника материалов в TheMaterial, чтобы заставить его функционировать.

Я уверен, что это будет работать и с анимированными материалами, что означает, что 2D-анимация должна быть преобразована в материал какого-то рода.

Возможно, приведенная ниже ссылка поможет.

https://forums.unrealengine.com/showthread.php?6744-Flipbook-material-to-recreate-an-animated-gif

EDIT 2:

Ниже очень хороший набор примеров о том, как процедурно создавать объекты в Unreal. Оставляем его здесь для потомков, и в случае, если кто-нибудь придет посмотреть.

https://github.com/SiggiG/ProceduralMeshes/

+0

Как я уже сказал в вопросе: «Ответы на некоторые ответы на это на answer.unrealengine.com, но у них, похоже, нет деталей или примеров». То, что я хочу, очень просто: процедурно создать квад (во время выполнения) и отобразить на нем текстуру (выбранную во время выполнения). Вот и все. Это не смутный вопрос; и, к сожалению, ссылка, с которой вы связаны, - это именно то, о чем я говорю. Я с радостью приму любой ответ, который * действительно показывает код *, как это сделать. – Doug

+0

Справедливая точка Doug. Извинения за вклад в неопределенность. Я довольно оскорблен недостатком документации или примеров для чего-то, что должно быть довольно легко реализовать. Дайте мне немного, я взломаю ее на реализацию, и скоро вернусь к вам. –

+0

Написал реализацию, которая сработала для меня. Я заметил, что вы попросили выбрать текстуру во время выполнения. Я уверен, что такая функция не будет проста для реализации. Для этого потребовалось бы, чтобы все текстуры были преобразованы в Материалы заранее (до выполнения) и хранились в некоторой структуре данных. Массив был бы самым простым. Затем этот массив (например) должен быть доступен для индексирования во время выполнения. Предпосылки вызвали бы размножение разных квадов с различными материалами (текстурами), которые они отображали. Невозможно, но не слишком легко. –

Смежные вопросы