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 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题