我目前正试图在一片黑暗的森林上制造萤火虫效应。该级别有非常低的光和球员是少数几个光源之一。为了让玩家看得更清楚,我试图让发光的萤火虫在地图上随机出现。一种方法是使用粒子系统。但我不能让粒子照亮周围的环境。有办法这样做吗?
发布于 2016-09-29 04:56:26
光发射粒子现在是在5.5中内置的统一特性。
只需在粒子探测仪中启用灯光,加入对光预制件的引用(点灯和点灯都可以工作),并将比率更改为1。
发出光的粒子:
原来,这是一个相当优化的设置,运行在1500+fps在我的平台上,即使最大的灯在数百。
编辑:经过一些观察,在我看来,粒子光在每个片段照明和顶点照明之间切换(大概是为了优化?)这可能会产生少量的视觉伪影,如果设置的最大灯太高。
Edit2:正如DMGregory所指出的,工件是前向呈现优化的副产品。延迟照明解决了这个问题。添加更好的gif
发布于 2015-12-21 09:49:15
这个答案已经过时了。统一现在支持点光粒子的本土化。有关详细信息,请参阅这个答案。
我将在这里为任何好奇的人留下这篇文章,或者使用旧版本的Unity,或者需要比本机方法提供更多的手动控制--只是请注意,本机支持可能比下面介绍的方法更高效和可扩展。
我不知道为什么这么多的答案声称这是困难或不可能的。对于运行在PC上的现代延迟渲染管道来说,处理几十个动态点灯是非常传统的。
下面是我做的一个简单的例子:
我使用这个脚本动态地为我的max粒子生成足够的灯(确保您调整了粒子系统的设置,使最大值是合理的-默认的1000将不会使您的显卡非常高兴),然后更新它们以跟随活动粒子:
[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);
}
}
}
编辑:您可以创建一个预制件,首先创建一个游戏对象(在本例中,创建-> Light -> Point Light),然后用所需的名称/参数/脚本/子程序设置它,然后将它从层次结构中拖到项目资源管理器中。这可以将对象保存为可以跨多个场景重用的资产&脚本,并具有一定程度的继承。您可以删除场景中的副本,该资产将保留在您的“资产”文件夹中,以便在需要时引用。
确保lightPrefab有一个相对较小的范围,而不是阴影投射,以便为您的场景中发生的一切提供最大的性能空间。你不需要让lightPrefab本身变成绿色(或者你的萤火虫的颜色)--它会从粒子的颜色中提取出来。
不过,你可能会发现,如果你让每只萤火虫都有自己的GameObject,加上一个带有广告牌的四边形和一个带有自定义运动/闪烁脚本的灯,你就能更好地控制萤火虫的飞行,因为要想得到一个令人信服的漫游者,需要比我所知道的更多的粒子系统艺术性。;)
发布于 2015-12-21 08:55:22
几年前,在动态灯还没买得起之前,我们就会简单地使用2D广告牌粒子效应和添加剂的混合。它将照亮白色的景色。通过用萤火虫的正确深度绘制它,你几乎可以得到正确的排序。与α混合相比,当透支时,相加α不需要排序。它不会照亮整个场景,但它会照亮萤火虫周围的区域。如果你需要的话,你可以每隔几秒钟选择一只萤火虫来点亮现场。
已经有一个关于辉光效应如何在2D游戏中实现这样的照明?的问题和答案
https://gamedev.stackexchange.com/questions/113440
复制相似问题