You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中使用C#脚本解决移动相机视角时粒子翻转问题

问题描述

使用Unity粒子系统制作云朵效果时,移动相机视角会出现粒子180度翻转的异常。勾选粒子设置中的Allow Roll选项可直接规避该问题,现需在*取消勾选Allow Roll*的前提下,仅通过C#脚本实现防粒子翻转效果。
粒子180度翻转现象参考

实现逻辑

取消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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:36:18