在使用Unity的时候经常发现一个问题,在Scene窗口下,如果对物体视角拉的太近,容易出现画面消失或者变形的情况, 这种问题有一个很实用的解决方法,如果想看哪个物体,就在Hierarchy中选中该物体,然后按一下F键,再用鼠标滚轮拉近就可以了,拉近后的物体不会再消失或变形了。
具体操作我们清楚了,这个原理我们可能还不清楚,为什么会这样,是因为Scene场景下的nearClipPlane
值的原因,我们可以尝试在Editor界面打印出Scene场景下camera的nearClipPlane
,具体方法如下:
在Hierarchy下建立一个空物体,挂载如下脚本。
using UnityEngine;
using UnityEditor;
[ExecuteInEditMode] // 使脚本在编辑器界面下运行
public class Test : MonoBehaviour
{
private void OnEnable()
{
SceneView.onSceneGUIDelegate += OnSceneGUI; // 挂载回调函数
}
private void OnDisable()
{
SceneView.onSceneGUIDelegate -= OnSceneGUI;
}
void OnSceneGUI(SceneView view)
{
Debug.Log(view.camera.nearClipPlane); // 打印出Scene视角下Camera的平截头体的ZNear值
}
}
然后我们再在Scene视角下移动Camera,当滚动鼠标滚轮,拉远距离时,发现ZNear值在不断增大,反方向转动滚轮,ZNear值会对应减小。
这意味着,如果我们再加上鼠标右键对场景进行旋转,胡乱转动鼠标,最后的ZNear值可能就会很大了,如下图所示:
这样我们就很容易在Scene视角下丢失物体,因为ZNear值太大,物体被Camera裁剪掉了。
而如果我们按F键,相机会拉到一个距离,而且会纠正摄像机的ZNear值,这个时候继续放大,能把ZNear放到很小,如下图所示,ZNear随鼠标滚轮变得很小:
注意,这里的Camera的属性值好像是不能调整的,我尝试在这里直接更改camera的ZNear值,但是并不成功。
另外总结一下几种Scene场景下移动视角与Camera的ZNear的关系:
- 直接转动滚轮,会增/减 ZNear值
- 鼠标中键和鼠标右键不会改变ZNear值
- 如果想拉近摄像头,但是不想改变ZNear值,可以按住鼠标右键不放,再按“WASD”移动相机位置