相機是遊戲向玩家展現的主要手段。大部分時候,相機的位置和範圍能夠提早設定,在遊戲中不會作變化。但有些時候,咱們但願相機在遊戲當中可以調整位置和範圍,以顯示某一物體。c#
具體一點,說一下我遇到的狀況。我但願顯示的物體是一個由玩家自定義本身製造的飛船。這個飛船可大可小,在玩家把它作出來以前,遊戲是沒法肯定它的大小的。天然地,用來跟隨飛船的攝像機也沒法肯定位置和範圍。我但願在玩家制做完畢飛船以後,可以使相機適應飛船的尺寸,在屏幕中合適的顯示出飛船的所有。api
下面提供個人解決方法。個人解決方法假設相機正對須要適應顯示的物體的中心。若是不是這樣,須要對代碼作一些小改動,但整體作法是適用的。調試
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
是如何計算的,具備什麼意義。因此沒辦法直接計算出合適的值,只能經過相對關係作放大和縮小。仍是有那麼一點不直觀。code