Unity相机范围适应物体大小

Unity相机范围适应物体大小

情形

相机是游戏向玩家展现的主要手段。大部分时候,相机的位置和范围能够提早设定,在游戏中不会作变化。但有些时候,咱们但愿相机在游戏当中可以调整位置和范围,以显示某一物体。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.orthograpicSizeCamera.fieldOfView是如何计算的,具备什么意义。因此没办法直接计算出合适的值,只能经过相对关系作放大和缩小。仍是有那么一点不直观。code

相关文章
相关标签/搜索