找了个瞄准镜的图片,就是十字,然后直接拖到摄像机下,作为摄像机的子物体,距离在摄像机前,就当瞄准镜,问题是当改变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属性来计算瞄准镜的大小。