Unity 修改粒子参数 您所在的位置:网站首页 unity设置粒子形状 Unity 修改粒子参数

Unity 修改粒子参数

2023-08-16 17:42| 来源: 网络整理| 查看: 265

Unity新版本的粒子代码框架更改过,之前的很多api是不能用的。

新版本的粒子效果把整个数据分成了几大模块,每个模块是一个struct

public struct MainModule { public float duration { get; set; } public float startRotationXMultiplier { get; set; } public MinMaxCurve startRotationY { get; set; } public float startRotationYMultiplier { get; set; }. public MinMaxCurve startRotationZ { get; set; } public float startRotationZMultiplier { get; set; } public float flipRotation { get; set; } public MinMaxGradient startColor { get; set; } public MinMaxCurve gravityModifier { get; set; } public float gravityModifierMultiplier { get; set; } public ParticleSystemSimulationSpace simulationSpace { get; set; } public Transform customSimulationSpace { get; set; } public float simulationSpeed { get; set; } public bool useUnscaledTime { get; set; } public ParticleSystemScalingMode scalingMode { get; set; } public bool playOnAwake { get; set; } public int maxParticles { get; set; } public ParticleSystemEmitterVelocityMode emitterVelocityMode { get; set; } public MinMaxCurve startRotationX { get; set; } public ParticleSystemStopAction stopAction { get; set; } public float startRotationMultiplier { get; set; } public bool startRotation3D { get; set; } public bool loop { get; set; } public bool prewarm { get; set; } public float startDelayMultiplier { get; set; } public MinMaxCurve startLifetime { get; set; } public float startLifetimeMultiplier { get; set; } public MinMaxCurve startSpeed { get; set; } public float startSpeedMultiplier { get; set; } public bool startSize3D { get; set; } public MinMaxCurve startSize { get; set; } public float startSizeMultiplier { get; set; } public MinMaxCurve startSizeX { get; set; } public float startSizeXMultiplier { get; set; } public MinMaxCurve startSizeY { get; set; } public float startSizeYMultiplier { get; set; } public MinMaxCurve startSizeZ { get; set; } public float startSizeZMultiplier { get; set; } public MinMaxCurve startRotation { get; set; } [Obsolete("Please use flipRotation instead. (UnityUpgradable) -> UnityEngine.ParticleSystem/MainModule.flipRotation", false)] public float randomizeRotationDirection { get; set; } }

这是MainModule的代码,主要是修改粒子修过最上面部分。ParticleSystem中有main字段是保存MainModule数据的。

然后今天看网上说修改方式

ParticleSystem.MainModule main = m_particle.main; main.duration = setting.duration; main.loop = false;

当时觉得不可能这样修改,但是测试后确实可以。为什么觉得不可能呢?因为MainModule是值类型,你修改main的值,是不可能影响到ParticleSystem中的main的。

于是就查看了MainModule源码,截取部分:

public struct MainModule { private ParticleSystem m_ParticleSystem; public float duration { get { return ParticleSystem.MainModule.GetDuration(this.m_ParticleSystem); } set { ParticleSystem.MainModule.SetDuration(this.m_ParticleSystem, value); } } public bool loop { get { return ParticleSystem.MainModule.GetLoop(this.m_ParticleSystem); } set { ParticleSystem.MainModule.SetLoop(this.m_ParticleSystem, value); } } }

看这个应该就明白了,每个Module中应该都保存了ParticleSystem 。然后set方法中,通过ParticleSystem修改的,因为ParticleSystem是引用类型,因此这样修改就应用到ParticleSystem中了

 

最后补充一句    ParticleSystem.main.loop = fale; 这种写法是不行的,值类型是不允许这样修改的, ParticleSystem.main通过get返回的是值类型,修改是不影响ParticleSystem.main的,因此这种方法被编译禁止,会报错的



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有