0
\$\begingroup\$

i'll try to explain what i have... my "field" camera with this script (used to keep the aspetct)

using UnityEngine;

[RequireComponent(typeof(Camera))] public class CameraCrop : MonoBehaviour {

// Set this to your target aspect ratio, eg. (16, 9) or (4, 3).
public Vector2 targetAspect = new Vector2(16, 9);
Camera _camera;

void Start () {
    _camera = GetComponent<Camera>();
    UpdateCrop();
}

// Call this method if your window size or target aspect change.
public void UpdateCrop() {
    // Determine ratios of screen/window & target, respectively.
    float screenRatio = Screen.width / (float)Screen.height;
    float targetRatio = targetAspect.x / targetAspect.y;

    if(Mathf.Approximately(screenRatio, targetRatio)) {
        // Screen or window is the target aspect ratio: use the whole area.
        _camera.rect = new Rect(0, 0, 1, 1);
    }
    else if(screenRatio > targetRatio) {
        // Screen or window is wider than the target: pillarbox.
        float normalizedWidth = targetRatio / screenRatio;
        float barThickness = (1f - normalizedWidth)/2f;
        _camera.rect = new Rect(barThickness, 0, normalizedWidth, 1);
    }
    else {
        // Screen or window is narrower than the target: letterbox.
        float normalizedHeight = screenRatio / targetRatio;
        float barThickness = (1f - normalizedHeight) / 2f;
        _camera.rect = new Rect(0, barThickness, 1, normalizedHeight);
    }
}

}

and one more camera inside my canvas used to who 3d character on UI and a background image ( used to show a screenshot got from the field camera) so what i have on my ui is 3d model with a background spriterenderer with a screenshot texture got from "field" camera ( using rendertexture )

on cap1 is what i have on my "field" camera then i take a screenshot and on cap2 is what i have after i get a screenshot with the rendertexture then convert it to a texture2d and create a new sprite from that texture ( to a sprite render inside the canvas camera)

so as you can see the screenshot doesn't fit the entire screen, without the above script it does fit perfectly.

this is what i do to resize it

    void ResizeSpriteToScreen()
{
    SpriteRenderer sr = sprite.GetComponent<SpriteRenderer>();

    sprite.transform.position = _myCamera.transform.position + Vector3.forward * sr.transform.position.z;

    sprite.transform.localScale = new Vector3(1, 1, 1);
    Vector3 lossyScale = sprite.transform.lossyScale;

    float width = sr.sprite.bounds.size.x;
    float height = sr.sprite.bounds.size.y;

    float worldScreenHeight = _myCamera.orthographicSize * 2f;
    float worldScreenWidth = worldScreenHeight / Screen.height * Screen.width;

    Vector3 xWidth = sprite.transform.localScale;
    xWidth.x = worldScreenWidth / width;
    sprite.transform.localScale = xWidth;
    //transform.localScale.x = worldScreenWidth / width;
    Vector3 yHeight = sprite.transform.localScale;
    yHeight.y = worldScreenHeight / height;
    sprite.transform.localScale = yHeight;

    Vector3 newLocalScale = new Vector3(transform.localScale.x / lossyScale.x,
        sprite.transform.localScale.y / lossyScale.y,
        sprite.transform.localScale.z / lossyScale.z
    );

    sprite.transform.localScale = newLocalScale;
}

cap1 cap2

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.