Jusper Jusper

Мы попали в подборку #MadeWithUnity
На 4:58

Loya Loya

Func подчеркивает красным. Подскажите какую библиотеку нужно подключить?

Jusper Jusper

Normanof,

Автор довольно давно не заходил.

Normanof Normanof

Куда можно задать вопрос по поводу игры?
Как сделать так, чтобы карта двигалась за персонажем? т.е. персонаж - всегда в центре, а при движении в любом направлении, карта тоже двигалась так, чтобы персонаж снова оказывался в центре...

Jusper Jusper

Довольно сражений! Поработаем над внутрянкой. Как насчет экипировки? 🗡

Jusper Jusper

Так-то мы вчера и такое сделали.

Jusper Jusper

alexprey, ты предлагаешь добавить это самое?

alexprey alexprey

Jusper, если так, то не только на бороде уж останавливаться 🤣

Jusper Jusper

Всю недельную работу можно склеить в один бодрый видос:

...
Rummy_Games Rummy_Games

Доброго субботнего вечера! Сегодня мы ходим поделиться наработками нашего 3D-моделлера в рамках #saturdayscreenshot. Концепты космического инженера.

...
Razz Razz

Это последний уровень, где я свечу скриншотами и гифками. Босс и весь следующий уровень - секрет

...
Логотип проекта Unreal Engine

Пилим платформер на UE4 - часть 8 (C++)

Пилим платформер на UE4 - часть 8 (C++)

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

Исходники из видео

CPP:

#include "FloatPlatform.h"
#include <EngineGlobals.h>
#include <Runtime/Engine/Classes/Engine/Engine.h>

FVector spos;
FVector cpos;
FVector tpos;
FVector k;
int32 cpoint=0;
int32 tpoint = 1;
float pointtimer = 0;



// Sets default values
AFloatPlatform::AFloatPlatform()
{
     // 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;

}

// Called when the game starts or when spawned
void AFloatPlatform::BeginPlay()
{
    Super::BeginPlay();
    if (lpts > 1)
    {
        cpoint = 0;
        tpoint = 1;
        cpos = points[cpoint];
        SetActorLocation(cpos);
        spos = cpos;
        tpos = DefTPOS(tpoint);
    }

}

// Called every frame
void AFloatPlatform::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    MovePlatf(DeltaTime);
    

}

void AFloatPlatform::MovePlatf(float dt)
{
    int32 ckx;
    int32 ckz;

    cpos = GetActorLocation();

    //вектор дистанции
    FVector dv = tpos - spos;
    float dst=FMath::Abs(dv.FVector::Size());

    //коэффициент направления по Х
    if (tpos.X > cpos.X)
    {
        ckx = 1;
    }
    else
    {
        ckx = -1;
    }
    k.X = (FMath::Abs(dv.X)*ckx) / dst;
    GEngine->AddOnScreenDebugMessage(-1, 0.01f, FColor::Red, FString::Printf(TEXT("ckx=%d; kx=%f; dvX=%f"), ckx, k.X,dv.X));
    
    //у нас 2д игра, нет движения по У
    k.Y = 0;

    //то же для Z
    if (tpos.Z > cpos.Z)
    {
        ckz = 1;
    }
    else
    {
        ckz = -1;
    }
    k.Z = (FMath::Abs(dv.Z)*ckz) / dst;

    //собственно движение
    if (pointtimer <= 0)
    {
        cpos += k * spd*dt;
    }
    else
    {
        pointtimer -= dt;
    }

    //расстояние от текущей точки до активной цели
    float dd = (tpos - cpos).FVector::Size();

    //если платформа возле точки
    if (dd <= (spd * dt * 2))
    {
        //смещаемся на точку вперед
        cpoint++;
        tpoint++;

        //если дошли до номинального конца массива точек, съезжаем на начало
        if (cpoint > (lpts - 1))
        {
            cpoint = 0;
        }
        if (tpoint > (lpts - 1))
        {
            tpoint = 0;
        }
        spos = cpos;
        tpos = DefTPOS(tpoint);

        //принудительно помещаем платформу на заданную точку
        cpos = DefTPOS(cpoint);

        pointtimer = pointtime;
    }    
    
    SetActorLocation(cpos,true);

    if (GEngine) {
        GEngine->AddOnScreenDebugMessage(-1, 0.01f, FColor::Yellow, FString::Printf(TEXT("cp=%d; tp=%d; dd=%f"), cpoint, tpoint, dd));
    }
}

FVector AFloatPlatform::DefTPOS(int32 pnt)
{
    return points[pnt];
}

H:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

UCLASS()
class GENEPRINCESS_API AFloatPlatform : public AActor
{
    GENERATED_BODY()
    
public:    
    AFloatPlatform();

protected:

    //объявления функций
    virtual void BeginPlay() override;
    void MovePlatf(float dt);
    FVector DefTPOS(int32 pnt);

    //объявления свойств
    UPROPERTY(EditAnywhere)
        float spd = 250;
    UPROPERTY(EditAnywhere)
        float lpts = 2;
    UPROPERTY(EditAnywhere)
        float pointtime = 1;
    UPROPERTY(EditAnywhere)
        TArray <FVector> points;
    
    //основные переменные
    FVector spos;
    FVector cpos;
    FVector tpos;
    FVector k;
    int32 cpoint;
    int32 tpoint;
    float pointtimer;
    

public:    
    // Тик
    virtual void Tick(float DeltaTime) override;

    
};

Смотрите также:


Комментарии



Дарин, наконец-то добрался до просмотра! Вступление огонь! вот только звук речи очень тихий, приходится вслушиваться. С 10 минуту чуть получше стало со звуком.

В целом годно, спасибо за материал!)

Справка