No bevy, podemos definir SystemParam
s personalizados como neste exemplo
/// The [`SystemParam`] struct can contain any types that can also be included in a
/// system function signature.
///
/// In this example, it includes a query and a mutable resource.
#[derive(SystemParam)]
struct PlayerCounter<'w, 's> {
players: Query<'w, 's, &'static Player>,
count: ResMut<'w, PlayerCount>,
}
A documentação do SystemParam explica que
Estruturas SystemParam derivadas podem ter dois tempos de vida:
'w
para dados armazenados no Mundo e's
para dados armazenados no estado do parâmetro.
Considere a &static
vida toda Player
...
Eu entenderia isso como "O Player deve existir durante toda a duração em que o programa estiver em execução", mas isso é claramente falso, pois a Query
também pode ser usado sem nenhuma Player
Entidade... em vez disso, parece mais que this 'static
lifetime se refere apenas ao tipo em si ter que existir. Mas essas são apenas suposições.
Qual é o significado do &'static
tempo de vida Player
aqui e por que/quando ele é necessário?
O uso de
'static
here é principalmente um espaço reservado. Não significa quePlayer
s você passa pela consulta ao vivo para sempre. Isso é específico paraQuery
e nãoSystemParam
s como um todo -QueryData
tem mais exemplos com'static
.O
&'static Player
tipo acaba sendo usado como umWorldQuery
peloQuery
dentro do qual oItem
s que ele produz é&'w Player
onde'w
é o tempo de vida do mundo. Isso é feito dessa forma porque oQueryData
traço que o tipo de consulta precisa satisfazer não está vinculado diretamente ao tempo de vida do mundo - ele só obtém esse tempo de vida quando necessário. Você não pode realmente expressar o tempo de vida real doPlayer
s que você obteria dessa posição, então'static
é usado como um espaço reservado.Isso também pode ser feito para melhorar a ergonomia do sistema: a vida útil
fn update_players(q: Query<&Player>)
não precisa estar vinculada a nada específico (mas não tenho certeza se isso foi uma motivação).