首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎样才能使粒子发光并向周围投射光呢?

我怎样才能使粒子发光并向周围投射光呢?
EN

Game Development用户
提问于 2015-12-21 15:57:27
回答 5查看 28.4K关注 0票数 21

我目前正试图在一片黑暗的森林上制造萤火虫效应。该级别有非常低的光和球员是少数几个光源之一。为了让玩家看得更清楚,我试图让发光的萤火虫在地图上随机出现。一种方法是使用粒子系统。但我不能让粒子照亮周围的环境。有办法这样做吗?

EN

回答 5

Game Development用户

回答已采纳

发布于 2016-09-29 12:56:26

光发射粒子现在是在5.5中内置的统一特性。

只需在粒子探测仪中启用灯光,加入对光预制件的引用(点灯和点灯都可以工作),并将比率更改为1。

发出光的粒子:

原来,这是一个相当优化的设置,运行在1500+fps在我的平台上,即使最大的灯在数百。

编辑:经过一些观察,在我看来,粒子光在每个片段照明和顶点照明之间切换(大概是为了优化?)这可能会产生少量的视觉伪影,如果设置的最大灯太高。

Edit2:正如DMGregory所指出的,工件是前向呈现优化的副产品。延迟照明解决了这个问题。添加更好的gif

票数 8
EN

Game Development用户

发布于 2015-12-21 17:49:15

提醒:

这个答案已经过时了。统一现在支持点光粒子的本土化。有关详细信息,请参阅这个答案

我将在这里为任何好奇的人留下这篇文章,或者使用旧版本的Unity,或者需要比本机方法提供更多的手动控制--只是请注意,本机支持可能比下面介绍的方法更高效和可扩展。

我不知道为什么这么多的答案声称这是困难或不可能的。对于运行在PC上的现代延迟渲染管道来说,处理几十个动态点灯是非常传统的。

下面是我做的一个简单的例子:

我使用这个脚本动态地为我的max粒子生成足够的灯(确保您调整了粒子系统的设置,使最大值是合理的-默认的1000将不会使您的显卡非常高兴),然后更新它们以跟随活动粒子:

代码语言:javascript
运行
复制
[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,加上一个带有广告牌的四边形和一个带有自定义运动/闪烁脚本的灯,你就能更好地控制萤火虫的飞行,因为要想得到一个令人信服的漫游者,需要比我所知道的更多的粒子系统艺术性。;)

票数 31
EN

Game Development用户

发布于 2015-12-21 16:55:22

几年前,在动态灯还没买得起之前,我们就会简单地使用2D广告牌粒子效应和添加剂的混合。它将照亮白色的景色。通过用萤火虫的正确深度绘制它,你几乎可以得到正确的排序。与α混合相比,当透支时,相加α不需要排序。它不会照亮整个场景,但它会照亮萤火虫周围的区域。如果你需要的话,你可以每隔几秒钟选择一只萤火虫来点亮现场。

已经有一个关于辉光效应如何在2D游戏中实现这样的照明?的问题和答案

票数 4
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/113440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档