Este documento describe cómo configurar un actor de luz que cambia de color y se desvanece lentamente al contacto.
Para ello, se utilizará un componente de luz puntual que contenga un componente de caja para que actúe como activador de solapamiento y un componente de escala de tiempo para manipular al actor de luz puntual.
Cómo crear el actor de luz que se desvanece
Crea el nuevo proyecto de C++ basado en la plantilla en blanco, y nómbralo FadingLights.
Dirígete al explorador de contenido, haz clic en la carpeta C++ Classes y, a continuación, haz clic en el botón Añadir (+) y selecciona Nueva clase C++.
Selecciona Actor como clase padre.
Nombra al actor creado como LightActor.
Cuando se crea un nuevo actor, Visual Studio abre automáticamente los archivos
LightActor.hyLightActor.cpp. Dirígete al archivoLightActor.he introduce las siguientes declaraciones:LightActor.h
C++#include "Components/TimelineComponent.h"A continuación, en la definición de la clase
LightActor, añade el siguiente código:LightActor.h
C++public: UPROPERTY(EditAnywhere) UCurveFloat* PointLightFloatCurve; UPROPERTY(EditAnywhere) UCurveLinearColor* PointLightColorCurve; protected:Ve a
LightActor.cppy añade las siguientes bibliotecas de clases.LightActor.cpp
C++#include "Components/BoxComponent.h" #include "Components/PointLightComponent.h"En el constructor de
ALightActor::ALightActor, introduce las siguientes declaraciones: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"));A continuación, implementa los métodos
UFunctiondel componente de luz puntual:LightActor.cpp
C++void ALightActor::UpdateLightBrightness(float BrightnessOutput) { PointLightComp->SetLightBrightness(BrightnessOutput * 20.0f); } void ALightActor::UpdateLightColor(FLinearColor ColorOutput) { PointLightComp->SetLightColor(ColorOutput); }A continuación, en el método
BeginPlay, añade el siguiente 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)Compila el código.
En el explorador de contenido, dirígete a la carpeta Clases de C++.
Haz clic derecho en el LightActor, selecciona Crear clase de Blueprint basada en LightActor y nombra al actor de Blueprint BP_LightActor.
Los valores predeterminados de clase de BP_LightActor tendrán el siguiente aspecto:
Código en progreso
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.
Cómo crear y vincular el evento solapado de colisión
El componente de caja requiere la capacidad de activar el TimelineComponent cuando un actor entra en sus límites de colisión.
Dirígete a la definición de clase de
LightActor.he introduce las siguientes declaraciones enBrightnessMultiplier:LightActor.h
C++protected: UFUNCTION() void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);A continuación, dirígete al archivo
LightActor.cppe implementa la funciónOnOverlapBegin.LightActor.cpp
C++void ALightActor::OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { LightTimelineComp->Play(); }Vincula la función de solapar en el método
BeginPlay:LightActor.cpp
C++//Binding our Box Component to our Light Actor's Overlap Function LightOverlapVolume->OnComponentBeginOverlap.AddDynamic(this, &ALightActor::OnOverlapBegin);Compila el 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()
Cómo configurar la pista de brillo
Cuando el jugador se solapa con los límites del componente de caja del actor de luz, el componente de escala de tiempo requerirá una curva flotante para manipular el valor de brillo del componente de luz puntual.
La luminosidad tendrá un valor inicial de 5000 y disminuirá hasta 0 en un lapso de 5 segundos.
Navega hasta el explorador de contenido, selecciona Añadir (+) > Varios > Curva.
Selecciona CurveFloat y nombra al recurso BrightnessCurveFloat.
Haz doble clic en BrightnessCurveFloat para abrir el editor de la escala de tiempo.
Añade dos claves a la curva float. Para ello, haz clic derecho sobre el grafo y selecciona Añadir clave. Ajusta el valor de tiempo de la primera clave a (0, 5000). Ajusta el valor de tiempo de la segunda clave a (5, 0). Tu BrightnessCurveFloat debe tener el siguiente aspecto:
Guarda BrightnessCurveFloat, vuelve al explorador de contenido y haz doble clic en BP_LightActor para abrir sus valores predeterminados de clase.
Navega hasta el panel Detalles y selecciona Curva flotante de brillo en el menú desplegable Curva flotante de luz puntual.
Haz clic en los botones Compilar y Guardar.
Cómo configurar la pista de color
Cuando el jugador se solapa con los límites del componente de caja del actor de luz, la escala de tiempo de la luz puntual requerirá una pista de curva de color lineal para manipular la propiedad de color del componente de luz puntual.
Navega hasta el explorador de contenido, selecciona Añadir (+) > Varios > Curva.
Selecciona CurveLinearColor y nombra al recurso LinearColorCurve.
Haz doble clic en LinearColorCurve para abrir el editor de la escala de tiempo.
Haz doble clic en la primera clave de color para modificarla y establece el valor RGB en: (R: 1, G: 0,665, B: 0,015).
Haz doble clic en la segunda clave de color para modificarla y establece el valor RGB en: (R: 0, G: 0, B: 0).
Haz clic sobre el segundo punto del grafo y fija el tiempo en 5 segundos.
Tu LinearColorCurve debe tener el siguiente aspecto:
Guarda LinearColorCurve, vuelve al explorador de contenido y haz doble clic en BP_LightActor para abrir sus valores predeterminados de clase.
Navega hasta el panel Detalles y selecciona Curva flotante de brillo en el menú desplegable Curva flotante de luz puntual.
Haz clic en los botones Compilar y Guardar.
Configuración del nivel
Para demostrar mejor las funciones del código que has escrito, tendrás que eliminar todos los actores de fuentes de luz del nivel.
En el explorador de contenido, dirígete al recurso BP_LightActor, selecciónalo y arrástralo al nivel.
Selecciona BP_LightActor en el esquematizador del mundo, dirígete al panel Detalles y fija los ajustes de posición en (0, 0, 300) y de escala en (10, 10, 10).
Elimina el actor DirectionalLight en el esquematizador del mundo.
El nivel debería tener el siguiente aspecto.
Resultado final
Una vez configurado el actor de luz y el nivel, haz clic en Reproducir (PIE) para tomar posesión automáticamente del peón espectador.
Puedes controlar el peón espectador y desplazarte hasta los límites del componente de caja del actor de luz.
Una vez que se ha activado la función Reproducir del componente de escala de tiempo, el color y la luminosidad de la luz deberían empezar a cambiar en un intervalo de 5 segundos.