我目前正在尝试在黑暗的森林中制作萤火虫效果。该水平仪的光线非常暗,播放器是少数几个光源之一。为了让玩家更好地看到关卡,我尝试使发光的萤火虫随机出现在地图上。一种方法是使用粒子系统。但是我不能使粒子在周围环境中发光。有没有办法做到这一点?
我目前正在尝试在黑暗的森林中制作萤火虫效果。该水平仪的光线非常暗,播放器是少数几个光源之一。为了让玩家更好地看到关卡,我尝试使发光的萤火虫随机出现在地图上。一种方法是使用粒子系统。但是我不能使粒子在周围环境中发光。有没有办法做到这一点?
Answers:
发光粒子现在是5.5中的内置功能。
只需在粒子检查器中启用“灯光”,添加对灯光预制件的引用(点光源和聚光灯都可以使用),并将“比率”更改为1。
事实证明,这是一个相当优化的设置,即使在数百个最大灯光下,我的装备也能以1500 + fps的速度运行。
编辑:经过观察,在我看来粒子光在每个片段照明和顶点照明之间切换(大概是为了优化?)。如果将最大光照设置得太高,可能会产生少量的视觉伪影。
Edit2:正如DMGregory指出的那样,工件是前向渲染优化的副产品。延迟照明解决了这个问题。添加了更好的gif
这个答案已经过时了。现在,Unity本机支持点光源粒子。请参阅此答案以获取全部详细信息。
我将在这里留下任何好奇的人,或者使用Unity的旧版本,或者需要比本机方法所提供的更多的手动控制-请注意,本机支持可能比下面介绍的方法更加有效和可扩展。
我不确定为什么这么多答案都认为这是困难或不可能的。对于在PC上运行的现代延迟渲染管线而言,处理几十个动态点光源是非常常规的。
我使用此脚本为我的最大粒子动态生成足够的灯光(确保您调整了粒子系统设置,因此最大数值是合理的-默认值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);
}
}
}
编辑:您可以先创建一个游戏对象(在本例中为创建->灯光->点光源),然后使用所需的名称/参数/脚本/子代进行设置,然后将其从层次结构中拖入,以创建预制件您的项目资源管理器。这会将对象另存为资产,可以在多个场景和脚本之间重复使用,并且具有一定程度的继承性。您可以删除场景中的副本,资产将保留在Assets文件夹中,以便在需要时进行引用。
确保lightPrefab的范围相对较小并且没有阴影投射,以便为场景中发生的一切提供最大的性能扩展空间。您不需要将lightPrefab本身变成绿色(或萤火虫的颜色)-它会从粒子的颜色中拾取它。
如果将每个萤火虫制作成自己的GameObject,并带有广告牌四边形和自定义运动/眨眼脚本的灯,则可能会更好地控制萤火虫的飞行,因为获得令人信服的漂移所花费的粒子系统技艺比我知道。;)
几年前,在价格不高的动态灯可以买到之前,我们只需使用带有附加混合功能的2D广告牌粒子效果。它将使场景变白。通过以正确的萤火虫深度绘制它,您将获得几乎正确的排序。与Alpha混合相比,叠加自身时,附加Alpha不需要排序。它不会照亮所有场景,但是会照亮萤火虫周围的区域。然后,如果需要,您可以动态照明并每隔几秒钟选一次萤火虫之一来实际照明场景。
关于发光效果已经存在一个问题和答案如何在Unity 2D游戏中实现这种照明?
不幸的是,我对当前版本的Unity并没有太多的经验(很多年前我曾玩弄过它),所以我不确切知道您必须在引擎中使用哪些功能集。
无论如何,无论您使用哪种发动机,都应尽量避免使用动态照明。它们在计算上非常昂贵,并且往往以非常指数的方式增加场景的复杂性。但是,就像大多数3D渲染的日常工作一样,您可以通过多种方法通过作弊来获得相似的效果。
实现类似效果的一种可能方法是将预制的发光纹理映射到萤火虫下方的地形(假设Y =上/下坐标系),其中X和Z位置控制发光在地形上的位置和Y偏移从控制纹理的Alpha的地形开始(更亮=更接近地形)
当然,这种方法有几个缺点。您将不会因为没有使用光而投射阴影,也不会影响世界上的任何其他几何体(道具,树叶等)
Light
在火源处使用,并在脚本中播放其大小,以便产生燃烧效果。并使用您的粒子系统:)