Este documento descreve como definir um Ator de luz que muda de cor e desaparece lentamente quando entra em contato.
Isso será feito usando um Componente de luz pontual que contém um Componente de caixa que servirá como um gatilho de sobreposição e um componente de linha do tempo para manipular o Ator de luz pontual.
Como criar o ator de luz de esmaecimento
Crie o projeto C++ com base no modelo Blank e nomeie como FadingLights.
Vá até o Navegador de Conteúdo, clique na pasta Classes de C++ e, em seguida, clique no botão Adicionar (+) e selecione Nova classe C++.
Selecione Ator como uma Classe Pai.
Nomeie o Ator criado como LightActor.
Quando um Ator é criado, o Visual Studio abre automaticamente os arquivos
LightActor.he LightActor.cpp. Vá atéLightActor.he declare o seguinte:LightActor.h
C++#include "Components/TimelineComponent.h"Em seguida, na definição da classe do
LightActor, adicione o seguinte código:LightActor.h
C++public: UPROPERTY(EditAnywhere) UCurveFloat* PointLightFloatCurve; UPROPERTY(EditAnywhere) UCurveLinearColor* PointLightColorCurve; protected:Vá até
LightActor.cppe adicione as seguintes bibliotecas de classe.LightActor.cpp
C++#include "Components/BoxComponent.h" #include "Components/PointLightComponent.h"No constructor de
ALightActor::ALightActor, declare o seguinte:LightActor.cpp
C++ALightActor::ALightActor() { // 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; //Create our Default Components PointLightComp = CreateDefaultSubobject<UPointLightComponent>(TEXT("PointLightComp")); LightTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("LightTimelineComp")); LightOverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("LightOverlapVolume"));Em seguida, implemente os métodos
UFfunctiondo componente de luz pontual:LightActor.cpp
C++void ALightActor::UpdateLightBrightness(float BrightnessOutput) { PointLightComp->SetLightBrightness(BrightnessOutput * 20.0f); } void ALightActor::UpdateLightColor(FLinearColor ColorOutput) { PointLightComp->SetLightColor(ColorOutput); }Em seguida, no método
BeginPlay, adicione o seguinte código:LightActor.cpp
C++void ALightActor::BeginPlay() { Super::BeginPlay(); //Binding our float and color track to their respective functions UpdateBrightnessTrack.BindDynamic(this, &ALightActor::UpdateLightBrightness); UpdateColorTrack.BindDynamic(this, &ALightActor::UpdateLightColor); //If we have a float curve, bind it's graph to our update function if (PointLightFloatCurve)Compile o código.
No Navegador de Conteúdo, vá até a pasta Classes C++.
Clique com o botão direito no LightActor, selecione Criar classe de Blueprint com base no LightActor e nomeie o ator de Blueprint como BP_LightActor.
Os valores padrão de classe do BP_LightActor ficarão como mostrados a seguir:
Código em andamento
LightActor.h
//Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Components/TimelineComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "LightActor.generated.h"
UCLASS()
class FADINGLIGHTS_API ALightActor : public AActor
LightActor.cpp
//Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
#include "LightActor.h"
#include "Components/BoxComponent.h"
#include "Components/PointLightComponent.h"
// Sets default values
ALightActor::ALightActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
Como criar e vincular o evento de sobreposição de colisão
O componente de caixa precisa ter a capacidade de acionar o TimelineComponent quando um ator entra em seus limites de colisão.
Vá até a definição de classe do
LightActor.he declare o seguinte abaixo deBrightnessMultiplier:LightActor.h
C++protected: UFUNCTION() void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);Em seguida, vá até o arquivo
LightActor.cppe implemente a funçãoOnOverlapBegin.LightActor.cpp
C++void ALightActor::OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { LightTimelineComp->Play(); }Vincule a função de sobreposição no método
BeginPlay:LightActor.cpp
C++//Binding our Box Component to our Light Actor's Overlap Function LightOverlapVolume->OnComponentBeginOverlap.AddDynamic(this, &ALightActor::OnOverlapBegin);Compile o código.
Código finalizado
LightActor.h
//Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Components/TimelineComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "LightActor.generated.h"
UCLASS()
class FADINGLIGHTS_API ALightActor : public AActor
LightActor.cpp
//Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
// Fill out your copyright notice in the Description page of Project Settings.
#include "LightActor.h"
#include "Components/BoxComponent.h"
#include "Components/PointLightComponent.h"
// Sets default values
ALightActor::ALightActor()
Como configurar a faixa de brilho
Quando ocorrer a sobreposição do jogador com a delimitação do componente de caixa do ator de luz, o componente da linha do tempo exigirá uma curva float para manipular o valor de brilho do componente de luz pontual.
A luminosidade terá um valor inicial de 5000 e diminuirá para 0 em um período de 5 segundos.
Navegue até o Navegador de Conteúdo, selecione Adicionar (+) > Diversos > Curva.
Selecione CurveFloat e nomeie o ativo como BrightnessCurveFloat.
Clique duas vezes em BrightnessCurveFloat para abrir o Editor de linha do tempo.
Adicione duas chaves à curva float clicando com o botão direito em Gráfico e selecione Adicionar chave. Ajuste o valor de tempo da primeira chave para (0, 5000). Ajuste o valor de tempo da segunda chave para (5, 0). Seu BrightnessCurveFloat deve ter a seguinte aparência:
Salve o BrightnessCurveFloat, volte ao Navegador de Conteúdo e clique duas vezes no BP_LightActor para abrir os Padrões de classe.
Navegue até o painel Detalhes e selecione Curva float de brilho no menu suspenso Curva float de luz pontual.
Clique nos botões Compilar e Salvar.
Como configurar a faixa de cores
Quando ocorrer a sobreposição do jogador com a delimitação do componente de caixa do ator de luz, a linha do tempo de PointLight exigirá uma faixa de curva de cor linear para manipular a propriedade de cor do componente.
Navegue até o Navegador de Conteúdo, selecione Adicionar (+) > Diversos > Curva.
Selecione CurveLinearColor e nomeie o ativo como LinearColorCurve.
Clique duas vezes na LinearColorCurve para abrir o Editor de linha do tempo.
Clique duas vezes na primeira chave de cor para modificá-la e defina o valor RGB de: (R: 1, G: 0,665, B: 0,015).
Clique duas vezes na segunda chave de cor para modificá-la e defina o valor RGB de: (R: 0, G: 0, B: 0).
Selecione o segundo Ponto no Gráfico clicando nele e defina o tempo para 5 segundos.
Sua LinearColorCurve deve ter a seguinte aparência:
Salve a LinearColorCurve, volte ao Navegador de Conteúdo e clique duas vezes no BP_LightActor para abrir os padrões de classe.
Navegue até o painel Detalhes e selecione Curva float de brilho no menu suspenso Curva float de luz pontual.
Clique nos botões Compilar e Salvar.
Configuração do nível
Para demonstrar melhor a funcionalidade do código que você escreveu, remova todos os atores de fontes de luz do nível.
No Navegador de Conteúdo, vá até o ativo BP_LightActor, selecione-o e arraste-o até o nível.
Selecione o BP_LightActor no Organizador de Mundo, vá até o painel Detalhes e defina as configurações de Posição como (0, 0, 300) e as configurações de Escala como (10, 10, 10).
Exclua o Ator DirectionalLight no Organizador de Mundo.
O nível deve ter a seguinte aparência.
Resultado
Agora que o Ator de luz e o nível foram configurados, clique em Play (JNE) para assumir o controle do Pawn de espectador automaticamente.
Você pode controlar o Pawn e navegar até os limites do componente da caixa do ator de luz.
Quando a função "Play" do componente da linha do tempo for acionada, a cor e a luminosidade da luz começarão a mudar em um intervalo de 5 segundos.