unity瞄准镜缩放问题

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

以下回答结合了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属性来计算瞄准镜的大小。