Atenção:
Esta resposta está desatualizada. A unidade agora suporta partículas de luz pontuais nativamente. Por favor, veja esta resposta para mais detalhes.
Vou deixar esse post aqui para qualquer pessoa curiosa, ou usando versões antigas do Unity, ou precisando de mais controle manual do que o método nativo oferece - observe que o suporte nativo provavelmente será muito mais eficiente e escalável do que a abordagem apresentada abaixo.
Não sei por que tantas respostas afirmam que isso é difícil ou impossível. O manuseio de algumas dezenas de luzes de ponto dinâmico é bastante convencional para um pipeline de renderização diferida moderno em execução no PC.
Aqui está um exemplo rápido que eu preparei:
Eu uso esse script para gerar dinamicamente luzes suficientes para minhas partículas máximas (certifique-se de ajustar as configurações do sistema de partículas para que o máximo seja razoável - o padrão de 1000 não deixará sua placa gráfica muito feliz) e atualize-as para seguir as instruções ativas partículas:
[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {
public Light lightPrefab;
ParticleSystem _system;
ParticleSystem.Particle[] _particles;
Light[] _lights;
void Start () {
_system = GetComponent<ParticleSystem>();
_particles = new ParticleSystem.Particle[_system.maxParticles];
_lights = new Light[_system.maxParticles];
for(int i = 0; i < _lights.Length; i++)
{
_lights[i] = (Light)Instantiate(lightPrefab);
_lights[i].transform.parent = transform;
}
}
void Update () {
int count = _system.GetParticles(_particles);
for(int i = 0; i < count; i++)
{
_lights[i].gameObject.SetActive(true);
_lights[i].transform.localPosition = _particles[i].position;
// Looks like the GetCurrentColor function was added in 5.3.
// You can use other methods in earlier Unity versions.
_lights[i].color = _particles[i].GetCurrentColor(_system);
}
for (int i = count; i < _particles.Length; i++)
{
_lights[i].gameObject.SetActive(false);
}
}
}
Editar: você pode criar uma pré - fabricada criando primeiro um objeto de jogo (neste caso, Criar -> Luz -> Luz de ponto), configurando-o com o nome / parâmetros / scripts / filhos que deseja e arrastando-o da sua Hierarquia para seu explorador de projetos. Isso salva o objeto como um ativo que você pode reutilizar em várias cenas e scripts, com um grau de herança. Você pode excluir a cópia em sua cena e o ativo permanecerá na pasta Ativos para ser referenciado quando necessário.
Certifique-se de que o lightPrefab tenha um alcance relativamente pequeno e não seja transmitido por sombras, para oferecer o máximo de desempenho para tudo o que acontece na sua cena. Você não precisa tornar o lightPrefab verde (ou a cor dos seus vaga-lumes) - ele será absorvido pela cor das partículas.
Você pode achar que tem um controle melhor sobre o voo dos vaga-lumes se criar cada um seu próprio GameObject, com um quad de outdoor e uma luz anexada a um script de movimento / piscada personalizado, pois obter uma caminhada convincente requer mais arte do sistema de partículas do que Eu sei. ;)