Heads-up:
Ta odpowiedź jest nieaktualna. Unity obsługuje teraz natywnie punktowe cząsteczki światła. Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.
Zostawię to tutaj dla każdego, kto jest ciekawy, używa starych wersji Unity lub potrzebuje więcej ręcznej kontroli niż oferuje natywna metoda - pamiętaj tylko, że natywna obsługa będzie prawdopodobnie znacznie wydajniejsza i skalowalna niż podejście przedstawione poniżej.
Nie jestem pewien, dlaczego tak wiele odpowiedzi twierdzi, że jest to trudne lub niemożliwe. Obsługa kilkudziesięciu dynamicznych świateł punktowych jest dość konwencjonalna nowoczesnego odroczonego renderingu działającego na PC.
Oto szybki przykład, który przygotowałem:
Używam tego skryptu, aby dynamicznie odradzać wystarczającą ilość światła dla moich maksymalnych cząstek (upewnij się, że dostosujesz ustawienia Particle System, aby maksimum było rozsądne - domyślnie 1000 nie sprawi, że twoja karta graficzna będzie bardzo szczęśliwa), a następnie zaktualizuje je, aby podążały za aktywnym cząstki:
[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);
}
}
}
Edytować: możesz stworzyć prefabrykat , najpierw tworząc obiekt gry (w tym przypadku Utwórz -> Światło -> Punktowe światło), ustawiając go z żądaną nazwą / parametrami / skryptami / dziećmi, a następnie przeciągając go z hierarchii do twój odkrywca projektu. Zapisuje to obiekt jako zasób, który można ponownie wykorzystać w wielu scenach i skryptach, z pewnym stopniem dziedziczenia. Możesz usunąć kopię ze sceny, a zasób pozostanie w folderze Zasoby, do którego można będzie się odwoływać w razie potrzeby.
Upewnij się, że lightPrefab ma stosunkowo niewielki zasięg i nie rzuca cieni, aby zapewnić Ci najwyższą wydajność nad wszystkim, co dzieje się w Twojej scenie. Nie musisz sprawiać, aby sam lightPrefab był zielony (lub kolor twoich świetlików) - odbierze go z koloru cząsteczek.
Może się okazać, że masz lepszą kontrolę nad lotem świetlików, jeśli stworzysz każdy GameObject, z billboardowanym quadem i lampą dołączoną do niestandardowego skryptu ruchu / blinkig, ponieważ uzyskanie przekonującej wędrówki wymaga więcej artyzmu systemu cząstek niż Wiem. ;)