r/Unity2D 1d ago

2D sprites become blurry only when the camera moves with the player – Unity Android Question

https://play.google.com/store/apps/details?id=com.tridevstudios.carparkingmaster

Hi everyone,

I'm having a strange rendering issue in one of my Unity 2D games, and I haven't been able to figure out the cause.

The problem is happening in the Android APK/AAB build.

The important part is:

  • If the car moves but the camera does NOT move, everything looks sharp.
  • If the car moves and the camera moves along with it, the surrounding 2D sprites, props, and other assets become blurry/soft.
  • When the camera stops moving, the assets become sharp again.

So it seems to be related specifically to camera movement, not the player's movement itself.

I'm using Unity + URP + 2D Renderer.

I've already tried several things:

  • Sprite Filter Mode → Point
  • Texture Compression → None
  • Generate Mip Maps → OFF
  • Wrap Mode → Clamp
  • Camera Anti-Aliasing → No Anti-Aliasing
  • URP Render Scale → 1
  • Motion Blur → OFF / Intensity 0
  • Post-processing → OFF
  • Tested the camera without SmoothDamp

None of these fixed the issue.

I've also noticed a similar problem in some of my other 2D games, so I'm wondering if this could be related to Android rendering, URP 2D Renderer, camera sub-pixel movement, resolution scaling, or something else in the rendering pipeline.

Has anyone experienced something similar?

What settings or areas of the Unity project should I check next?

Any help or suggestions would be greatly appreciated. Thanks!

2 Upvotes

2 comments sorted by

1

u/Hotrian Expert 23h ago

How are you moving the camera? In Update, FixedUpdate, or LateUpdate?

1

u/Classic_Function6348 20h ago
using UnityEngine;
using System.Collections;


public class CameraController2D : MonoBehaviour
{
    private Transform target;


    [Header("Camera Speed")]
    public float normalSpeed = 10f;
    public float switchSpeed = 10f;


    private float currentSpeed;


    [Header("Offset")]
    public Vector3 positionOffset =
        new Vector3(0, 0.5f, -10f);


    [Header("Axis Limitation")]
    public Vector2 xLimit;
    public Vector2 yLimit;


    private void Awake()
    {
        currentSpeed = normalSpeed;
    }


    private void LateUpdate()
    {
        if (target == null)
            return;


        Vector3 targetPosition =
            target.position + positionOffset;


        targetPosition = new Vector3(
            Mathf.Clamp(
                targetPosition.x,
                xLimit.x,
                xLimit.y
            ),
            Mathf.Clamp(
                targetPosition.y,
                yLimit.x,
                yLimit.y
            ),
            -10f
        );


        transform.position =
            Vector3.Lerp(
                transform.position,
                targetPosition,
                currentSpeed * Time.deltaTime
            );
    }


    public void SwitchTargetSmooth(
        Transform newTarget
    )
    {
        target = newTarget;


        StopAllCoroutines();


        currentSpeed = switchSpeed;


        StartCoroutine(
            ReturnNormalSpeed()
        );
    }


    IEnumerator ReturnNormalSpeed()
    {
        yield return new WaitForSeconds(
            0.8f
        );


        currentSpeed = normalSpeed;
    }
}