📅  最后修改于: 2023-12-03 15:14:05.671000             🧑  作者: Mango
camera.main.ScreenPointToRay
方法介绍camera.main.ScreenPointToRay
方法是Unity中Camera
类提供的一个实用方法之一,它可以将屏幕上的一点转换为从相机发射的光线。
camera.main.ScreenPointToRay
共有一个参数:
Vector3
类型的position
参数表示屏幕上的一个点。Unity会将此点转换为世界坐标系的一个位置。 camera.main.ScreenPointToRay
返回一个Ray
对象,该对象包含了系统从屏幕点发射的光线的相关信息。
//获取主相机
Camera mainCamera = Camera.main;
//在场景中找到某个GameObject
GameObject targetObject = GameObject.Find("Target");
//先获取鼠标在屏幕上的坐标
Vector3 inputPosition = Input.mousePosition;
//将该坐标转换为世界坐标系中某一点的位置
Vector3 worldPosition = mainCamera.ScreenToWorldPoint(inputPosition);
//获取相机发射出的光线
Ray ray = mainCamera.ScreenPointToRay(inputPosition);
//使用Raycast方法判断该光线是否与目标物体相交
if (Physics.Raycast(ray, out RaycastHit hit))
{
//如果相交,说明该光线击中了目标物体
if (hit.collider.gameObject == targetObject)
{
Debug.Log("目标物体被选中了!");
}
}
camera.main.ScreenPointToRay
只适用于透视相机和正交相机,不适用于任何其他类型的相机,例如球体(Skybox
)相机。Vector3
类型的position
参数表示在屏幕上的一个点(屏幕左下角为(0,0,0)
,右上角为(Screen.Width, Screen.Height, 0)
),然而这个点并不一定位于相机的视锥体内。对于不在视锥体内的点,camera.main.ScreenPointToRay
方法也会返回一个Ray
对象,但是该对象的方向信息有可能无效,因为它不遵守任何物理规律。Camera.main
方法获取相机实例时,我们应该尽量避免在性能敏感的情况下频繁调用该方法,因为每一次调用都会在Unity场景中搜寻一次相机实例,这会对程序的性能造成一定的负担。我们应该尽量在启动阶段或代码运行的早期获取相机实例,然后存储在一个变量中供全局使用。camera.main.ScreenPointToRay
方法总结camera.main.ScreenPointToRay
方法是一个很便利的工具,它可以帮助我们快速获取相交信息,并且和其他Unity的射线投射方案,如Physics.Raycast
和Physics.RaycastAll
可以结合起来形成更强大的射线投射系统。通过掌握这个方法,我们可以在游戏或应用程序中迅速实现基于用户点击或鼠标悬浮的触发响应。