Skip to content Skip to sidebar Skip to footer

Calcolare le proprietà di una camera ortogonale di Unity affinché visualizzi sempre specifici oggetti in scena

Nell’uso di camera dinamiche di Unity, può essere necessario fare in modo che degli oggetti specifici in scena siano sempre visibili dalla camera che li sta visualizzando. Questo significa individuare le proprietà della camera rispetto agli oggetti stessi. Si tratta dunque di fare in modo che lo spazio occupato dagli oggetti sia sempre incluso nello spazio della camera.

Per far questo ci vengono in aiuto i Colliders i quali, se interrogati opportunamente, ci consento di conoscere le loro caratteristiche volumetriche correnti e dunque generare un volume che contenga tutti quelli che vogliamo includere e trovare le corrispondenti proprietà della camera ortogonale che li deve visualizzare. E’ una procedura abbastanza semplice in quanto la camera ortogonale è, per definizione, priva di alcune caratteristiche che aggiungerebbero complessità a questo calcolo.

Di seguito la funzione che permette di ottenere il valore di Position e Size delle camera ortogonale in oggetto, includendo anche la possibilità che tale calcolo venga fatto sugli assi XY oppure XZ (nel primo caso una visualizzazione ortogonale in profondità, nel secondo dall’alto). Da notare che la funzione ritorna un oggetto composto da 3 elementi.

public (Vector3 center, float size, Bounds bound) CalculateOrthoSize(List<Collider> colliders, float expandOffset = 1.0f, CalculateOrthoSizeType type = CalculateOrthoSizeType.XZ)
{
    var bounds = colliders[0].bounds;
    for(int i=1; i< colliders.Count; i++ ) { bounds.Encapsulate(colliders[i].bounds); }

    bounds.Expand(expandOffset);

    var vertical = bounds.size.y;
    if (type == CalculateOrthoSizeType.XZ) { vertical = bounds.size.z; }

    var horizontal = bounds.size.x * componentCamera.pixelHeight / componentCamera.pixelWidth;

    var size = Mathf.Max(horizontal, vertical) * 0.5f;
    var center = bounds.center;

    if (type == CalculateOrthoSizeType.XY) { center += new Vector3(0, 0, 10); }  
    else { center += new Vector3(0, 10, 0); } 

    return (center, size, bounds);
}

E’ possibile quindi utilizzare il risultato della funzione affinché imposti i parametri della camera corrente, nel modo seguente:

var result = this.CalculateOrthoSize(this.ListColliders, 1.0f);
componentCamera.orthographicSize = result.size;
transform.position = result.center;

Nell’immagine di copertina, presa dal gioco GGWG, è possibile notare come la camera ortogonale riprenda completamente le caselle dalla 4 alla 14.