Unity中使用C#脚本解决移动相机视角时粒子翻转问题
问题描述
使用Unity粒子系统制作云朵效果时,移动相机视角会出现粒子180度翻转的异常。勾选粒子设置中的Allow Roll选项可直接规避该问题,现需在*取消勾选Allow Roll*的前提下,仅通过C#脚本实现防粒子翻转效果。
实现逻辑
取消Allow Roll后,粒子系统Billboard朝向计算会锁定Z轴滚转自由度,当相机自身发生Z轴滚转(第一人称视角倾斜、轨道相机环绕旋转时很容易出现),粒子朝向计算就会出现180度轴向翻转。解决思路是每帧获取渲染相机的Z轴滚转角度,给粒子系统施加反向的Z轴旋转偏移,抵消翻转量。
操作步骤
- 选中挂载云朵粒子系统的物体,挂载以下C#脚本
- 脚本运行时会自动关闭粒子的
Allow Roll选项,无需手动在粒子面板设置
using UnityEngine; [RequireComponent(typeof(ParticleSystem))] public class ParticleRollFix : MonoBehaviour { private ParticleSystem _ps; private ParticleSystem.MainModule _mainModule; private Transform _renderCam; private void Awake() { _ps = GetComponent<ParticleSystem>(); _mainModule = _ps.main; _mainModule.allowRoll = false; // 替换为实际渲染该粒子的相机,默认取主相机 _renderCam = Camera.main.transform; } private void LateUpdate() { // 取相机Z轴欧拉角,转弧度后反向赋值给粒子Z轴起始旋转偏移 float camRoll = _renderCam.eulerAngles.z * Mathf.Deg2Rad; _mainModule.startRotationZ = -camRoll; } }
补充说明:如果你的粒子本身配置了Z轴随机旋转,上述全局赋值startRotationZ的方式会覆盖原有随机效果,此时可以改为在LateUpdate中通过
ParticleSystem.GetParticles()获取所有存活粒子,逐个修正每个粒子的Z轴旋转值即可。
内容的提问来源于stack exchange,提问作者ImaiJiro
相关产品推荐
相关产品推荐

