Unity相機范圍適應物體大小
情形
相機是游戲向玩家展示的主要手段。大部分時候,相機的位置和范圍可以提前設定,在游戲中不會做變化。但有些時候,我們希望相機在游戲當中能夠調整位置和范圍,以顯示某一物體。
具體一點,說一下我遇到的情況。我希望顯示的物體是一個由玩家自定義自己制造的飛船。這個飛船可大可小,在玩家把它做出來之前,游戲是無法確定它的大小的。自然地,用來跟隨飛船的攝像機也無法確定位置和范圍。我希望在玩家制作完畢飛船之后,能夠使相機適應飛船的尺寸,在屏幕中合適的顯示出飛船的全部。
方法
下面提供我的解決方法。我的解決方法假設相機正對需要適應顯示的物體的中心。如果不是這樣,需要對代碼做一些小改動,但總體做法是適用的。
public class CameraManager:MonoBehaviour
{
// 對攝像機的引用,可以在面板中設置,也可以在初始化時獲取。
public Camera cam;
// 需要顯示的物體的中心位置。
public Transform root;
// 物體的半徑。即物體里中心最遠的地方到中心的距離。
public float radius;
// 一些參數,在面板中調試。
// 兩個參數增大都會使屏幕中物體變小。
// 半徑和相機范圍的關系參數
public float radiusToSizeFactor=2;
// 半徑和相機距離的關系參數
public float radiusToDistanceFactor=2;
// 傳入物體的中心位置和物體半徑。
public void PrepareCamera(Transform center, float r)
{
// 根據參數設置相機到物體的距離。
cam.transform.localPosition = new Vector3(0, 0, -radiusToDistanceFactor * radius);
// 如果需要顯示的物體不是正對相機中心,修改這個向量的初值。
Vector3 worldPos = new Vector3(0, radius, 0);
// 把向量轉換到世界坐標系,因為相機的接口只接受世界坐標
worldPos = root.TransformPoint(worldPos);
// 獲得點在相機屏幕中的相對位置,如正好在屏幕左下角的點返回(0, 0, z),正好在右上角的點返回(1, 1, z)。z為物體離相機的深度距離,在這里沒有用處。
Vector3 viewPos = cam.WorldToViewportPoint(worldPos);
// 根據參數調整相機范圍。這里我用的是正交相機,如果使用透視相機,這里應該修改fieldOfView。
// 如果參數為2,則物體最多占到屏幕的1/2高度。
cam.orthographicSize *= radiusToSizeFactor * viewPos.y;
}
}
結語
Unity並沒有給出他所用的Camera.orthograpicSize
和Camera.fieldOfView
是如何計算的,具有什么意義。所以沒辦法直接計算出合適的值,只能通過相對關系做放大和縮小。還是有那么一點不直觀。