using UnityEngine; namespace BaseGames.Camera { /// /// 精灵像素对齐组件。 /// /// 挂载在含 的 GameObject 上(可与 Rigidbody2D 同节点)。 /// 每渲染帧在 LateUpdate(+1000,与 同执行序)中, /// 将 transform.position 四舍五入到最近像素网格,消除精灵移动时的亚像素模糊。 /// /// /// 与 搭配使用时,须保持 _pixelsPerUnit /// 与相机侧一致,使精灵和相机吸附到同一像素格,从而消除二者相对偏移造成的抖动。 /// /// /// Rigidbody2D 内部物理位置(rb.position)不受影响; /// 仅 transform.position(用于渲染)被修正,最大偏差 ±0.5 / PPU。 /// 子节点(HurtBox、GroundCheck 等)随父节点微小平移,但偏差在物理容差范围内, /// 不影响碰撞检测精度。 /// /// [DefaultExecutionOrder(1000)] [AddComponentMenu("BaseGames/Camera/Sprite Pixel Snapper")] public class SpritePixelSnapper : MonoBehaviour { [Tooltip("每世界单位像素数(PPU)。须与 CameraPixelSnapper 及精灵导入设置保持一致。\n" + "常用值:16(粗像素风格)、32(标准像素风格)。0 = 禁用对齐。")] [Min(0f)] [SerializeField] private float _pixelsPerUnit = 16f; private void LateUpdate() { if (_pixelsPerUnit <= 0f) return; float ppu = _pixelsPerUnit; Vector3 pos = transform.position; pos.x = Mathf.Round(pos.x * ppu) / ppu; pos.y = Mathf.Round(pos.y * ppu) / ppu; // Z 轴不参与像素对齐 transform.position = pos; } } }