Parçacıklar çevresini nasıl parlatabilir ve parlatabilir?


22

Şu anda karanlık bir orman üzerinde ateş böceği etkisi yaratmaya çalışıyorum. Seviye çok düşük bir ışığa sahip ve oyuncu birkaç ışık kaynağından biri. Oyuncunun seviyeyi daha iyi görmesini sağlamak için, parlayan ateşböceklerinin haritada rasgele görünmesini sağlamaya çalışıyorum. Bir yol bir parçacık sistemi kullanmaktır. Fakat parçacıkları çevreye hafifçe vurmayacağım. Bunu yapmanın bir yolu var mı?


3
Buradaki asıl mesele, "ışık pahalıdır". Alanı yeterince aydınlatan bazı sabit noktalı ışıkları yerleştirmekten, ışıkları bir ışık haritasına yerleştirmekten daha iyi olabilir, daha sonra düzinelerce korkunç pahalı dinamik ışık kullanmak yerine ışık kaynağının nereden geldiğini açıklamak için parçacıkları kullanabilirsiniz.
Draco18,

@ Draco18s Onlarca ateşböceği olmayacak. Sadece oyuncunun görünümünde görünecekler. Yukarıdan aşağıya doğru kontrol etmek kolaydır. Ve herhangi bir zamanda yalnızca 10 ateşböcekinden daha az olmamalıdır. 10 dinamik nokta ışığının pahalı olduğunu sanmıyorum?
DarkDestry,

Varsayılan olarak Unity, bir kerede yalnızca iki aktif dinamik ışığın geometriyi aydınlatmasına izin verir (2D kurulum için farklı olsa da). Elbette, bunu artırabilirsiniz, ancak +1 ışığının çizim çağrıları üzerinde x2 etkisi olduğunu unutmayın.
Draco18,

2
@ Draco18s bu ileri işleme yolunda geçerli olabilir, ancak "Ertelenmiş Gölgeleme kullanılırken, bir nesneyi etkileyebilecek ışıkların sayısında bir sınır yoktur " belgesinde belirtildiği gibi olabilir - - Sadece küçük bir kısmını etkileyen birçok küçük ışık Ekran tam olarak, kullanımda ertelenen işleme yolları, verimli bir şekilde kullanımda mükemmel bir türdür. (Ileri render ile olduğu gibi bir çarpan yerine, benzersiz ışık başına tek bir çekme çağrısının tipik bir maliyetiyle)
DMGregory

İyi bir noktaya değindin. Çoğu zaman farklı görüntü oluşturma yollarını unutuyorum.
Draco18,

Yanıtlar:


7

Işık yayan parçacıklar artık 5.5'teki Unity özelliğidir.

Basitçe parçacık denetçisindeki Işıkları etkinleştirin, bir ışık prefabrikine atıfta bulunun (hem nokta hem de spot lambalar çalışır) ve Oranı 1 olarak değiştirin.

enter image description here

Ve voilà, ışık yayan parçacıklar: ![enter image description here

Görünüşe göre, bu, son derece optimize edilmiş bir kurulum, yüzlerce maksimum ışıkta bile donanımımda 1500 + fps hızında çalışıyor.

Düzenleme: Bazı gözlemlerden sonra, parçacık ışıklarının parça aydınlatma ve köşe aydınlatma (muhtemelen optimizasyon için?) Başına geçiş yaptığı anlaşılıyor. Bu, maksimum ışıklar çok yükseğe ayarlandığı takdirde az miktarda görsel eser üretebilir.

Düzen2: DMGregory'nin belirttiği gibi, eserler ileri renderleme optimizasyonlarının bir yan ürünüdür. Ertelenmiş aydınlatma sorunu çözdü. Daha güzel gif eklendi


1
Bu iyi haber! :) Bu cevap, yeni parçacık sistemi özelliklerinin nasıl kurulacağına dair adım adım talimatlar içeriyorsa daha iyi olurdu.
DMGregory

1
Gördüğünüz tepe ışıklandırma davranışı, Birliğin ileriye aktarmada uyguladığı optimizasyonlardan bazıları gibi görünmektedir. Ertelenen yolu kullanırken aynı davranışı görüyor musunuz?
DMGregory

Haklısın! Ertelenmiş oluşturma yolunu kullanırken artık eserler mevcut değildir.
eclmist

31

Önüne bak:

Bu cevap modası geçmiş. Birlik şimdi doğal olarak nokta ışık parçacıklarını destekliyor. Lütfen tüm detaylar için bu cevaba bakınız.

Bunu burada meraklı veya Unity'nin eski sürümlerini kullanan veya yerel yöntemden daha fazla manuel kontrole ihtiyaç duyanlar için burada bırakacağım - yalnızca yerel desteğin aşağıda sunulan yaklaşımdan daha verimli ve ölçeklenebilir olabileceğini unutmayın.


Neden bu kadar çok cevabın bunun zor ya da imkansız olduğunu iddia ettiğinden emin değilim. Birkaç düzine dinamik nokta ışığının kullanılması, kullanmak, PC'de çalışan modern bir ertelenmiş işleme hattı .

İşte pişirdiğim hızlı bir örnek: Example of fireflies with lights

Bu betiği, maksimum parçacıklarım için yeterince ışık üretmek için dinamik bir şekilde üretmek için kullanıyorum (Partikül Sistem ayarlarınızı ayarladığınızdan emin olun, bu nedenle maksimum makul olur - 1000'in varsayılanı, grafik kartınızı çok mutlu etmez) ve ardından aktif olanları takip edecek şekilde günceller. parçacıklar:

[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);
        }
    }
}

Düzenleme: önce bir oyun nesnesi oluşturarak (bu durumda, Oluştur -> Işık -> Nokta Işığı), onu istediğiniz ad / parametreler / komut dosyaları / çocuklar ile ayarlayıp ardından Hiyerarşinizden sürükleyerek bir prefabrik oluşturabilirsiniz. Proje gezgini. Bu, nesneyi birden fazla sahne ve komut dosyasında, bir kalıtım derecesiyle yeniden kullanabileceğiniz bir varlık olarak kaydeder. Sahnenizdeki kopyayı silebilirsiniz; varlık gerektiğinde başvurulacak Varlıklar klasörünüzde kalır.

LightPrefab'in göreceli olarak daha küçük bir aralığa sahip olduğundan ve sahnenizde olup biten her şey için en iyi performans alanını sağlamak için gölge yayını yapmadığından emin olun. LightPrefab'in kendisini yeşil (veya ateş böceklerinin rengini) yapmanıza gerek yoktur - onu parçacıkların renginden alır.

Her ikisini de kendi GameObject'i yaparsanız, ateşli uçakların uçuşu üzerinde daha iyi bir kontrole sahip olduğunuzu öğrenebilirsiniz, ancak bir reklam panosu ve özel bir hareket / yanıp sönen senaryo ile tutturulmuş bir ışıkla Biliyorum. ;)


Aslında ... ateşböcekleri için gölge yayın kullanmamayı söylesem de, örnek sahnemde açmayı denedim ve herhangi bir soruna neden olmadı. Ateşböcekleri nesneleri geçerken gölgelerin etrafında dolaşma şekli gerçekten harika ve ürkütücü bir atmosfere katkıda bulunabilir. Kilometreniz sahnenizin karmaşıklığına ve hedef donanımınıza bağlı olarak değişebilir, bu yüzden emin olmalısınız, ancak bu benim açımdan erken bir optimizasyon durumu olabilir. :)
DMGregory

Hafif bir prefabrik nasıl yaratılır?
DarkDestry

Ayrıca, bazı nedenlerden dolayı, ParticleSystem.Particle, eski partikül anlamına gelir. Bunun için bir GetCurrentColor veya GetCurrentSize yöntemi yoktur.
DarkDestry

@DarkDestry Prefabrik yapı hakkındaki cevaba bir not ekledim. Eksik fonksiyonlara gelince, bu bir sürüm sorunu olabilir - 5.3'te çalışıyorum, Unity'nin önceki sürümlerinde bunu farklı bir şekilde yapabilirsiniz. Uygulamadaki detayları , Hamza Hasan'ın nazikçe yarattığı odayı kullanarak konuşalım .
DMGregory

Yani hafif bir prefabrik normal bir prefabrik ile aynıdır. Hafif bir prefabrik olarak bahsedildiğinde şaşırmıştı.
DarkDestry

3

Yıllar önce, dinamik ışıkların ekonomik olmasından önce, basit bir şekilde ilave harmanlamalı 2D-billboard parçacıklı efekt kullanırdık. Sahneyi beyaza doğru aydınlatırdı. Ateş böceği doğru derinliği ile çizerek, neredeyse doğru sıralama elde edersiniz. Katkı alfa, alfa harmanlama ile karşılaştırıldığında kendisini fazla abartırken sıralama gerekmez. TÜM sahneyi aydınlatmaz, ancak ateş böceği etrafındaki alanı aydınlatır. Dinamik bir ışık alabilir ve gerekirse her sahneyi aydınlatmak için birkaç saniyede bir ateşböceklerinden birini seçebilirsiniz.

Kızdırma etkileri hakkında zaten bir soru ve cevap var . Unity'de 2D oyunlarda nasıl böyle bir ışık elde edersiniz?


0

Ne yazık ki, şu anki haliyle Unity ile ilgili çok fazla deneyimim olmadı (yıllar önce onunla dalga geçtim), bu nedenle motorda çalışmak için hangi özellik kümelerini tam olarak bilmiyorum.

Her durumda, hangi motorla çalıştığınızın önemi yok, dinamik ışıklar mümkün olduğunda kaçınmanız gereken bir şeydir. Çok hesaplamalı olarak pahalıdırlar ve sahne karmaşıklığını çok üstel bir şekilde ekleme eğilimindedirler. Ancak, çoğu 3B oluşturma için günün sırası olduğu gibi, hile yaparak benzer efektler elde etmenin birçok yolu vardır;

Benzer bir etki elde etmenin olası bir yolu, ateşli sineklerin altındaki araziye, önceden yapılmış bir parıltı dokusunu eşleştirmektir, (bir Y = yukarı / aşağı koordinat sistemi varsayarsak) ışığın arazi ve Y konumu üzerindeki konumunu kontrol eden X ve Z konumlarıyla doku alfaını kontrol eden araziden (daha parlak = araziye yakın)

Elbette bu yöntemin dezavantajları vardır. Işık kullanılmadığı için gölgeler atmayacaksınız ve dünyadaki başka herhangi bir geometriyi etkilemeyeceksiniz (sahne, yaprak vb.)


-2

LightAteşin kökeninde kullanın ve büyüklüğüyle senaryoda oynayın, böylece yanma etkisi yaratır. Ve parçacık sisteminizi kullanın :)


Sahnede ateş yok. Kıt parçacıklara sahip olmak, varlığın içinde ve dışında belirir. Parçacıklar için hiçbir sabit pozisyon yoktur. Lütfen soruyu okuyun.
DarkDestry

Peki anlaşma nedir? partikül prefabrikinize önceden tanımlanmış pozisyonlarda ışık tutabilirsiniz
Hamza Hasan

Soru, bunun nasıl yapılacağıdır. Birliğin parçacık sistemini kullanıyorum. Ve orada bir prefabrik göremiyorum. Benden sadece ışığı olan ve senaryo üzerinde temeli olan bir prefabrik yaratmamı istemediğiniz sürece
DarkDestry

Yani sahnede partikül gameObject var. Aynı oyun nesnesine bir ışık ekleyin ve bu gameObject'i Birlik Dosya Gezgini'ne sürükleyerek prefabrik yapın.
Hamza Hasan

Olay yerinde bir Parçacık Sistemi oyunu var. Parçacık değil.
DarkDestry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.