Here is a script that should apply the right compensating scale to keep your sprite at 1 image texel : 1 screen pixel at your target resolution.
I'd recommend using a sprite material with "Pixel Snap" enabled when running at exactly that target resolution, to nudge the sprite onto the pixel grid and avoid unnecessary blending between pixels.
using UnityEngine; public class ScaledBillboard : MonoBehaviour { [Tooltip("Vertical screen resolution where this sprite should render 1:1")] public int targetResolution = 1080; [Tooltip("Camera this should project through - defaults to Camera.main")] new public Camera camera; void OnValidate() => ScaleAndBillboard(); void Start() => ScaleAndBillboard(); // If you change the camera angle / position dynamically, you may // want to call this in Update() too, or in a coroutine for the duration // of the movement. void ScaleAndBillboard() { if (!TryGetComponent(out SpriteRenderer renderer)) { Debug.LogError("Must attach to an object with a SpriteRenderer."); return; } if (camera == null) { camera = Camera.main; } //Billboard to align with view direction. var view = camera.transform.forward; transform.rotation = Quaternion.LookRotation(view); // Height in world "meters" that the camera is able to see // at the SpriteRenderer's depth. float worldUnitsSeen; if (camera.orthographic) { worldUnitsSeen = camera.orthographicSize * 2; } else { // Distance in front of the camera. float depth = Vector3.Dot(transform.position - camera.transform.position, view); // How tall the camera's view of the world is at this depth. worldUnitsSeen = depth * 2 * Mathf.Tan(camera.fieldOfView * Mathf.Deg2Rad/2); } // What PPU would make this render 1:1 at our target screen resolution? float desiredPPU = targetResolution / worldUnitsSeen; // Apply a compensating scale. float scale = renderer.sprite.pixelsPerUnit / desiredPPU; transform.localScale = new Vector3(scale, scale, scale); } }