Como armazenar dados de contexto global em um sistema de componentes da entidade?

10

Minha pergunta é esta:

Como alguém armazenaria dados de contexto global, ou seja. informações de dados mundiais, hora mundial atual, etc. em um sistema de componente de entidade?

Penso em trabalhar para criar um jogo de simulação de mundo aberto em estilo Dwarf Fortress em C ++. Criei um mecanismo de jogo no estilo de componente de entidade apenas por diversão e atualmente estou tentando descobrir como vou trabalhar em todos os recursos que eu quero. Além do jogo padrão (renderização, física, dados de componentes específicos da entidade, etc.), eu também gostaria de ter alguns dados contextuais globais aos quais todos os sistemas relevantes teriam acesso (ou seja, os dados mundiais como em que ano atualmente é , se o aquecimento global está acontecendo, qualquer coisa que seja relevante para simular um mundo). Eu pensava originalmente em criar um componente "mundial", mas isso parece inútil e difícil se muitos sistemas diferentes precisarem acessar esses dados logicamente "globais".

Faria sentido ter um componente "mundo" ou devo armazenar esses dados de outra maneira?

Também pensei em simplesmente tornar esses dados globais, dando acesso a qualquer sistema que desejasse usá-los; parece uma violação dos princípios de componente de entidade em geral, e talvez confuso por outras razões, mas achei que poderia realmente funcionar.

A outra coisa em que pensei seria realmente incorporar dados relevantes do contexto mundial diretamente nos próprios sistemas. Por exemplo, se eu tivesse um AgeSystem"envelhecido" todas as entidades que têm um getsWeakerAsTimePassescomponente ou outros enfeites, talvez esse sistema possa armazenar dados de tempo relevantes para o mundo diretamente como dados de membros que ele usaria para calcular a passagem do tempo e quanto idade e enfraquecer as pessoas, etc. Essa terceira opção era minha menos favorita, mas algo que me ocorreu no brainstorming.

Alguém pode aconselhar?

Awesomania
fonte
3
A justificativa para votos negativos é educada e útil não apenas para o OP, mas para outros usuários.
MichaelHouse
2
Você construiu um martelo e agora tudo parece um prego. Eu lhe dou permissão para usar mais do que apenas o ECS para armazenar e manipular dados em seu programa, porque nem tudo é um prego.
Patrick Hughes

Respostas:

10

Qualquer maneira que funcione é uma maneira que funcione. Isso parece ridículo, mas, na verdade, seu jogo é 1000x mais importante que sua arquitetura. Escolha qualquer abordagem que desejar e seja fácil de usar.

Os que eu já vi em jogos reais de remessa (usando design baseado em componentes, não o ECS especificamente; nunca vi o ECS puro "in natura", embora muitos designs de componentes tenham elementos semelhantes ao ECS) incluem:

  • Singletons
  • Objetos de "contexto" passados ​​para componentes / sistemas que contêm referências a todos os outros sistemas relevantes
  • Fábricas de componentes que passam identificadores de sistema para componentes individuais
  • Componentes que armazenam referências a sistemas na raiz de uma hierarquia de objetos (somente em alguns jogos ímpares do Unity)
  • Objetos singulares de "mecanismo" passados ​​para sistemas ou componentes que mantêm referências a todos os outros sistemas
  • Sistemas de pesquisa de recursos baseados em string (permitindo que você em C ++ faça algo como handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"), sim, realmente)
  • Pilhas de dados globais e funções livres no estilo C que operam neles
  • Espaços / subespaços e vídeo que o acompanha

Todos eles trabalham. Eu tenho queixas com algumas abordagens e um favorito óbvio, mas todas elas foram usadas para enviar jogos AAA. Às vezes, várias abordagens em um único projeto (mais de 40 a 100 equipes de engenheiros tendem a criar código duplicado aleatório, infelizmente).

Sean Middleditch
fonte
2
Estou curioso para saber qual é o seu favorito óbvio.
ashes999
Os links que forneci são para meus slides e um vídeo meu dando uma palestra sobre o assunto, se houver alguma dica. :)
Sean Middleditch
Ah, então o seu favorito é espaços / subespaços então. :)
ashes999
Ótima resposta. Eu acho que tenho algo resolvido, e na verdade fui em frente e incorporei o conceito de "espaços / subespaços" no meu plano de jogo.
Awesomania