Unity相机范围适应物体大小

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.orthograpicSizeCamera.fieldOfView是如何计算的,具有什么意义。所以没办法直接计算出合适的值,只能通过相对关系做放大和缩小。还是有那么一点不直观。

原文地址:https://www.cnblogs.com/napoleon0/p/14502180.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...