美文网首页unity
[Unity 3d] 从源码看动态修改ParicleSystem

[Unity 3d] 从源码看动态修改ParicleSystem

作者: 雨落随风 | 来源:发表于2019-07-07 21:55 被阅读15次

    在本文,笔者准备教大家怎么在代码中(动态)为粒子系统参数赋值。

    前言:

    很多人都喜欢问怎么动态获取和修改粒子系统的参数啊,所以今天决定行文一篇以叙之,盼解惑答疑。

    疑惑:

    很多时候,很多同学都会有这些个疑问:

    1. 我用粒子系统的实例怎么点不出我想要的字段啊,就算点出了也用不了啊?


      图一
    2. 我知道想要修改粒子系统参数必须先点出子模组,然后再接着点能点出那个字段可是修改会报错,究竟怎么赋值呢?


      图二
    3. 我知道需要缓存子模块,然后修改它就行了,但它是结构体呀,为什么是只读属性,难道不需要赋值回去吗?


      图三

    答疑:

    1. 新的粒子系统集成了多个模组,Inspector 中指定模组的参数,想要动态修改也只能通过这个模块的实例来访问,就比如图一参数已经归并到 MainModule 那么直接使用粒子系统的实例访问的时候会提示错误也不会太意外啦。

    2. 关于第二点,主要是由于模组是结构体而不是class 。

    3. 疑惑三也是大家都会遇到的,明明是结构体,值类型啊,为什么不赋值回去?改了有没有效果哦?
      答案当然是有效果啦,之所以不需要赋值回去是因为这些个 模组结构体在实例化的时候通过构造函数早早的就把粒子系统的实例存在了结构体的实例里面啦。

    4. 针对第三点,我们找下源码看看就晓得啦:

      • 通过反编译软件 dnSpy 看:


      • 通过 Unity 官方发布的源码看:

    总结

    • 怎么样,现在看到下面这种赋值方法不会有疑虑了吧,它可是标准答案哟:
            ParticleSystem particle=GetComponent<ParticleSystem>();
            ParticleSystem.EmissionModule emissionModule= particle.emission;
            emissionModule.burstCount = 50;
    

    扩展阅读:

    0xd4d/dnSpy: .NET debugger and assembly editor
    Unity-Technologies/UnityCsReference: Unity C# reference source code

    相关文章

      网友评论

        本文标题:[Unity 3d] 从源码看动态修改ParicleSystem

        本文链接:https://www.haomeiwen.com/subject/swpihctx.html