Diretório de artigos
artigo principal
- "UE5 "Electric Dreams" projeta análise de tecnologia PCG com base no nível de fluxo de trabalho PCGSettings"
- "UE5 "Electric Dreams" Projeto PCG Análise Técnica Compreendendo a Montagem (Tomando SplineExample como Exemplo)"
Na postagem do blog acima, aprendemos sobre o fluxo de trabalho macro do projeto "Electric Dreams" e a ideia básica de construir níveis e, em seguida, olhamos para este nível "PCGDemo_Ditch" para entendê-lo bem.
Localização do arquivo: /Content/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGDitchAssembly.umap
O nível "PCGDemo_Ditch" nos mostra principalmente os truques do PCG:
- Use um nó personalizado
Points From Actor Tag
como uma ferramenta de segmentação para PCG - Idéias de decoração em camadas
Resumo do nível
PCGGraph
Points From Actor Tag como ferramenta de segmentação para PCG
Muitos pontos de tags de ator são usados no nível PCGDemo_Ditch. Este é um nó personalizado muito útil que pode ser transplantado diretamente para nossos próprios projetos. Vamos dar uma olhada em sua lógica principal. O núcleo é Excute with Context As seguintes partes Points From Actor Tag
de o :
Obtenha todos os atores com a tag especificada de toda a cena e, em seguida, use seus limites de transformação e escala para formar a saída da nuvem de pontos. Vejamos GetActorBoundsPCG
a lógica específica novamente:
GetActorBoundsPCG
FBox UPCGBlueprintHelpers::GetActorBoundsPCG(AActor* InActor, bool bIgnorePCGCreatedComponents)
{
return PCGHelpers::GetActorBounds(InActor, bIgnorePCGCreatedComponents);
}
e o GetActorBounds que ele chama
FBox GetActorBounds(const AActor* InActor, bool bIgnorePCGCreatedComponents)
{
// Specialized version of GetComponentsBoundingBox that skips over PCG generated components
// This is to ensure stable bounds and no timing issues (cleared ISMs, etc.)
FBox Box(EForceInit::ForceInit);
const bool bNonColliding = true;
const bool bIncludeFromChildActors = true;
if (InActor)
{
InActor->ForEachComponent<UPrimitiveComponent>(bIncludeFromChildActors, [bNonColliding, bIgnorePCGCreatedComponents, &Box](const UPrimitiveComponent* InPrimComp)
{
// Note: we omit the IsRegistered check here (e.g. InPrimComp->IsRegistered() )
// since this can be called in a scope where the components are temporarily unregistered
if ((bNonColliding || InPrimComp->IsCollisionEnabled()) &&
(!bIgnorePCGCreatedComponents || !InPrimComp->ComponentTags.Contains(DefaultPCGTag)))
{
Box += InPrimComp->Bounds.GetBox();
}
});
}
else
{
UE_LOG(LogPCG, Error, TEXT("Actor is invalid in GetActorBounds"));
}
return Box;
}
Como pode ser visto no código acima, o mais importante é obter o BoundsBox do Actor
componente UPrimitiveComponent
, e cada um Actor
pode carregar vários Volumes.
O método comum deste nó é definir alguns no nível Volume
e adicionar o Tag correspondente e, em seguida, filtrá-los no PCG por Tag Volume
e excluir seu volume.
Na figura abaixo, há um Ditch gerado usando um Spline circular e, em seguida, use várias tags "PCG_EXCLUDE" Volume
(vários Volumes estão disponíveis) para abrir dois furos para ele.
Exemplos de aplicações também podem ser encontrados em "ElectricDreams_Env":
decoração em camadas
A decoração em camadas é uma ideia importante na construção do PCG. No nível PCGDemo_Ditch, um fosso consiste nas quatro partes a seguir, do primário ao secundário:
-
O assunto da vala
-
árvores e pedras
-
Conexão entre a vala e o solo
-
detalhe da mancha
Embora a lógica da construção em camadas do PCG neste nível seja complicada, não é difícil de entender, por isso não vou explicá-la neste artigo.
Alguns pontos de conhecimento e habilidades
Use Attribute Operation para preparar atributos em atributos temporários
Se deve gerar colisão
resumo
PCG é muito divertido, a relação entre o tempo, este artigo é escrito aqui primeiro, por favor me corrija se houver algum erro!