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

Unity拉远相机时Particle System粒子大小不随视距缩放如何解决

问题成因

相机拉远时粒子不随视距同步缩小、显示为模糊斑块,核心是粒子系统的缩放逻辑和相机缩放逻辑不匹配,常见触发原因有三类:

  • 粒子系统Scaling Mode参数设置错误:默认值适配的是常规3D透视相机移动缩放场景,如果你是通过修改正交相机Size参数实现拉远,粒子不会自动响应视口尺寸变化,会以固定渲染尺寸显示在屏幕上,视口拉得越远粒子相对占比越大,就会形成糊块
  • 粒子模拟空间配置错误:Simulation Space设为World时,如果粒子物体的父层级缩放没有随相机视距同步,或者粒子节点位置/缩放被其他脚本锁死,就不会和场景普通物体保持一致的缩放表现
  • 渲染配置异常:粒子Renderer模块开了固定像素尺寸选项、或者粒子Shader关闭了透视校正,也会导致粒子尺寸不随距离变化。
解决方案

基础参数修复(覆盖绝大多数场景)

选中异常的粒子特效预制体/场景物体,在Inspector面板打开Particle System主模块(面板最顶部的默认展开栏):

  1. 找到Scaling Mode选项,按你使用的相机类型切换:
    • 透视相机(靠沿Z轴移动相机位置实现拉远拉近):直接选Hierarchy,粒子会完全跟随层级缩放、透视视距比例同步变化,和场景内普通3D物体表现完全一致
    • 正交相机(靠修改相机Orthographic Size参数实现拉远拉近):先选Local模式,再给粒子物体挂载下面的同步脚本即可:
using UnityEngine;
[ExecuteAlways]
public class OrthoParticleScaleSync : MonoBehaviour
{
    private Camera _mainCam;
    private float _baseCamSize;
    private Vector3 _baseLocalScale;

    void Awake()
    {
        _mainCam = Camera.main;
        _baseCamSize = _mainCam.orthographicSize;
        _baseLocalScale = transform.localScale;
    }

    void LateUpdate()
    {
        if (!_mainCam.orthographic) return;
        float currentScale = _mainCam.orthographicSize / _baseCamSize;
        transform.localScale = _baseLocalScale * currentScale;
    }
}
  1. 检查Simulation Space配置:如果选了World模式,确认粒子物体没有挂载锁定缩放/位置的脚本,且父节点缩放会随相机视距同步调整。

异常排查项

如果改完上面的参数还是有问题,逐项检查下面的配置:

  • 打开Particle System的Renderer模块,把Render Mode从Billboard临时切换为Mesh测试,如果切换后缩放正常,把Billboard模式下的Pixel Size锁定选项关闭,不要开固定屏幕尺寸渲染
  • 检查粒子使用的材质,如果是自定义Shader,确认Shader中开启了透视坐标校正,不要写死屏幕空间的粒子尺寸输出
  • 如果项目里用了后处理栈,临时关闭Bloom、模糊类后处理效果测试,排除粒子过曝+模糊后处理把正常尺寸粒子误渲染成大斑块的情况。

内容的提问来源于stack exchange,提问作者Jerry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:34:13