40岁开始学习unity 2023-04-10 19:59 采纳率: 61.5%
浏览 16
已结题

unity瞄准镜缩放问题

找了个瞄准镜的图片,就是十字,然后直接拖到摄像机下,作为摄像机的子物体,距离在摄像机前,就当瞄准镜,问题是当改变fov时,十字瞄准线也在缩放,怎么能让十字不缩放,只缩放场景

  • 写回答

1条回答 默认 最新

  • CQ.abc 2023-04-10 22:02
    关注

    以下回答结合了ChatGPT:
    你可以将瞄准镜的图片放在一个Canvas对象中,将Canvas对象的Render Mode设置为Screen Space - Overlay,这样可以将瞄准镜放在场景上方而不会被缩放。同时,在Canvas的RectTransform组件中设置好瞄准镜的位置和大小。

    然后,你可以将摄像机的fov值保存到一个变量中,并在代码中动态改变摄像机的fov值,而不是直接改变摄像机的fov属性。这样可以避免瞄准镜被缩放。

    下面是一个简单的示例代码:

    public class CameraController : MonoBehaviour
    {
        public float zoomSpeed = 10.0f;
        public float maxFov = 60.0f;
        public float minFov = 20.0f;
     
        private float currentFov;
        private Canvas crosshairCanvas;
     
        void Start()
        {
            // 获取Canvas对象
            crosshairCanvas = transform.Find("CrosshairCanvas").GetComponent<Canvas>();
     
            // 获取初始的fov值
            currentFov = GetComponent<Camera>().fieldOfView;
        }
     
        void Update()
        {
            // 缩放场景
            float zoomDelta = Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
            currentFov -= zoomDelta;
            currentFov = Mathf.Clamp(currentFov, minFov, maxFov);
            GetComponent<Camera>().fieldOfView = currentFov;
     
            // 缩放瞄准镜
            crosshairCanvas.scaleFactor = 1 / GetComponent<Camera>().orthographicSize;
        }
    }
    

    这里使用了orthographicSize属性,因为Canvas对象在Screen Space - Overlay模式下使用的是正交投影,而不是透视投影。如果你的瞄准镜是在透视模式下使用的,你可以使用camera.aspect属性来计算瞄准镜的大小。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月20日
  • 已采纳回答 4月12日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分