Unity拉远相机时Particle System粒子大小不随视距缩放如何解决
问题成因
相机拉远时粒子不随视距同步缩小、显示为模糊斑块,核心是粒子系统的缩放逻辑和相机缩放逻辑不匹配,常见触发原因有三类:
- 粒子系统
Scaling Mode参数设置错误:默认值适配的是常规3D透视相机移动缩放场景,如果你是通过修改正交相机Size参数实现拉远,粒子不会自动响应视口尺寸变化,会以固定渲染尺寸显示在屏幕上,视口拉得越远粒子相对占比越大,就会形成糊块 - 粒子模拟空间配置错误:
Simulation Space设为World时,如果粒子物体的父层级缩放没有随相机视距同步,或者粒子节点位置/缩放被其他脚本锁死,就不会和场景普通物体保持一致的缩放表现 - 渲染配置异常:粒子Renderer模块开了固定像素尺寸选项、或者粒子Shader关闭了透视校正,也会导致粒子尺寸不随距离变化。
解决方案
基础参数修复(覆盖绝大多数场景)
选中异常的粒子特效预制体/场景物体,在Inspector面板打开Particle System主模块(面板最顶部的默认展开栏):
- 找到
Scaling Mode选项,按你使用的相机类型切换:- 透视相机(靠沿Z轴移动相机位置实现拉远拉近):直接选
Hierarchy,粒子会完全跟随层级缩放、透视视距比例同步变化,和场景内普通3D物体表现完全一致 - 正交相机(靠修改相机
Orthographic Size参数实现拉远拉近):先选Local模式,再给粒子物体挂载下面的同步脚本即可:
- 透视相机(靠沿Z轴移动相机位置实现拉远拉近):直接选
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; } }
- 检查
Simulation Space配置:如果选了World模式,确认粒子物体没有挂载锁定缩放/位置的脚本,且父节点缩放会随相机视距同步调整。
异常排查项
如果改完上面的参数还是有问题,逐项检查下面的配置:
- 打开Particle System的Renderer模块,把
Render Mode从Billboard临时切换为Mesh测试,如果切换后缩放正常,把Billboard模式下的Pixel Size锁定选项关闭,不要开固定屏幕尺寸渲染 - 检查粒子使用的材质,如果是自定义Shader,确认Shader中开启了透视坐标校正,不要写死屏幕空间的粒子尺寸输出
- 如果项目里用了后处理栈,临时关闭Bloom、模糊类后处理效果测试,排除粒子过曝+模糊后处理把正常尺寸粒子误渲染成大斑块的情况。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

